• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Champions of Azeroth (v1.4)

8/9/2020 update - as part of the open source tag launch, the unoptimized version of the map has been attached with the title Champions of Azeroth (v1.4) - Source

Champions of Azeroth

A fast-paced MOBA featuring classic Warcraft III units as themed heroes in a struggle between the Horde and the Alliance. Level as a team, acquire items unique to your hero, and complete objectives as you fight to destroy the enemy base.

Features Overview:

New to the Map?

Run the optional -tutorial command to initiate a short introduction to the basics.

Fully Unique Hero Roster

Almost every ability is trigger-driven and designed with a particular 'hook' in mind to fulfill each hero's fantasy. Become an agent of destruction who summons hordes of demons as the Eredar Warlock, or turn enemies into lightning rods and zap them with deadly combos as the Shaman.

17 Unique Items Per Hero

Ponder your strategy and build your character throughout the match with a personalized hero shop, earning 100 gold every 2 team levels. Each item acquired alters abilities and mechanics specific to your hero (plus, they are more than just a stat boost). At level 14, choose from 1 of 6 elite items which grant you more powerful benefits than the standard catalog. Careful, once you spend your precious gold on an item there is no going back.

Choose from 2 Ultimates

You aren't restricted to a single ultimate choice. Choose from two powerful abilities designed with specific strategies in mind when you reach level 10 as a team.

Map Objectives

Duke it out in the Duel of Champions as two faction heroes channel powerful magic near the center of the battlefield. The first team to defeat the enemy's champion recruits theirs to push each lane.

Shared Team Leveling

Inspired by HotS, you progress through hero levels as a team with globally-shared experience. Complete objectives, defeat enemy minions, and venture into the forest to defeat encampments to earn experience for your faction.

Mobility First

Terrain navigation is designed with mobility as a prime component. Spend less time idly walking from point A to point B and get back into the action faster using your Scroll of Town Portal (T) and by traveling to specific lanes with your faction's Flight Master (located near your starting location).

Capture Enemy Bases

Progress through each lane by capturing enemy bases and converting them into outposts for your team and extending the reach of your Flight Masters.

Conquer Forest Camps

Head into your faction's forest at night (or invade the enemy's) to do battle with forest creatures of varying power. Defeating a forest creature adds it to your wave of Siege Units (which occurs every 3rd minion wave), bolstering your forces as you push the top and bottom lane. It is said that some of the more prominent creatures offer enhancement buffs to the hero that defeats them.

Role-Based Archetypes

Choose to deal damage, soak damage, heal damage, or push lanes as you take advantage of the Mage, Eliminator, Builder, or Warrior.

Custom UI

Features a custom, minimalist UI that gives you more visibility over the battlefield. View the downloadable demo here.

Practice vs. AI

Load up rudimentary agents with the -ai command to get a feel for the map and experiment with hero builds. Be warned, they aren't perfect!

Mode Support

Some basic modes have been added to alter the game flow, which can be enabled by the host (P1). Disable flight paths with the -nfp command to greatly limit the mobility of heroes, or increase experience gain with the -fm command to make for a faster match. Allow all faction heroes to be chosen by either team with the -uf command.

Disclaimer: This map was made to work with either SD or HD, though no guarantee can be made as to its performance in Reforged. Please let me know if you run into any HD artifacts.

Have suggestions or bug reports? Feel free to leave a comment on this map resource.

Bribe - Unit Indexer (Lua), Global Initialization (Lua), Damage System v5 (Lua), Timer Utils (Lua)
Maker - Arcing Text Tag v1.0.0.3 (Lua)
G00dG4m3 - Heroic Leap (GUI Inspiration)
Mythic - Nether Blast, Conflagration, Ember, Nether Missile, Pillar of Flame, Athelas, Firebrand Shot Green, Blink, Psionic Shot, Soul Armor
MiniMage - Fish, Dead Fish
Health Bars v1.30 - Avatars Lord
HealingSprayMissile by Mc !
LightningStrikeLarge by Callahan
Ancient Explosion SFX by WILL THE ALMIGHTY
Hero Glow by assasin_lord
EnergyBurst by ugougo
8 Bars by Avatars Lord
Small update with a few tooltip corrections and some bug squashing. A.I. are now a bit more aggressive during objectives and when engaging in combat. F1/F2/F3 UI hotkeys for hero shops and your hero have been standardized. Added some main base decorations.
Small update that standardizes the minimap between SD and HD (replaces the gross green version in SD). Added minimap preview.
Moderate update. Several tooltip grammar corrections. Grunt's Bloodletting and Gargoyle's Gargoyle Blade nerfed. Visual effects update to Tauren's Spirit Stampede. Doltish AI improvements: agents will no longer suicide into objectives when center lane is not under control, agents will no longer get stuck in a single state when affected by movement. Healing fountains at bases felt awkward and not beneficial enough (since flight path healing is so quick), so they have been removed. Several other visual bug fixes and item effect corrections.
Hero patch. Added Druid of the Claw, Furbolg, and Spirit Walker. Some bug fixes. Leaderboard text prettified. Siege Units nerfed in health and damage. Default experience gain now ~15-20% faster. All base structures and towers have had a health reduction. Objective units can no longer be affected by knockback. Various tooltip fixes.
Hotfix for Eredar Warlock's Orb (Q) creating a duplicate without the proper item. Some visual fixes to forest creature animations.
(Lethality Pass) The flow of the map has been significantly altered:
Minions deal 25% less damage and have ~30% reduced health.
Minion waves now spawn 5 sec faster.
Structures have ~15% reduced health and their armor has been halved or removed.
Towers deal ~20% less damage.
Objective units are more susceptible to damage (now have medium armor and ~10% less health).
Siege Units no longer have armor, have ~30% less health, and gain slightly less bonus stats from destroyed bases.
Heroes start out with 100 less health.
Forest Creature Enhancement Buffs now last 3 minutes (was 2).
These accumulated changes result in a significant reduction of average game length while making your abilities feel more substantial. The pace of the map is much quicker and time to react is now more important.
A few balance changes and more animation fixes.
Hotfix. A few overlooked issues were introduced with v1.1b for the Alliance objective hero including the wrong attack type; fixed. Additionally, one missed lethality update corrected: default player revive timer is now 5 seconds faster.
Small update. New players have been confused about the basic map mechanics. To address this, there is now a "-tutorial" command that runs a short cinematic which introduces the map.
Forest camp icons are now attached to units and disappear when captured.
Received feedback that objectives were overtuned; bases now have an attack which specifically targets objective units to reduce their effective lifespan when not being escorted by allies.
A few odd terrain issues were fixed, including wall caps to Alliance bases.
Acolyte can no longer use W on Shades.
Captured outposts reworked: they are now much weaker with high health regeneration, allowing for faster flips when being pushed.
Minion waves in the top and bottom lanes will now enter a staggered formation far less often.
Hotfix. A few overlooked issues were introduced with v1.1b for the Alliance objective hero including the wrong attack type; fixed. Additionally, one missed lethality update corrected: default player revive timer is now 5 seconds faster.
Hero update. New hero: Headhunter (Horde).
Fixed the bug that caused the victory cinematic sequence to pause.
Grunt's Bloodthirst CD reset and Shaman's Bloodlust CD reduction item have been fixed.
1.2 extension: Hero update. New hero: Rifleman (Alliance).
Major optimization: bug fixed with spell dummies (1 typo let them all leak!).
Added 2 additional tips to the tutorial.
Fast Start (-fs) now also begins minion waves immediately.
Headhunter starting stats corrected.
Hotfix. Fixed a regression. Knockbacks should now work properly.
Beta concluded. New hero: Forest Troll Warlord. Custom UI implemented. New shop: Library of Heroes (unlocks at level 16): earn gold past level 14 and invest in attribute powerups. A few buffs to items that were mostly useless, namely Chipped Skull (Acolyte) and Boomerang Sling (Rifleman). Acolyte's Unholy Transformation has a new special effect so it's more noticeable. Tuskarr Ice Wall duration fixed. Forest Camp overhaul: forest creatures are only present at night and respawn once per day when game time reaches 18:00. Refactored a few systems to prevent periodic timer desync bug.
- Leaderboard and MVP screen added (shows at game conclusion).
- Forest Troll Warlord had some of his clunkiness addressed: melee is now a bigger focus and activates permanently for 12 sec when Rending Axe (Q) charges are expended. His mana is now capped at 100 and is used to activate Taz'dingo (W) after building up mana with Q. Other abilities and items have been altered to match this flow. He starts off mediocre and ramps up nicely past level 10, similar to a carry in other MOBAs.
- Various ability and item tooltip corrections.
- Overlord's Trait refactored, better effect response and will no longer override main attack to spell damage.
- Tank archetype tag removed and replaced with Warrior to simplify class system; previous Tanks now have "Damage Soaker" as a playstyle tag instead.
Previews
Contents

