• 🏆 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!

WarChasers Remastered

This is the original WarChasers map by Blizzard, modified to remove all glitches and stuttering. Otherwise, everything is just about the same.

- Most things are in GUI
- It does not need any 3rd party software to open
- The small but useful amount custom script might be a nice learning experience for some users.

Some minor things I've added which were not in the original:

- The wisp, hero and tank are automatically selected for the user.
- Ability doodads animate when stepped on.
- Traps now use timers instead of waits, so their damage is more predictable.

Please enjoy, and feel free to mod this map to your liking. You do not have to give me credits for using it as it's mostly Blizzard's work and I just did this as a hobby.

34qjnr4.png



JASS:
function InitPlayerActions takes player p, unit u returns nothing
   
    call SetPlayerHandicapXP(p, 0.30)
   
    // Dungeon Creatures
    call SetPlayerAlliance(p, Player(11), ALLIANCE_PASSIVE, false)
   
    // If a player is playing intialize the variable to that player's wisp, else remove that wisp
    if GetPlayerSlotState(p) != PLAYER_SLOT_STATE_PLAYING then
        call RemoveUnit(u)
    else
        call FogModifierStart(CreateFogModifierRect(p, FOG_OF_WAR_VISIBLE, gg_rct_MenuVisibility, true, false))
       
        //The BJ function prevents player from allying with itself
        call SetPlayerAllianceStateBJ(p, Player(0), bj_ALLIANCE_ALLIED_VISION)
        call SetPlayerAllianceStateBJ(p, Player(1), bj_ALLIANCE_ALLIED_VISION)
        call SetPlayerAllianceStateBJ(p, Player(5), bj_ALLIANCE_ALLIED_VISION)
        call SetPlayerAllianceStateBJ(p, Player(6), bj_ALLIANCE_ALLIED_VISION)
       
        if udg_LocalPlayer == p then
            call SetCameraTargetController(u, 0, 0, false)
            call SelectUnit(u, true)
            set udg_CameraUnit = u
            set udg_CameraActive = true
        endif
    endif
endfunction

function InitPlayers takes nothing returns nothing
    call CameraSetupApplyForceDuration(gg_cam_CamStart1, true, 0)
    call SetMapFlag(MAP_LOCK_ALLIANCE_CHANGES, true)
    call SetMapFlag(MAP_LOCK_RESOURCE_TRADING, false)
    call SetPlayerState(Player(11), PLAYER_STATE_GIVES_BOUNTY, 1)
   
    //Setup interesting GUI Globals
    call DestroyGroup(udg_LastCreatedUnitGroup) //GUI vars spawn a new unit group
    set udg_LastCreatedUnitGroup = bj_lastCreatedGroup //is never destroyed nor set to a new var
    set udg_LocalPlayer = GetLocalPlayer() //Less JASS needed in the future
   
    // Player 1
    call InitPlayerActions(Player(0), gg_unit_ewsp_0006)
   
    // Player 2
    call InitPlayerActions(Player(1), gg_unit_ewsp_0007)
   
    // Player 6
    call InitPlayerActions(Player(5), gg_unit_ewsp_0008)
   
    // Player 7
    call InitPlayerActions(Player(6), gg_unit_ewsp_0010)
endfunction

//===========================================================================
function InitTrig_Custom_Script_Init takes nothing returns nothing
    call ExecuteFunc("InitPlayers") //no triggeractions needed here