Champions of Azeroth (v1.4) (Map)

Champions of Azeroth (v1.4) - Source (Map)

Reviews
Shar Dundred
Alright, did some checking, everything appears to be in order. In which case: Approved!
Level 12
Joined
Jan 30, 2020
Messages
875
I have tried the map solo, just to see what it was on about.

I am not here to make a review as this is a map that requires teamplay (and opponents). But I can say this :

The map is incredibly polished and well made. The few aspects of the map I have had the pleasure to test are just amazing.

The hero only gains gold with levels, and not every level. (I have not tested objectives). With this gold, you can purchase items that will in fact boost your hero abilities.


To be honest it felt really slow paced, but I can imagine this in the perspective of a full multiplayer game.
Heroes progress slowly but with regularity if you remain active to gain experience. No hero becoming stupidly strong just by following a few basic tricks, like in the good (bad) old Aeon Of Strife times.

I have the feeling the map is incredibly well thought and balanced (I was alone, and yet I could not clearly see the spawned units from one side gaining a clear advantage on the other side, after more than an hour.


@Planetary : this is a great job, also I have not found any detail left out or any glitch, although I have not been able to test that much.

As a perfectionist, I really can appreciate the impressive work.


I hope I will have time to test it more deeply, and in multiplayer context. I plan to give it a try as soon as my own map will give me time to breathe.
 
Level 14
Joined
Feb 7, 2020
Messages
386

04-30-20: Patch Day! v1.1

New Heroes
Three new heroes join the roster, each complete with 17 unique items that alter their abilities and two ultimates to choose from.

Ungarl, the Furbolg (Warrior)
Unleash deadly spirits with your your abilities as the Furbolg, commanding them to attack specific targets with Spirit Bash (Q) while enhancing your auto attacks with Frenzied Roar (W) and Frenzy (Trait). Choose from an ultimate which generates more spirits over time with rapid attacks or an ultimate which offers most of its power up front in exchange for a burst of spirits.

Oben Rageclaw, the Druid of the Claw (Support)
A shapeshifter who enters Bear Form (Trait) to gain access to new abilities, juggling between damage and healing over time effects after thrashing about to generate mana. Choose from an ultimate which enhances your shapeshifting fervor or an ultimate which rescues a low health target from certain death.

Bovan Windtotem, the Spirit Walker (Support)
Take command of ancestral energy as the Spirit Walker, linking ally health pools with Spirit Mend (Q) while creating absorption effects with Vitality Shield (W). If enemies dare wander too close, send forth an ancestral spirit to lock them down with Corporeal Binding (E). Choose from an ultimate which heals allies in a huge radius or an ultimate which knocks back enemies, punishing them further if they collide with terrain.

--

05-08-20: Patch Day! v1.2

New Hero
The Headhunter (Horde) joins the roster, complete with 17 unique items that alter his abilities.

Jabra'kan, the Headhunter (Eliminator)
Toss javelins a great distance and be rewarded when they strike targets who are far away or low on health. Use Troll Regeneration (W) to recuperate when there are no nearby enemies, and place deadly traps with Jungle Trap (W) to root and reveal enemies when triggered. Embark on a variety of focus areas with your item catalog, boosting the lethality of your skill-shot (Q), enhancing your defensive recovery (W), empowering your traps (E), or imbuing your successive auto attacks with bonus effects.

--

05-10-20: v1.2 Extension (1.2a)

New Hero
The Rifleman (Alliance) joins the roster, complete with 17 unique items that alter his abilities. The hero process has slowed down to allow for more awesome ability and item effects as new systems get added and reworked. The result is a hero that is pretty awesome.

Wheeler, the Rifleman (Eliminator)
Unleash pyrotechnic madness as the Rifleman, featuring charged abilities that refresh together when their cooldowns complete. Launch projectiles with Shrapnel Shot (Q) and ignite them Fire Bomb (W) to create more fiery havoc. Choose from two ultimate abilities that vary greatly based your chosen strategy: unleash a Dragonfire Missile which travels the entire battlefield and deals significant damage, or call down a Gnomish Airstrike to unleash a path of Fire Bombs on your enemies.
 
Last edited:
Level 12
Joined
Jan 30, 2020
Messages
875
Man, you're just as workaholic as me !

I will need to tale a break some time to try you map again.
I also noticed your preloading is working quite efficiently, while mine was a bit of a failure.
I tried placing all units and heroes (with max level) at Map Init (mine is replacing InitBlizzard) with max skill levels and all activated abilities, plus a dummy unit for every SFX I added to the game, and I still get these lag spikes when I first select / use these units. Then I remove them after 1s of game time elapsed.

I suppose you did an extensive preloading with timers to give the engine time to "digest" the files. I also bet you have preloaded every single model / sound / texture that your map uses, because I realize my method might miss many original models and textures that won't be accessed directly with the units without using the abilities actively.

I guess that was my mistake, what do you think ?

In the meantime, keep up the good work, quality maps polished that way are a real blessing !

Will be happy to give you extra feedback when I try it more extensively.

Take care.
 
Level 14
Joined
Feb 7, 2020
Messages
386
Man, you're just as workaholic as me !

I will need to tale a break some time to try you map again.
I also noticed your preloading is working quite efficiently, while mine was a bit of a failure.
I tried placing all units and heroes (with max level) at Map Init (mine is replacing InitBlizzard) with max skill levels and all activated abilities, plus a dummy unit for every SFX I added to the game, and I still get these lag spikes when I first select / use these units. Then I remove them after 1s of game time elapsed.

I suppose you did an extensive preloading with timers to give the engine time to "digest" the files. I also bet you have preloaded every single model / sound / texture that your map uses, because I realize my method might miss many original models and textures that won't be accessed directly with the units without using the abilities actively.

I guess that was my mistake, what do you think ?

In the meantime, keep up the good work, quality maps polished that way are a real blessing !

Will be happy to give you extra feedback when I try it more extensively.

Take care.
:)

Didn't expect my preloader to get the compliments.

This is the code if it interests you, it doesn't do anything fancy and I'm uncertain if it's the best way to do it because I wrote it blind to any knowledge related to preload. You are correct, though, I definitely mash anything and everything I use into it (thus its official name: "lazy preloader"). It's really lazy considering I gave up on the loading bar math and opted for a static character map. Proceed with caution, I suppose :cool:2.

I personally still run into some delays for loading command bars with icons not yet seen and with certain special effects, especially if they are made well after map init (such as the items in the item shops). However, it did manage to remove all of the frame skips from loading in spell dummies with abilities and unit types, most effects, etc. So, at least part of its job is working. I'm glad you mentioned ability levels as that part I completely forgot and left out; gotta find time to add those in.

Lastly, and most surprising to me, the fast timer hasn't caused desync issues yet. I've been thinking about seeing if an even faster timer is possible since load times are annoying. We shouldn't technically be limited to the JASS .03 sec rule (maybe someone can swoop in and clarify that).

Lua:
function RunDataPreloader()

    -- create temporary units to give visibility (remove revealed units from fog of war)
    LUA_PRELOAD_VISIBILITY1 = CreateUnit(Player(12),FourCC('o01A'),0.0,0.0,0.0)
    LUA_PRELOAD_VISIBILITY2 = CreateUnit(Player(13),FourCC('o01A'),0.0,0.0,0.0) 

    -- temp unit to add abils to
    LUA_PRELOAD_TEMPUNIT = CreateUnit(Player(14),FourCC('e004'),0.0,0.0,0.0)

    LUA_PRELOAD_OBJECTS = #LUA_PRELOAD_ABILCODES + #LUA_PRELOAD_UNITCODES + #LUA_PRELOAD_EFFECTSTRINGS
    LUA_PRELOAD_OBJECTS_LOADED = 0
    LUA_PRELOAD_OBJECTS_PROGRESS = {}

    LUA_PRELOAD_TXT_LOAD = ''
    LUA_PRELOAD_TXT_BAR_COMPLETE = ''
    LUA_PRELOAD_TXT_PROGRESS = ''
    LUA_PRELOAD_TXT_COLOR = '|cff37ff37'

    LUA_PRELOAD_TXT_BAR_MAP = {
        [1] = '••',
        [2] = '•••',
        [3] = '••••',
        [4] = '•••••',
        [5] = '••••••',
        [6] = '•••••••',
        [7] = '••••••••',
        [8] = '•••••••••',
        [9] = '••••••••••',
        [10] = '•••••••••••',
        [11] = '••••••••••••',
        [12] = '•••••••••••••',
        [13] = '••••••••••••••',
        [14] = '•••••••••••••••',
        [15] = '••••••••••••••••',
        [16] = '•••••••••••••••••',
        [17] = '••••••••••••••••••',
        [18] = '•••••••••••••••••••',
        [19] = '••••••••••••••••••••',
        [20] = '•••••••••••••••••••••',
        [21] = '••••••••••••••••••••••',
        [22] = '•••••••••••••••••••••••',
        [23] = '••••••••••••••••••••••••',
        [24] = '•••••••••••••••••••••••••',
        [25] = '••••••••••••••••••••••••••',
        [26] = '•••••••••••••••••••••••••••',
        [27] = '••••••••••••••••••••••••••••',
        [28] = '•••••••••••••••••••••••••••••',
        [29] = '••••••••••••••••••••••••••••••',
        [30] = '•••••••••••••••••••••••••••••••',
        [31] = '••••••••••••••••••••••••••••••••',
        [32] = '•••••••••••••••••••••••••••••••••',
        [33] = '••••••••••••••••••••••••••••••••••',
        [34] = '•••••••••••••••••••••••••••••••••••',
        [35] = '••••••••••••••••••••••••••••••••••••',
        [36] = '•••••••••••••••••••••••••••••••••••••',
        [37] = '••••••••••••••••••••••••••••••••••••••',
        [38] = '•••••••••••••••••••••••••••••••••••••••',
        [39] = '••••••••••••••••••••••••••••••••••••••••',
        [40] = '•••••••••••••••••••••••••••••••••••••••••',
        [41] = '••••••••••••••••••••••••••••••••••••••••••',
        [42] = '•••••••••••••••••••••••••••••••••••••••••••',
        [43] = '••••••••••••••••••••••••••••••••••••••••••••',
        [44] = '•••••••••••••••••••••••••••••••••••••••••••••',
        [45] = '••••••••••••••••••••••••••••••••••••••••••••••',
        [46] = '•••••••••••••••••••••••••••••••••••••••••••••••',
        [47] = '••••••••••••••••••••••••••••••••••••••••••••••••',
        [48] = '•••••••••••••••••••••••••••••••••••••••••••••••••',
        [49] = '••••••••••••••••••••••••••••••••••••••••••••••••••',
        [50] = '•••••••••••••••••••••••••••••••••••••••••••••••••••'
    }

    LUA_PRELOAD_TXT_BAR_MAP_SIZE = #LUA_PRELOAD_TXT_BAR_MAP

    udg_UnitIndexerEnabled = false -- turn off indexer while units are made

    --
    -- preload abilities by raw code
    --
    local max = #LUA_PRELOAD_ABILCODES
    local loop = 1

    TimerStart(NewTimer(),0.01,true,function()
        LUA_PRELOAD_TXT_LOAD = "|cff00b1ffLoading " .. LUA_PRELOAD_ABILCODES[loop] .. "|r"
        UnitAddAbilityBJ( FourCC(LUA_PRELOAD_ABILCODES[loop]), LUA_PRELOAD_TEMPUNIT )
        UnitRemoveAbilityBJ( FourCC(LUA_PRELOAD_ABILCODES[loop]), LUA_PRELOAD_TEMPUNIT )
        LUA_PRELOAD_OBJECTS_LOADED = LUA_PRELOAD_OBJECTS_LOADED + 1
        loop = loop + 1
        RunDataPreloaderProgress()
        if (loop >= #LUA_PRELOAD_ABILCODES) then
            RemoveUnit(LUA_PRELOAD_TEMPUNIT)
            --
            -- preload units by raw code
            --
            max = #LUA_PRELOAD_UNITCODES
            loop = 1
            TimerStart(NewTimer(),0.01,true,function()
                LUA_PRELOAD_TXT_LOAD = "|cff00b1ffLoading " .. LUA_PRELOAD_UNITCODES[loop] .. "|r"
                RemoveUnit( CreateUnit(Player(14),FourCC(LUA_PRELOAD_UNITCODES[loop]),0.0,0.0,0.0) )
                LUA_PRELOAD_OBJECTS_LOADED = LUA_PRELOAD_OBJECTS_LOADED + 1
                loop = loop + 1
                RunDataPreloaderProgress()
                if (loop >= #LUA_PRELOAD_UNITCODES) then
                    --
                    -- preload effects by string
                    --
                    max = #LUA_PRELOAD_EFFECTSTRINGS
                    loop = 1
                    TimerStart(NewTimer(),0.01,true,function()
                        LUA_PRELOAD_TXT_LOAD = "|cff00b1ffLoading " .. string.sub(LUA_PRELOAD_EFFECTSTRINGS[loop],1,24) .. "|r.."
                        Preload(LUA_PRELOAD_EFFECTSTRINGS[loop])
                        LUA_PRELOAD_OBJECTS_LOADED = LUA_PRELOAD_OBJECTS_LOADED + 1
                        loop = loop + 1
                        RunDataPreloaderProgress()
                        if (loop >= #LUA_PRELOAD_EFFECTSTRINGS) then
                            RunDataPreloaderResume() -- continue after coroutine ends
                            ReleaseTimer()
                        end
                    end)
                    ReleaseTimer()
                end
            end)
            ReleaseTimer()
        end
    end)

end


function RunDataPreloaderResume()

    -- preload forest camps
    if (TriggerEvaluate(gg_trg_Forest_Camps_Init)) then
        TriggerExecute(gg_trg_Forest_Camps_Init)
        LUA_PRELOAD_TXT_LOAD = "|cff64ff64Forest Camps Preloaded|r"
        RunDataPreloaderProgress()
    else
        print("Error: Forest Camps Failed to Load")
    end

    -- loading complete, run post-map init trigger
    LUA_PRELOAD_TXT_LOAD = "|cff64ff64Loading Complete|r"

    if (TriggerEvaluate(gg_trg_Map_Loaded)) then
        TriggerExecute(gg_trg_Map_Loaded)
    else
        udg_victoryPlayer = Player(13)
        TriggerExecute(gg_trg_Victory)
        print("Error: Map Load Failed, please report to map author: failed to load 'gg_trg_Map_Loaded'")
    end

    udg_UnitIndexerEnabled = true -- re-enable unit indexer

    -- cleanup
    RemoveUnit(LUA_PRELOAD_VISIBILITY1)
    RemoveUnit(LUA_PRELOAD_VISIBILITY2)
    LUA_PRELOAD_UNITCODES = nil
    LUA_PRELOAD_ABILCODES = nil
    LUA_PRELOAD_EFFECTSTRINGS = nil
    LUA_PRELOAD_VISIBILITY1 = nil
    LUA_PRELOAD_VISIBILITY2 = nil
    LUA_PRELOAD_TEMPUNIT = nil
    LUA_PRELOAD_TXT_LOAD = nil
    LUA_PRELOAD_TXT_BAR_COMPLETE = nil
    LUA_PRELOAD_TXT_BAR_INCOMPLETE = nil
    LUA_PRELOAD_TXT_PROGRESS = nil
    LUA_PRELOAD_TXT_BAR_MAP = nil
    LUA_PRELOAD_TXT_BAR_MAP_SIZE = nil
    LUA_PRELOAD_TXT_COLOR = nil
    LUA_PRELOAD_OBJECTS_LOADED = nil
    LUA_PRELOAD_OBJECTS = nil
    LUA_PRELOAD_OBJECTS_PROGRESS = nil

end


function RunDataPreloaderProgress()

    -- fetch index based on % objects loaded:
    LUA_PRELOAD_OBJECTS_PROGRESS[1] = math.floor((LUA_PRELOAD_OBJECTS_LOADED/LUA_PRELOAD_OBJECTS)*LUA_PRELOAD_TXT_BAR_MAP_SIZE)
    -- fetch reverse for progress not yet done:
    LUA_PRELOAD_OBJECTS_PROGRESS[2] = LUA_PRELOAD_TXT_BAR_MAP_SIZE - LUA_PRELOAD_OBJECTS_PROGRESS[1]

    LUA_PRELOAD_TXT_BAR_COMPLETE = LUA_PRELOAD_TXT_BAR_MAP[LUA_PRELOAD_OBJECTS_PROGRESS[1]]
    LUA_PRELOAD_TXT_BAR_INCOMPLETE = LUA_PRELOAD_TXT_BAR_MAP[LUA_PRELOAD_OBJECTS_PROGRESS[2]]

    LUA_PRELOAD_TXT_PROGRESS = LUA_PRELOAD_TXT_COLOR .. LUA_PRELOAD_TXT_BAR_COMPLETE .. '|r|cffc8c8c7' .. LUA_PRELOAD_TXT_BAR_INCOMPLETE .. '|r'

    ClearTextMessages()

    print(LUA_PRELOAD_TXT_LOAD)
    print(LUA_PRELOAD_TXT_PROGRESS)

end
The object data is also nothing fancy, just plopped in tables as they are made/used:

Lua:
LUA_PRELOAD_EFFECTSTRINGS = {
    "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl",
    "UI\\Minimap\\MiniMap-Boss.mdl",
    "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl",
    "Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl",
    "UI\\Minimap\\Minimap-QuestObjectiveBonus.mdl",
    "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl",
    "Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl",
    "Abilities\\Spells\\Items\\AIlb\\AIlbTarget.mdl",
    "Abilities\\Weapons\\Bolt\\BoltImpact.mdl",
    "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl",
    "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl",
    "Doodads\\Terrain\\RockChunks\\RockChunks2.mdl",
    "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",
    "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl",
    "Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl",
    "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl",
    "Abilities\\Spells\\Items\\RitualDagger\\RitualDaggerTarget.mdl",
    "Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl",
    "Abilities\\Spells\\Undead\\Web\\WebTarget.mdl",
    "Objects\\Spawnmodels\\Human\\HumanBlood\\HumanBloodFootman.mdl",
    "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",
    "Abilities\\Spells\\Items\\AIso\\AIsoTarget.mdl",
    "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl",
    "Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl",
    "Abilities\\Weapons\\Mortar\\MortarMissile.mdl",
    "Abilities\\Spells\\Other\\Transmute\\GoldBottleMissile.mdl",
    "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes0.mdl",
    "Abilities\\Spells\\Undead\\UnholyFrenzy\\UnholyFrenzyTarget.mdl",
    "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl",
    "Abilities\\Spells\\Items\\SpellShieldAmulet\\SpellShieldCaster.mdl",
    "Abilities\\Weapons\\Bolt\\BoltImpact.mdl",
    "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl",
    "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes1.mdl",
    "Doodads\\Cityscape\\Props\\MagicRunes\\MagicRunes0.mdl",
    "Abilities\\Spells\\Other\\HowlOfTerror\\HowlCaster.mdl",
    "Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl",
    "Abilities\\Spells\\Items\\AIsm\\AIsmTarget.mdl",
    "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl",
    "Abilities\\Spells\\Items\\AIfb\\AIfbSpecialArt.mdl",
    "Units\\NightElf\\Wisp\\WispExplode.mdl",
    "Abilities\\Spells\\Other\\Drain\\ManaDrainCaster.mdl",
    "Abilities\\Spells\\Undead\\ReplenishMana\\ReplenishManaCasterOverhead.mdl",
    "Abilities\\Weapons\\FarseerMissile\\FarseerMissile.mdl",
    "Abilities\\Spells\\Other\\Charm\\CharmTarget.mdl",
    "Abilities\\Spells\\Orc\\EtherealForm\\SpiritWalkerChange.mdl",
    "Abilities\\Weapons\\Bolt\\BoltImpact.mdl",
    "Abilities\\Weapons\\WitchDoctorMissile\\WitchDoctorMissile.mdl",
    "Abilities\\Spells\\NightElf\\Starfall\\StarfallCaster.mdl",
    "Objects\\Spawnmodels\\NightElf\\NEDeathSmall\\NEDeathSmall.mdl",
    "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl",
    "Doodads\\Icecrown\\Terrain\\ClearIceRock\\ClearIceRock3.mdl",
    "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl",
    "Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl",
    "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl",
    "war3mapImported\\Ember.mdx",
    "Abilities\\Weapons\\FireBallMissile\\FireBallMissile.mdl",
    "war3mapImported\\Pillar of Flame Orange.mdx",
    "war3mapImported\\Ember Blue.mdx",
    "Abilities\\Weapons\\FrostWyrmMissile\\FrostWyrmMissile.mdl",
    "war3mapImported\\Pillar of Flame Blue.mdx",
    "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl",
    "war3mapImported\\Ember Green.mdx",
    "Abilities\\Spells\\Undead\\PlagueCloud\\PlagueCloudCaster.mdl",
    "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl",
    "war3mapImported\\Pillar of Flame Green.mdx",
    "Abilities\\Weapons\\GreenDragonMissile\\GreenDragonMissile.mdl",
    "war3mapImported\\Nether Blast I.mdx",
    "Abilities\\Weapons\\ChimaeraAcidMissile\\ChimaeraAcidMissile.mdl",
    "Abilities\\Spells\\Undead\\UnholyAura\\UnholyAura.mdl",
    "Abilities\\Spells\\Undead\\Darksummoning\\DarkSummonTarget.mdl",
    "Objects\\Spawnmodels\\Undead\\UDeathSmall\\UDeathSmall.mdl",
    "Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl",
    "Objects\\Spawnmodels\\Demon\\DemonLargeDeathExplode\\DemonLargeDeathExplode.mdl",
    "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl",
    "war3mapImported\\EnergyBurst_Portrait.mdx",
    "Abilities\\Spells\\Demon\\DarkPortal\\DarkPortalTarget.mdl",
    "Abilities\\Spells\\NightElf\\MoonWell\\MoonWellCasterArt.mdl",
    "Abilities\\Spells\\Human\\Polymorph\\PolyMorphDoneGround.mdl",
    "UI\\Minimap\\MiniMap-CreepLoc-Small.mdl",
    "Abilities\\Spells\\Items\\TomeOfRetraining\\TomeOfRetrainingCaster.mdl",
    "Abilities\\Spells\\Other\\Doom\\DoomTarget.mdl",
    "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl",
    "Abilities\\Spells\\Human\\Resurrect\\ResurrectTarget.mdl",
    "Abilities\\Weapons\\Bolt\\BoltImpact.mdl",
    "Abilities\\Spells\\NightElf\\MoonWell\\MoonWellCasterArt.mdl",
    "Abilities\\Spells\\Orc\\HealingWave\\HealingWaveTarget.mdl",
    "Abilities\\Spells\\Other\\Drain\\ManaDrainTarget.mdl",
    "Abilities\\Spells\\NightElf\\BattleRoar\\RoarCaster.mdl",
    "Abilities\\Spells\\Human\\Heal\\HealTarget.mdl",
    "abilities\\weapons\\huntermissile\\huntermissile.mdl",
    "Abilities\\Spells\\Human\\DispelMagic\\DispelMagicTarget.mdl",
    "Abilities\\Spells\\Undead\\DeathPact\\DeathPactTarget.mdl",
    "Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl",
    "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl",
    "Objects\\Spawnmodels\\Undead\\UndeadDissipate\\UndeadDissipate.mdl",
    "Abilities\\Spells\\Other\\AcidBomb\\BottleImpact.mdl"
}
Lua:
LUA_PRELOAD_UNITCODES = {
    'e00d',
    'e00H',
    'o019',
    'u007',
    'u008',
    'u009',
    'u00E',
    'e00P',
    'e001',
    'e004',
    'h00E',
    'o018',
    'o017',
    'o000',
    'o00A',
    'o00B',
    'o00Y',
    'o00D',
    'n003',
    'n000',
    'h000',
    'h006',
    'h007',
    'o00Z',
    'n015',
    'n014',
    'n00Y',
    'n00M',
    'n00N',
    'n00O',
    'n00P',
    'n00Q',
    'n00R',
    'n00S',
    'n00T',
    'n00V',
    'n00U',
    'n00W',
    'n00X',
    'n00Z',
    'n010',
    'n011',
    'n012',
    'n013',
    'n00H',
    'n018',
    'n01A',
    'h00B',
    'o005',
    'E00L',
    'E00O',
    'O00W',
    'H00D',
    'o00X',
    'h00C',
    'n00K',
    'O00O',
    'O010',
    'O00R',
    'O00P',
    'O00M',
    'O00J',
    'O013',
    'O014',
    'O016',
    'o011',
    'e00E',
    'O00Q',
    'e00G',
    'e00F',
    'u00D',
    'e006',
    'O00H',
    'u000',
    'u004',
    'u003',
    'u00B',
    'e003',
    'u00A',
    'u006',
    'u005',
    'u002',
    'u00F',
    'u00C',
    'O012',
    'e00I',
    'o00G',
    'e00Q',
    'e008',
    'e009',
    'e00B',
    'e00C',
    'e00A',
    'e00D',
    'e00K',
    'e00J',
    'o015',
    'n01B',
    'O00S',
    'e007',
    'o00K',
    'o00L',
    'n00L',
    'n00J',
    'E00N',
    'E00M',
    'n017',
    'n004',
    'O00T',
    'O00E',
    'O00C',
    'O00U',
    'O00V',
    'E000',
    'o001',
    'h001',
    'h002',
    'n002',
    'n001',
    'o002',
    'o004',
    'o003',
    'h00A',
    'h009',
    'o006',
    'h004',
    'o007',
    'h003',
    'o008',
    'h005',
    'o009',
    'e002',
    'n01E',
    'n01D',
    'o00F',
    'h008',
    'n01C',
    'n016',
    'e005',
    'e00R',
    'n01F',
    'e00S',
    'e00U'
}
Lua:
LUA_PRELOAD_ABILCODES = {
    'A009',
    'A007',
    'A00H',
    'A00O',
    'A015',
    'A00Y',
    'A008',
    'A01I',
    'A00Q',
    'A00X',
    'A018',
    'A01M',
    'A01B',
    'A01Q',
    'A01J',
    'A00L',
    'A01Y',
    'A01Z',
    'A01G',
    'A026',
    'A025',
    'A01H',
    'A02A',
    'A01V',
    'A00V',
    'A00W',
    'A02K',
    'A02L',
    'A02M',
    'A00G',
    'A02N',
    'A00D',
    'A00E',
    'A02S',
    'A028',
    'A011',
    'A014',
    'A02T',
    'A02W',
    'A02X',
    'A035',
    'A033',
    'A03H',
    'A03O',
    'A03N',
    'A03P',
    'A034',
    'A03Q',
    'A03R',
    'A03S',
    'A03X',
    'A02Y',
    'A032',
    'A03Y',
    'A03Z',
    'A040',
    'A03B',
    'A00R',
    'A01P',
    'A041',
    'A00A',
    'A042',
    'A00B',
    'A000',
    'A022',
    'A024',
    'A043',
    'A00U',
    'A037',
    'A045',
    'A027',
    'A00M',
    'A029',
    'A017',
    'A01D',
    'A01E',
    'A02P',
    'A046',
    'A00J',
    'A047',
    'A001',
    'A005',
    'A006',
    'A048',
    'A049',
    'A01N',
    'A01O',
    'A03M',
    'A03J',
    'A03K',
    'A03L',
    'A04A',
    'A04B',
    'A04C',
    'A03D',
    'A03E',
    'A03F',
    'A03C',
    'A04D',
    'A04F',
    'A04E',
    'A04H',
    'A02B',
    'A02F',
    'A013',
    'A010',
    'A00Z',
    'A02D',
    'A019',
    'A016',
    'A03I',
    'A02C',
    'A02E',
    'A039',
    'A03G',
    'A036',
    'A02Z',
    'A01C',
    'A04I',
    'A02U',
    'A02V',
    'A04J',
    'A030',
    'A031',
    'A04K',
    'A04L',
    'A01W',
    'A04M',
    'A04G',
    'A01X',
    'A04N',
    'A04O',
    'A00C',
    'A04Q',
    'A04P',
    'A00F',
    'A04R',
    'A020',
    'A04S',
    'A04T',
    'A04U',
    'A04V',
    'A023',
    'A04W',
    'A021',
    'A04X',
    'A00T',
    'A00S',
    'A04Z',
    'A050',
    'A051',
    'A04Y',
    'A01L',
    'A01K',
    'A01F',
    'A044',
    'A038',
    'A052',
    'A053',
    'A057',
    'A055',
    'A056',
    'A02J',
    'A058',
    'A03A',
    'A02O',
    'A02Q',
    'A02R',
    'A05A',
    'A05B',
    'A05C',
    'A054',
    'A05D',
    'A05E',
    'A02H',
    'A05F',
    'A02I',
    'A059',
    'A02G',
    'A05G',
    'A05H',
    'A05I',
    'A05J',
    'A05L',
    'A01A',
    'A05K',
    'A05M',
    'A05N',
    'A00N',
    'A00P',
    'A00I',
    'A05P',
    'A003',
    'A01U',
    'A05O',
    'A01S',
    'A05R',
    'A01T',
    'A05Q',
    'A01R',
    'A002',
    'A004',
    'A05S',
    'A05T',
    'A00K',
    'A05V',
    'A05W',
    'A05X',
    'A05U',
    'A05Y',
    'A012',
    'A03T',
    'A03U',
    'A03V',
    'A03W',
    'A05Z',
    'A060',
    'A062',
    'A063',
    'A064',
    'A065',
    'A068',
    'A06F',
    'A06G',
    'A06P',
    'A06V',
    'A072',
    'A073',
    'A074',
    'A075',
    'A076'
}
 
Level 12
Joined
Jan 30, 2020
Messages
875
Oh thanks for sharing this, I will look into it.

I am currently working hard on a simple custom model for an attributesupgrades store (not easy considering I am a real newbie at model editing and that I do most things in MDL and NotePad++), but making my preloader work is my next priority.

So I will have a look at this code and try to get inspiration from it in order to have a more efficient preloading.

If I find anything useful in my tests, I promise to let you know !
 
Level 14
Joined
Feb 7, 2020
Messages
386

05-21-20: Jammin' Trolls and UI Flows. v1.3

New Hero, Custom UI, Beta Concluded
The Forest Troll Warlord (neutral) joins the hero roster, complete with 17 unique items that alter his abilities and two ultimates to choose from. Additionally, the map is now complemented by a custom, minimalist UI that reduces screen clutter and flattens the color palette. Lastly, this patch marks the end of the beta (which proved of little use, unfortunately) and a "final" release.

Zul'rogg, the Forest Troll Warlord (Eliminator)
Mobility is king. Dash around short distances after using Rending Axe (Q) and transform into a melee fighter when there are no more axes to throw. If your enemies get too far, take advantage of Grappling Hook (E) to close gaps. Choose from two ultimate abilities that vary greatly based your chosen strategy: master the skillshot of Rending Axe by enhancing it to damage enemies for chunks of their health with Skull Cleaver (R1), or become a savage melee-focused fighter with Jungle Flurry (R2).

-- -- --

Tentative road map and some long form thoughts on content progress:

This could be considered a personal monologue but such things are, in my opinion, healthy for thoughts that have been kept bottled. 200+ hours have gone into this project and it feels like a solid game loop has been developed, especially compared to some of the maps that I have seen get popular and the 10,000 iterations of Circle TD (shots fired). It was also fun to dive into game logic once again.

However, there are realities to deal with that have shaped some brewing considerations on the direction of existing feature sets for this map. I would love for people to actually host it and play it, and for people to stay in my own lobbies when I host it, but the landscape of gaming has changed drastically since 2007. People continue to value novelty, but there is an attachment to 'that which is familiar.'

With that, here are some notes (from my personal perspective) for other map authors to consider when they choose to dive into an ambitious project:

- Deforged seems to mostly resemble a mobile games simulator where players enjoy uninvolved maps such as TDs and auto-senders (Legion TD, Castle Fight, etc.). There is nothing inherently wrong with this, but AoS maps have definitely taken a backseat in appealing to the modern gamer archetype. Another question I would have no answer to is: why not just play HotS or DotA 2? You can easily join games in less than a minute with modern, automated lobby systems versus the pick-and-choose choice dilemma of WC3 custom games (plus, these other games are free). They have strictly more powerful engines with cooler stuff going on, and the skinner box progression that gets so many people addicted should not be left out of the equation. If you choose to make a TD or auto-sender, you're most likely going to have a lot of people inclined to be interested in it.

- Lobbies for anything that isn't familiar to the playerbase or which doesn't resemble some kind of sit-back-relax gameplay loop (lazy in a good way) are nearly impossible to fill (at least, in normal NA time slots). Anything beyond 6 players is even more dire if your project doesn't have a reputation. This could be a symptom of Deforged's splintered player population (different versions on a variety of hosted services). The only exception I can find to this issue is RPG-type maps. But they, too, struggle to keep people's interest.

In conclusion, maps of this particular genre this can only come from a place of passion. Which is a good thing, creative outlets are necessary to achieve fruitful joy. But, simply put, you cannot craft the playerbase to fit your map; you can, however, alter your map to fit the playerbase.

So, here are some polishing components I'm thinking about in relation to this map. It's worth noting that these would be additive or transforming features, and the base map (in its current released state) would stay the same:

1) The required or optimal team size should be reduced to allow for lobbies to be filled quickly. I am considering reducing the optimal team format from 5v5 to 3v3 via including a dedicated 3v3 mode, and potentially including a heavier emphasis on the AI component to drive the "liveliness" of the map via optional (or maybe default) game modes.

2) There should probably be a 'versus AI' or 'PvE' mode that is both interesting and challenging. This would further assist with problem 1) by making the required players dynamic. More thought required, but it could be a game mode that does a pseudo-conversion to a hero survival map, etc.