endfunction

  • Fire Traps
    • Events
      • Map initialization
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FlamePhase Equal to 1
        • Then - Actions
          • Animation - Play the stand animation for all doodads of type Trap Fire within Flame Trap 1 <gen>
          • Animation - Play the stand animation for all doodads of type Trap Side Fire within Flame Trap 2 <gen>
          • Animation - Play the stand animation for all doodads of type Trap Side Fire within Flame Trap 3 <gen>
          • Animation - Play the stand animation for all doodads of type Trap Side Fire within Flame Trap 4 <gen>
          • Set FlamePhase = 2
          • Countdown Timer - Start FlameDamageTimer as a One-shot timer that will expire in 0.20 seconds
        • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FlamePhase Equal to 2
            • Then - Actions
              • Custom script: call GroupEnumUnitsInRect(bj_lastCreatedGroup, gg_rct_Flame_Trap_1, Filter(function AddToFlameGroup))
              • Custom script: call GroupEnumUnitsInRect(bj_lastCreatedGroup, gg_rct_Flame_Trap_3, Filter(function AddToFlameGroup))
              • Custom script: call GroupEnumUnitsInRect(bj_lastCreatedGroup, gg_rct_Flame_Trap_2, Filter(function AddToFlameGroup))
              • Custom script: call GroupEnumUnitsInRect(bj_lastCreatedGroup, gg_rct_Flame_Trap_4, Filter(function AddToFlameGroup))
              • Unit Group - Pick every unit in FireDamage and do (Actions)
                • Loop - Actions
                  • Set TempUnit = (Picked unit)
                  • Unit Group - Remove TempUnit from FireDamage
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Life of TempUnit) Greater than or equal to 0.41
                    • Then - Actions
                      • Special Effect - Create a special effect attached to the origin of TempUnit using Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
                      • Special Effect - Destroy (Last created special effect)
                      • -------- Two of the fire traps dealt 30 damage, the other 2 dealt 25. --------
                      • -------- I'm not sure what was intended, but to simplify, I just averaged the damage. --------
                      • Unit - Set life of TempUnit to ((Life of TempUnit) - 27.50)
                    • Else - Actions
              • Set FlamePhase = 3
              • Countdown Timer - Start FlameDamageTimer as a One-shot timer that will expire in 1.20 seconds
            • Else - Actions
              • Animation - Play the death animation for all doodads of type Trap Fire within Flame Trap 1 <gen>
              • Animation - Play the death animation for all doodads of type Trap Side Fire within Flame Trap 2 <gen>
              • Animation - Play the death animation for all doodads of type Trap Side Fire within Flame Trap 3 <gen>
              • Animation - Play the death animation for all doodads of type Trap Side Fire within Flame Trap 4 <gen>
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FlamePhase Equal to 3
                • Then - Actions
                  • Countdown Timer - Start FlameDamageTimer as a One-shot timer that will expire in 0.60 seconds
                • Else - Actions
                  • -------- This next block will only run once in the game --------
                  • Trigger - Add to (This trigger) the event (Time - FlameDamageTimer expires)
                  • Countdown Timer - Start FlameDamageTimer as a One-shot timer that will expire in 2.00 seconds
              • Set FlamePhase = 1
  • Periodic Spawns
    • Events
      • Time - Every 0.50 seconds of game time
    • Conditions
    • Actions
      • For each (Integer TempInteger) from 0 to NumSpawners, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • EnableSpawners[TempInteger] Equal to True
              • CurrentMonsters[TempInteger] Less than MaxMonsters[TempInteger]
              • (Life of MonsterSpawners[TempInteger]) Greater than or equal to 0.41
            • Then - Actions
              • -------- I spawn one monster every time 'frequency' gets to zero --------
              • Set Frequencies[TempInteger] = (Frequencies[TempInteger] - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Frequencies[TempInteger] Equal to 0
                • Then - Actions
                  • -------- I restore the frequency --------
                  • Set Frequencies[TempInteger] = InitialFrequencies[TempInteger]
                  • -------- Constantly move the same location to avoid the need for many locations to be made --------
                  • Custom script: call MoveLocation(udg_MonsterPoint, GetUnitX(udg_MonsterSpawners[udg_TempInteger]), GetUnitY(udg_MonsterSpawners[udg_TempInteger]))
                  • Unit - Create 1 SpawnTypes[TempInteger] for Player 12 (Brown) at MonsterPoint facing (Random real number between 0.00 and 360.00) degrees
                  • Unit - Set the custom value of (Last created unit) to (TempInteger + 1)
                  • Set CurrentMonsters[TempInteger] = (CurrentMonsters[TempInteger] + 1)
                  • -------- We could even play a special effect, here. --------
                  • If (((Last created unit) is visible to LocalPlayer) Equal to True) then do (Set TempString = SpawnFXString) else do (Set TempString = <Empty String>)
                  • Special Effect - Create a special effect attached to the origin of (Last created unit) using TempString
                  • Special Effect - Destroy (Last created special effect)
                • Else - Actions
            • Else - Actions
Keywords:
WarChasers, Blizzard, Bribe, leakless
Contents

WarChasers Remastered (Map)

Reviews
10:26, 15th Oct 2015 Shadow Fury: An enhanced leakless version of WarChasers. It can be approved but with no rating since it's heavily based on Blizzard's work.

Moderator

M

Moderator

10:26, 15th Oct 2015
Shadow Fury: An enhanced leakless version of WarChasers. It can be approved but with no rating since it's heavily based on Blizzard's work.
 
Level 30
Joined
Jul 31, 2010
Messages
5,246
I was about to automatically reject this after I saw your ever-graced name, hahah! jokes aside, idk the description is fine, though you mentioned about the animated spells. Could you add just 1 or 2 screen shots for clarification? I'll test this later on.
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
So you want me to add screenshots of the magical runes doodad animation? I can do that next time I update this.

Today, I've released an update which replaces all Wait- Game Time function calls with a custom script Wait call which eliminates the variable reference leak of the former while improving its performance.

The update also replaces all Trigger - Turn off (This Trigger) for enter-region events with a "RemoveRegion(GetTriggeringRegion())" custom script. It does the same thing but reduces the overhead on the engine as the game progresses. In a future update I will also include custom script to remove the triggering trigger, although I'm wary of doing that at the moment because of the peculiarity of triggeractions on a destroyed trigger.

I also changed some redundant code to call to a custom script function, instead. I will later make this more configurable for GUI users. I have also begun removing and nulling all expired rects, but that project won't be completed until the next time I update this.
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
I have decided to can the idea of removing rects. It adds loads of script to the map for no percievable gain (the map is smooth start to finish without it, so I'd rather have less map size).

@ZiB, I can add a disabled spellbook ability that disables the camera lock when you press Y. I'd prefer changing as little as possible about the map, though, and that is quite substantial as it adds character to the game (like Diablo where the camera is also locked)

Ultimately, once I have this map ready by my own standards (should be by tomorrow) then I'll upload another map that will get gameplay updates like making it easier for single player, custom items/abilities. But I want to have this map as a template for future modders who want to have a minimal but bug-free WarChasers framework to mod from.

Post 2

Ok, I did a few playthroughs and found some bugs with the previous version. I am releasing this one today and, from what I can tell at this point, it is completely bug-free.

Please feel free to review this, as I believe this is the final version, unless there is something I missed.
 
Last edited by a moderator:

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
Further update - I noticed that the Trap Fire 1 region was displaying animations oddly (original WarChasers map was doing the same, as well). Turns out that in Object Editor, an option "animate doodads in fog" needed to be checked. Now the trap animation works smoothly and won't surprise you with damage dealt when the traps are invisible.

I took this time to make a few other, small changes, as well. The map has really come along!
 
Level 21
Joined
Nov 4, 2013
Messages
2,017
Map approved with no rating since it's mostly made by Blizzard. It's nice to have a leakless enhanced remake of WarChasers. Just one notice. The fire traps above the barricades beside the renegade wizard are buggy because they don't damage you exactly when they play their stand animation. Would you fix that please?
 
Level 1
Joined
Aug 7, 2014
Messages
1
Dunno if this is a bug or not :-/

When I stepped into the portal, it warped me to Hell with 2 Dooms. I killed them then went to the portal of Paradise. My Immolation killed the npc so I was warped back to Hell again but no Doom anymore. The timer went to 0 then nothing happened, I stuck there.

First time play War Chaser so I have no idea if that's bug or not. And sorry for my bad English too.
 
Level 3
Joined
May 3, 2007
Messages
30
Nice idea to fix this old, but gold map.
A few suggestions:
Thought about adding camera commands to change the zoom? With a lot of resolutions higher it feels too close.
Also as some has said about fixing the hotkeys so they don't overlap, but taking it a step further and mapping them to QWER for easier use?
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
The camera thing would be good to add to a modified version of this map. QWER will require a lot of re-keying object editor and I don't enjoy working in Object Editor due to it not having modularity - for example, tooltips don't change when the hotkey changes. If I do anything else besides removing key clashes, it won't be in this map but in a future spinoff of this one.
 
Level 3
Joined
May 3, 2007
Messages
30
The camera thing would be good to add to a modified version of this map. QWER will require a lot of re-keying object editor and I don't enjoy working in Object Editor due to it not having modularity - for example, tooltips don't change when the hotkey changes. If I do anything else besides removing key clashes, it won't be in this map but in a future spinoff of this one.

Yeah, I get what you mean. I dabbled a bit in WorldEdit 5-6 years ago, and doing abilities was a pain, and a whole lot of work considering it is an "invisible" thing to do. And the camera thing is mostly a quality of life thing anyway.
Considering you're doing the important thing of optimizing scipts and removing memory leaks, I'd say you've had your work cut out for you.
Any idea what you'll do when you complete Warchasers? Would be cool if you got permission from the creator of "Advanced Castle Defense" and make that playable on newer versions of WC3. That map was a ton of fun.
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
I'm almost finished with giving The Death Sheep a much-needed QoL improvement. Instead of using stop/hold position it will use the much better left/right arrow keys and will actually stop at exactly the point you need it to because of it. Aside from that and removing memory leaks, I've merged the duplicate events into bigger triggers. The performance has gone from stuttering/unplayable on my netbook to smooth-as-butter with these changes. The map itself kinda sucks, unfortunately, but it's an improvement and an easy chore to honor Blizzard's original work.

If Advanced Castle Defense is a protected map, I won't be messing with it.
 
Level 3
Joined
May 3, 2007
Messages
30
It might be protected, I kind of remember trying to open it in WorldEdit and it not opening. Isn't there a program to remove WordEdit data from maps to save space. Too bad there isn't a way around that other than finding the creator. We'll always be able to play it in version 1.17 :)
The next time I play Wc3 with my friends, I'll try to remember this version of Warchasers and have us play it. We considered the original one last time, but it didn't happen. Hopefully I'll get them in on it with this version. Keep up the good work!
 
Level 1
Joined
Aug 5, 2015
Messages
8
thank you for this :)
I wonder if there is a way to revive a fallen hero? I'm was playing the original warchasers with 3 friends, but everytime one is dying because he was not careful and we have to restart... I thought about editing the map and adding more free Ankh of Reincarnation, but I think a cheat or a checkpoint that revives fallen players would be even better.
Now my questions:
1) Is there already a way to revice fallen players I don't know?
2) When I open your map in default world editior, I get 4 error messages that sth wasn't found, 2 times elfvilliagerwoman and 2 times revenant. Is this important? I just wonder if I could add those Ankhs to your map to make it easier, but I fear because of those errors the map might get unplayable when I save it?
 