3) A progression system should be considered. It's not new knowledge: every game these days includes some kind of stored progression. It's a contributing reason to why Random Farm TD has so many active followers, I'd wager. I'm thinking this kind of thing could be better tied to point 2), where an out-of-the-ordinary system drives progression on a per-hero basis which you then use to climb higher in whatever the PvE mode would be. More to think about.

4) The hero selection, leveling, and character growth options should be more intuitive via the UI. Systems in WC3 have always been that of total jank: want an attribute on leveling up? Go to this goblin shop and buy a tome. Are you 'learning a new ability'? Go to this shop and buy a dummy item which 'learns it' for you. Having exercised the power of the UI natives (which are quite horrible but can be made to work), I'm thinking of a pretty cool UI component to build your character throughout a match. More to come. This would require a significant refactor of existing systems that involve heroes.

5) There's probably room for some hero redesigns. Heroes like the Acolyte and Huntress are quite dated now in their item, ability, and all-around design philosophy. Plus, their coding method is less than ideal (GUI, eek!). This would be the least important in terms of priority but something to perhaps chip away at.

All of the above points would be slated in a larger, more ambitious 'v2.0' refresh. Right now, though, nothing is officially planned.

That's all for now. Happy mapping. :cool:2
 
Last edited:
Level 12
Joined
Jan 30, 2020
Messages
875
Nice updates, will soon need a break from my Lua and modeling hoes and then I will test your latest version !!!

Besides, I have slowly started working on my preloading.
As nobody really seems to know how preloading effectively is handled by the game engine, I have decided to follow your path.

This said, I just found a problem that might explain why your preloading does not function perfectly.
You create all your units at the same position (do you include buildings by the way?), thus if they have collision (especially in the case of buildings because they have a pathing map), the game engine needs to reposition them to the nearest non colliding position.
This probably slows your unit creation a LOT.
If you preplace your units in WE, then export your map script, you can do the same as I did : extract the function creating the preplaced units and clean and rearrange it.
This way you can save the unit ids and their position before creating them.
They will be created so much faster than you will be able to get rid of your preloading bar.

Next, you don't need to use a timer to remove the units. You can just apply a timed life to them.

I am not sure what the best duration is to give the game enough time to "digest" the data, but that can be tested.
Anyways, to avoid having to wait longer before starting the game once the units are created, maybe just give them Locusr and Hide them. Hell maybe even Pause them in case they would still attack something (does pausing a unit stops its timed life ?)

Anyways, here is my current first attempt at preloading units :

Lua:
function Preloading()
    TIMED=FourCC("BTLF") -- Timed Life
    LOCUST=FourCC("Aloc") -- Locust
    local p,u,id,x,y=Player(11),nil,0,0.0,0.0
    PLU={{ "eC72", -7936.0, 6080.0},{ "e001", -7680.0, 6080.0},{ "e002", -7424.0, 6080.0},{ "e0A5", -7936.0, 6336.0},{ "e003", -7168.0, 6080.0},
         { "e004", -7680.0, 6336.0},{ "e007", -7424.0, 6336.0},{ "oC88", -8000.0, 5888.0},{ "hC00", -7616.0, 5888.0},{ "h003", -7488.0, 5888.0},
         { "h002", -7360.0, 5888.0},{ "e008", -7872.0, 5888.0},{ "h000", -7744.0, 5888.0},{ "h005", -7232.0, 5888.0},{ "hC49", -7488.0, 5760.0},
         { "hC46", -7488.0, 5632.0},{ "hC44", -7360.0, 5760.0},{ "h00B", -7232.0, 5760.0},{ "h00C", -7232.0, 5632.0},{ "hC53", -7360.0, 5632.0},
         { "hC54", -7360.0, 5504.0},{ "h00D", -7232.0, 5504.0},{ "hC50", -7488.0, 5504.0},{ "hC52", -7488.0, 5376.0},{ "h001", -7488.0, 5248.0},
         { "h00U", -7360.0, 5376.0},{ "h00E", -7232.0, 5376.0},{ "h00V", -7360.0, 5248.0},{ "h00F", -7232.0, 5248.0},{ "hC59", -8000.0, 5760.0},
         { "hC60", -7872.0, 5760.0},{ "e005", -7744.0, 5760.0},{ "e0P4", -7616.0, 5760.0},{ "hC61", -8000.0, 5632.0},{ "hC62", -7872.0, 5632.0},
         { "h0I4", -7616.0, 5632.0},{ "h006", -7744.0, 5632.0},{ "h0G2", -7872.0, 5504.0},{ "h0G3", -7744.0, 5504.0},{ "h00Q", -7616.0, 5504.0},
         { "h0G1", -8000.0, 5504.0},{ "h009", -8000.0, 5376.0},{ "h008", -7872.0, 5376.0},{ "h0F4", -7616.0, 5376.0},{ "h007", -7744.0, 5376.0},
         { "h004", -8000.0, 5248.0},{ "h00A", -7872.0, 5248.0},{ "e00B", -7744.0, 5248.0},{ "e0M4", -7616.0, 5248.0},{ "h00G", -8000.0, 5120.0},
         { "h00H", -7872.0, 5120.0},{ "h00J", -7616.0, 5120.0},{ "h00I", -7744.0, 5120.0},{ "h00L", -7488.0, 5120.0},{ "h00N", -7360.0, 5120.0},
         { "h00M", -7232.0, 5120.0},{ "h00R", -7104.0, 5120.0},{ "h00K", -7104.0, 5248.0},{ "h00X", -7104.0, 5376.0},{ "nC71", -6976.0, 5632.0},
         { "nC90", -6848.0, 5184.0},{ "e000", -6464.0, 5184.0},{ "e006", -6464.0, 4800.0},{ "woow", -6848.0, 4800.0},{ "U005", -7974.0, 4878.2},
         { "U006", -7790.8, 4887.2},{ "U001", -7535.6, 4878.2},{ "U003", -7146.3, 4779.4},{ "HBU1", -7992.7, 4537.8},{ "HBU2", -7790.7, 4525.7},
         { "HBU4", -7263.5, 4559.1},{ "HBU3", -7562.1, 4546.9},{ "n003", -6147.9, 5235.5},{ "nED1", -7423.5, 3865.3},{ "nED2", -6690.5, 3812.4},
         { "nC97", -6039.4, 4880.8},{ "nFFB", -6045.1, 4484.3},{ "n00R", -5873.9, 3837.4},{ "nC99", -5613.0, 4402.2},{ "n002", -5245.3, 4210.2},
         { "u000", -7715.3, 3447.8},{ "u004", -7521.4, 3461.2},{ "u002", -7385.6, 3456.8},{ "n000", -6676.9, 3362.1},{ "n001", -6281.6, 3352.3},
         { "nsf1", -5586.4, 3920.8},{ "nsf2", -5618.6, 3543.3},{ "nsf3", -5982.4, 4046.3},{ "nsf4", -5902.0, 3524.2},{ "u002", -5164.9, 3807.0},
         { "HBU5", -3759.5, 1739.2},{ "HHEA", -3789.5, 1413.4},{ "URBA", -3542.4, 1499.1},{ "URFB", -3293.4, 1413.4}}
    for i=1, 94 do
        id,x,y=PLU[i][1],PLU[i][2],PLU[i][3]
        u=CreateUnit(p, FourCC(id), x, y, 270.0)
        UnitApplyTimedLife(u, TIMED, 2.00)
        UnitAddAbility(u, LOCUST) -- Locust ?
        ShowUnit(u, false) -- Hide Unit ?
    end