Level 1
Joined
Aug 5, 2015
Messages
8
thank you, I will try it :)

How does localization work? The original warchaser is in my language (german), while your edited version is english. Is there a way to make it german again?
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
thank you, I will try it :)

How does localization work? The original warchaser is in my language (german), while your edited version is english. Is there a way to make it german again?
They probably released the localized WarChasers maps. You'd have to send me your version of Warchasers in German, and I'd apply the same changes to it that I did to the English version. Shouldn't take more than an hour I'd say.
 
Level 1
Joined
Aug 5, 2015
Messages
8
They probably released the localized WarChasers maps. You'd have to send me your version of Warchasers in German, and I'd apply the same changes to it that I did to the English version. Shouldn't take more than an hour I'd say.
ah no, I can not ask that much work from you. I really wonder how that editor is so powerful, but its not possible to simply copy paste a localization file into it?
Anyway, I will play it in english then :)

btw what do you mean with "they probably released localized WarChasers maps"? If I remember right, I already played this map in german ~10 years ago.
 

Bribe

Code Moderator
Level 50
Joined
Sep 26, 2009
Messages
9,456
ah no, I can not ask that much work from you. I really wonder how that editor is so powerful, but its not possible to simply copy paste a localization file into it?
Anyway, I will play it in english then :)

btw what do you mean with "they probably released localized WarChasers maps"? If I remember right, I already played this map in german ~10 years ago.

In this case localization isn't just updating a game file. They must have many different Warchasers maps, each of them with unique languages. There's ni quick way to convert languages in acl WC3 map file.
 
Top