end

I would like to know your feeling about this before working on sfx, models and Textures strings, and finally abilities.
Take care !!!

EDIT :
Tested this with an added preplaced maze of 564 towers and the map loading only takes abut 2-3 more seconds than without maze and without preloading.

EDIT 2 :

Now that I drank a coffee and am fully awake, I read the notes on your final update.
I know it feels sad or empty or what not to realize there is not much popularity rewarding all your incredible efforts at making a quality map.
But remember you are not a marketing/ game promotion expert.
You're a designer, you're a creator, an artist in other words.

Never regret your choices, never regret the time spent, there will always be people then can gain interest in your work, even among the over-busy community of fellow map makers.

Hell guess what, I have only hosted my aMazing Balls TD once in multiplayer, it was around version 1.1.

Now my map feels so much more advanced that the majority of maps of the same genre, I don't mind it being infinitely less popular, I made this for pleasure, for beauty, for accomplishment, just for the sake of it.

Every little effort you put into this should fulfill you with pride, and you don't need an army or a fanbase to tell you "well done, this map is amazing".
You only need patience and recognition from your pairs.
Thats what I did when I tested your map.

And trust me I know what I am talking about, I still have this very advanced (for its time) DOTA-like map I made in 2003 sitting around, with funny stuff I still haven't seen anywhere else (like a time stop ability (need to review my old code to see how the hell I did that in the multiplayer context !), and unfortunately I already have other projects after aMazing Balls TD that will prevent me from remaking this old map that was called "Atlantis Beyond Icecrown" (RIP).

Also, even if I made a TD, I didn't get much more luck than you, I can count on a single hand people who have tried my map. So even if that could sadden me, it doesn't.
The very few people that love my map are enough for me, and for the rest I can still show this to my 25 years-old daughter who loves it (although she does not understand English).
Well if my granddaughter wouldn't be 2 years old, I am sure I would have a second devoted fan :D

Until then, I have very few fans here, and I am not shocked or surprised.
People here make maps, it does not give them much time to check on colleagues work, unless when they want to take a break.

The work involved in making a map, especially a wonderfully designed one, is simply huge.
But if you do not plan to become rich out of this, you don't really need a big player base to receive all the deserved recognition.

As a matter of fact, and as a perfectionist who values the hard work required to make a polished map like you did, just acknowledge my admiration for your work is not fake.

Take care !!!
 
Last edited:
Level 12
Joined
Jan 30, 2020
Messages
875
UPDATE (well not really but I wanted to confirm I am not double-posting ^^):

Played your map solo again yesterday, to test the Forest Troll Warlord (probably a very bad solo choice due to his custom abilities.

Overall the map still feels seamless and rock stable.
The new UI is at first a tiny bit disconcerting, but you very quickly get used to it.
That really frees a lot of visual space.

2 things though :

- Please add the custom HP and Mana Bars, there is currently no way to know your Hero or the unit's exact HP that is problematic.
(don't bother with tab selection change, there only 1 hero to control)

- I don't remember the time of the day being used by the map (or I have not paid enough attention), so if thats right just use a model with no mesh to replace the time of the day indicator from advanced - Game Interface (I attached my home made empty model to this post -it's basically just 3 attachment points with a stand animation, a root bone and no Geoset).

Keep the good work !!!
 

Attachments

  • EmptyModel.mdx
    1.8 KB · Views: 132
Level 14
Joined
Feb 7, 2020
Messages
386
Map appears to be functional but I do not think that the credit list is complete?
Please add the missing users.

Awaiting Update.
I added one or two from Mythic that I missed but the 'resources used' scraper looks to be inaccurate. (Maybe it is catching shared texture files?)

There is not a single use of any of Mythic's Starfall Empire models in this map, for example. I don't recall using them even in a temporary manner, they've never been in the import manager.
 
Top