• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 21:48
CEST 03:48
KST 10:48
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL21] Ro24 Preview Pt2: News Flash10[ASL21] Ro24 Preview Pt1: New Chaos0Team Liquid Map Contest #22 - Presented by Monster Energy18ByuL: The Forgotten Master of ZvT30Behind the Blue - Team Liquid History Book20
Community News
Weekly Cups (March 23-29): herO takes triple6Aligulac acquired by REPLAYMAN.com/Stego Research8Weekly Cups (March 16-22): herO doubles, Cure surprises3Blizzard Classic Cup @ BlizzCon 2026 - $100k prize pool51Weekly Cups (March 9-15): herO, Clem, ByuN win4
StarCraft 2
General
Team Liquid Map Contest #22 - Presented by Monster Energy Blizzard Classic Cup @ BlizzCon 2026 - $100k prize pool What mix of new & old maps do you want in the next ladder pool? (SC2) Aligulac acquired by REPLAYMAN.com/Stego Research Weekly Cups (March 23-29): herO takes triple
Tourneys
RSL Season 4 announced for March-April Sparkling Tuna Cup - Weekly Open Tournament StarCraft Evolution League (SC Evo Biweekly) WardiTV Mondays World University TeamLeague (500$+) | Signups Open
Strategy
Custom Maps
[M] (2) Frigid Storage Publishing has been re-enabled! [Feb 24th 2026]
External Content
The PondCast: SC2 News & Results Mutation # 520 Moving Fees Mutation # 519 Inner Power Mutation # 518 Radiation Zone
Brood War
General
BSL 22 Map Contest — Submissions OPEN to March 10 so ive been playing broodwar for a week straight. Klaucher discontinued / in-game color settings BGH Auto Balance -> http://bghmmr.eu/ Pros React To: JaeDong vs Queen
Tourneys
[Megathread] Daily Proleagues [ASL21] Ro24 Group E [ASL21] Ro24 Group F Azhi's Colosseum - Foreign KCM
Strategy
What's the deal with APM & what's its true value Fighting Spirit mining rates Simple Questions, Simple Answers
Other Games
General Games
Stormgate/Frost Giant Megathread Starcraft Tabletop Miniature Game Nintendo Switch Thread General RTS Discussion Thread Darkest Dungeon
Dota 2
The Story of Wings Gaming Official 'what is Dota anymore' discussion
League of Legends
G2 just beat GenG in First stand
Heroes of the Storm
Simple Questions, Simple Answers Heroes of the Storm 2.0
Hearthstone
Deck construction bug Heroes of StarCraft mini-set
TL Mafia
Mafia Game Mode Feedback/Ideas TL Mafia Community Thread Five o'clock TL Mafia
Community
General
US Politics Mega-thread Russo-Ukrainian War Thread The Chess Thread NASA and the Private Sector Things Aren’t Peaceful in Palestine
Fan Clubs
The IdrA Fan Club
Media & Entertainment
[Req][Books] Good Fantasy/SciFi books [Manga] One Piece Movie Discussion!
Sports
2024 - 2026 Football Thread Formula 1 Discussion Cricket [SPORT] Tokyo Olympics 2021 Thread General nutrition recommendations
World Cup 2022
Tech Support
[G] How to Block Livestream Ads
TL Community
The Automated Ban List
Blogs
Broowar part 2
qwaykee
China Uses Video Games to Sh…
TrAiDoS
Funny Nicknames
LUCKY_NOOB
Iranian anarchists: organize…
XenOsky
FS++
Kraekkling
Shocked by a laser…
Spydermine0240
ASL S21 English Commentary…
namkraft
Electronics
mantequilla
Customize Sidebar...

Website Feedback

Closed Threads



Active: 10139 users

Custom map/ UMS creators wanted

Forum Index > BW General
Post a Reply
1 2 3 4 5 Next All
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-27 01:08:11
April 25 2017 00:30 GMT
#1
+ Show Spoiler +
I'm a programmer (not a pro-gamer) working on a new tool which will drastically expand the capabilities of UMS maps as well as make authoring way easier (no more trigger bullshit). It doesn't use EUD, doesn't require client mods and can't be patched out. The tool is quickly becoming usable and I need someone to help me with testing and feedback. Let me know in this thread if you're interested to help. Experience with SCMDraft 2 and/ or the Blizzard editor as well as (really) basic programming skills are required.


EDIT: Initial version has been released. Check out this post for info - http://www.teamliquid.net/forum/brood-war/521681-custom-map-ums-creators-wanted#19
biryusky
Profile Joined September 2012
70 Posts
April 25 2017 01:57 GMT
#2
if you have source code on on a github repository (either private or public) maybe i can take a look. What language did you write this tool with?
integral
Profile Blog Joined February 2009
United States3156 Posts
April 25 2017 04:24 GMT
#3
I'm curious but skeptical, especially of claims that you can "drastically expand the capabilities of UMS maps". We at staredit.net have pretty well pushed UMS mapping to its limits already. That said, if you can back up your claims, I'll help with both testing and feedback.
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-25 13:40:39
April 25 2017 11:33 GMT
#4
On April 25 2017 13:24 integral wrote:
I'm curious but skeptical, especially of claims that you can "drastically expand the capabilities of UMS maps". We at staredit.net have pretty well pushed UMS mapping to its limits already. That said, if you can back up your claims, I'll help with both testing and feedback.


I've created a programming language, IR and a compiler. It takes the source code + a .scx and produces a new .scx. In its essence it's a virtual machine running on triggers. It doesn't offer any new features per se (like EUDs) but you can create much more complicated behaviors and logic than with hand-made triggers as it's a real programming language with variables, expressions, loops, functions, etc.

Here is a simple example I can compile and run right now (image because the forum software messes up the formatting):
[image loading]

And by the way the resources on staredit.net (especially the wiki) have been absolutely essential for creating this, I am so grateful to your community!

On April 25 2017 10:57 biryusky wrote:
if you have source code on on a github repository (either private or public) maybe i can take a look. What language did you write this tool with?


Give me your GitHub username and I'll add you to the repo. The compiler is written in modern C++.

As a sidenote, I will open source everything in the coming weeks (days), as soon as it's in a semi-finished state.
BlueStar
Profile Blog Joined August 2005
Bulgaria1169 Posts
April 25 2017 11:42 GMT
#5
Looking forward to this !!
Please, make poker defense on steroids
Leader of the Bulgarian National SCBW/SC2 team and team pSi.SCBW/SC2
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-26 12:38:23
April 25 2017 22:10 GMT
#6
After some more work today stuff like this works now:

global allowedSwaps = 3;

bring(Player1, AtLeast, 1, TerranMarine, "TestLocation2") => {
if (allowedSwaps == 2) {
print("Sorry, you have no more swaps left.");
return;
}

allowedSwaps--;
kill(TerranMarine, Player1, 1, "TestLocation2");
spawn(ProtossZealot, Player1, 1, "TestLocation");

print("Here is your zealot.");
}

bring(Player1, AtLeast, 1, ProtossZealot, "TestLocation2") => {
if (allowedSwaps == 2) {
print("Sorry, you have no more swaps left.");
return;
}

allowedSwaps--;
kill(ProtossZealot, Player1, 1, "TestLocation2");
spawn(TerranMarine, Player1, 1, "TestLocation");

print("Here is your marine.");
}

fn main() {
spawn(TerranMarine, Player1, 1, "TestLocation");

while (true) {
poll_events();
}
}
biryusky
Profile Joined September 2012
70 Posts
April 25 2017 23:30 GMT
#7
check your pm, ive mailed you my github username
Psyda
Profile Joined April 2017
1 Post
April 26 2017 01:50 GMT
#8
Sounds interesting. I'd like to be apart of this.
integral
Profile Blog Joined February 2009
United States3156 Posts
Last Edited: 2017-04-26 01:54:20
April 26 2017 01:52 GMT
#9
Interesting. A lot of that code looks very similar to current triggers. I'm also concerned about how flexible those functions are, I change conditions and actions constantly when I'm making a map. Adding a single condition and action to a particular function seems like it's going to be the same as writing triggers, correct me if I am wrong. A programmatic approach is helpful still, maybe even required for modern maps, so anyone who isn't using something like that will benefit tremendously. I'm currently using a simple string generator, but I suspect with similar results:

[image loading]

One thing I haven't done yet though is write macros to generate the triggers necessary for complex math between two death counts. Multiplication, division, comparison, etc. Currently I'm generating each calculation separately. If you do something like this in your program, I'm sold. This alone is useful enough to make it all worth it.

Another thing I need to do but haven't done yet is figure out how to use death counts as memory for multiple values/variables. Not having any form of memory without death counts sucks and I'm already low on death counts for a lot of maps. I'm not excited trying to think about how to store multiple values in a death count and then extract those values with addition and subtraction. Maybe you're a genius and can do this easily, here's hoping.
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-26 02:54:23
April 26 2017 02:36 GMT
#10
The code similarity to current triggers is intentional (to ease the transition for map creators). Don't be mistaken though, this is a full-blown programming language.

I'm very sleepy now (5 am here) so forgive me if I miss some important detail but here's a short explanation of how it works:

- You write your code in a high level language not unlike C++ or JavaScript. It supports local & global variables, arithmetic, complex expressions, function calls with arguments and return value, event callbacks, you name it. This all goes into a handwritten parser which outputs an AST.
- From the AST linearized IR code (basically a list of low level instructions) is generated.
- The IR language has all the instructions you'd expect to be able to implement the higher level one. Stuff like push, pop, call, ret, set, add, sub, etc + integration with the game like spawning/ killing units, checking locations, setting resources. So a piece of code gets translated to something like:

[image loading]

- This list of instructions is fed into the compiler backend which produces a bunch of triggers and creates the new map file. The actual codegen was the hard part of all this but I have it working properly (and pretty efficiently) now.

- For map makers this means calling the .exe with the map and code file which "combines" them into the final map which you can run in the game.

I feel like I'll be able to release something in a few days or a week tops with the progress I'm making. For the future there is a lot of work that can be done on optimizing the AST and IR once I'm done with all the major features.

To answer your questions specifically:

I'm also concerned about how flexible those functions are, I change conditions and actions constantly when I'm making a map


Everything can be changed instantly, recompilation takes milliseconds. You can go from code to testing in the game in 10 seconds. Also there are preprocessor macros (#define for C/ C++ people) and global variables so you can change stuff in a lot of places at once.

Adding a single condition and action to a particular function seems like it's going to be the same as writing triggers, correct me if I am wrong

Well, kind of. With the exception that you can write most stuff once and then reuse it. You can even have multiple code files so you can make a library of common functions for all your maps. Also I'm considering some kind of meta-programming (template) support in the language to make managing a lot of event handlers even less painful.

Multiplication, division, comparison, etc. Currently I'm generating each calculation separately. If you do something like this in your program, I'm sold

Yeah, you can do stuff like ((x + 15) * foo()). You can go crazy with the expressions until you blow the stack.

Another thing I need to do but haven't done yet is figure out how to use death counts as memory for multiple values/variables.

I use the death counts for player 8 as general purpose memory. It would be possible to pack more than one value into a single "register" to save on memory, though I'm not sure if you'd need that many registers (there are ~220 available) if you're not doing the triggers by hand. The compiler is pretty good at figuring out what to throw out when it's not necessary anymore. We'll have to test the tool with a non-trivial map and see what happens and figure it out from there.

I'll be back tomorrow to talk more. Anyone PM me GitHub username if you want access to the work in progress stuff.
integral
Profile Blog Joined February 2009
United States3156 Posts
Last Edited: 2017-04-26 03:31:14
April 26 2017 03:18 GMT
#11
Sounds good.

Yeah, you can do stuff like ((x + 15) * foo()). You can go crazy with the expressions until you blow the stack.

Just to be 100% clear, because this is sounding slightly too good to be true, I need the triggers themselves to do the calculating. As in, I need a function that generates the entire subtract/add trees necessary to multiply numbers using triggers. Using complex expressions to generate triggers is nice, but using your program to generate complex expressions *as calculated by triggers* is where the money is.

+ Show Spoiler +

Trigger("All players"){
Conditions:
Deaths("Current Player", "Left Wall Flame Trap", At least, 1024);

Actions:
Set Deaths("Current Player", "Right Wall Missile Trap", Add, 1024);
Set Deaths("Current Player", "Left Wall Flame Trap", Subtract, 1024);
Preserve Trigger();
}

//-----------------------------------------------------------------//
Trigger("All players"){
Conditions:
Deaths("Current Player", "Left Wall Flame Trap", At least, 512);

Actions:
Set Deaths("Current Player", "Right Wall Missile Trap", Add, 512);
Set Deaths("Current Player", "Left Wall Flame Trap", Subtract, 512);
Preserve Trigger();
}


etc. until 0, then take result (right wall missile trap) and subtract it back into left wall flame trap while multiplying or dividing by another value somewhere else, usually hardcoded since you can't exactly have a condition for every possibility without exceeding trigger limit. This is the sort of thing I haven't coded a way to cleanly generate yet, and until I see evidence (as in trigger output) of this function existing in your program I won't believe you've done it either.

I use the death counts for player 8 as general purpose memory. It would be possible to pack more than one value into a single "register" to save on memory, though I'm not sure if you'd need that many registers (there are ~220 available) if you're not doing the triggers by hand. The compiler is pretty good at figuring out what to throw out when it's not necessary anymore. We'll have to test the tool with a non-trivial map and see what happens and figure it out from there.


I'm using almost all already in most of my maps, to the point where I need to start recycling them sometimes where possible. If I had the ability to use more per register I would be able to do some pretty neat stuff with triggers that no one has done before. As an example, I have plans for a primitive AI that would be able to make attack/retreat decisions on the basis of counting non-arbitrary units per non-arbitrary location. I would use ~40 death counts per location, with calculations to extract those values and compare them, if this weren't prohibitively difficult to code.
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-26 12:31:29
April 26 2017 12:08 GMT
#12
Just to be 100% clear, because this is sounding slightly too good to be true, I need the triggers themselves to do the calculating. As in, I need a function that generates the entire subtract/add trees necessary to multiply numbers using triggers.


Exactly what I've done. The expressions are emitted as trigger chains and evaluated at runtime inside the game (as in your example). And you can do much more than just multiply two numbers. Here is the result of compiling one of my examples from the previous posts opened in SCMDraft (you don't actually need a map editor for writing the triggers, the compiler reads/ writes to the map file directly).

[image loading]

I would use ~40 death counts per location, with calculations to extract those values and compare them, if this weren't prohibitively difficult to code.


This would be quite possible to code, especially after I implement arrays which is more or less next on my list.

I'm using almost all already in most of my maps, to the point where I need to start recycling them sometimes where possible.

That's possibly because you use a register (death count) only for one thing. The language I'm making is block scoped and reuses "dead" values, so you can do more with less registers. Also temporaries from expression calculations are reused.
2Pacalypse-
Profile Joined October 2006
Croatia9530 Posts
April 26 2017 12:33 GMT
#13
This looks pretty interesting. Good work!

Btw, you can use
[code]some code here[./code]
(without a dot) to post code here in the forum, which preserves formatting.
Moderator"We're a community of geniuses because we've found how to extract 95% of the feeling of doing something amazing without actually doing anything." - Chill
integral
Profile Blog Joined February 2009
United States3156 Posts
Last Edited: 2017-04-26 13:37:05
April 26 2017 13:19 GMT
#14
The expressions are emitted as trigger chains and evaluated at runtime inside the game (as in your example).


k you're a genius, I'm sold

And you can do much more than just multiply two numbers.


keep going I'm close

That's possibly because you use a register (death count) only for one thing. The language I'm making is block scoped and reuses "dead" values, so you can do more with less registers. Also temporaries from expression calculations are reused.


Ok, I was skeptical of you, so you can be skeptical of me! Totally fair. Most are in continual use, actually, and I'm using a lot of the heroes and buildings in the map so I just can't use those. I'm more or less at the limit on everything - ccmu, strings, death counts, locations, switches, death counts, even # of triggers that can run without lag. So yeah I'm definitely at the point where I'd be needing to reuse death counts if I want to add things. What I want to do is probably an edge case though, so probably not where you'll want to focus when you're still in development.

This would be quite possible to code, especially after I implement arrays which is more or less next on my list.

One value per unit type per location and I get ~5 locations without having to reuse stuff, so I haven't even tried to mess with this. Plus I run out of triggers doing a count for every unit type. Until recently I've been pretty sure what I wanted to do is just outside the range of what's possible with the current engine, but if I (we?) can figure out a clever way to store multiple values, I can do some really neat things.
integral
Profile Blog Joined February 2009
United States3156 Posts
Last Edited: 2017-04-26 13:55:53
April 26 2017 13:27 GMT
#15
accidental double post. I'll use it to ask some more questions:

Who are you? Where did you come from? (Who the fuck writes a programming language for triggers?) Why are you doing this? What help do you need?
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-26 14:36:36
April 26 2017 14:32 GMT
#16
Who are you?

I'm Alex, I ... mod games I guess. I've participated in many modding communities and started some myself.

Where did you come from?

I used to make UMS maps with the blizzard editor when I was like 10. I think it may have helped me become a programmer. Also I played a lot of competitive SC2 a few years ago, now I'm back to Brood War.

Who the fuck writes a programming language for triggers?

People who should be working for their job instead. Also it just happens I had to write a bunch of code parsers recently so the knowledge is still fresh in my mind. The IR + codegen part is new to me so don't expect LLVM or GCC levels of sophistication, at least to start.

Why are you doing this?

I love modding and I love writing tools so it was a natural consequence. The actual decision to make this came a few days ago after I got annoyed at the limitations of a UMS map I play a lot.

What help do you need?


Testing, feedback and writing documentation. I'll setup avenues for all of this as soon as I decide to release the initial version in a few days.
nlight
Profile Joined October 2011
Bulgaria58 Posts
April 26 2017 16:19 GMT
#17
Some new stuff to show. This code compiles and runs now.

global foo = 15;

fn do_some_stuff() {
return 42;
}

fn main() {
var bar = do_some_stuff();

if (bar == 42) {
set_resource(Player1, Minerals, foo + bar);
}
}
quirinus
Profile Blog Joined May 2007
Croatia2489 Posts
April 26 2017 17:50 GMT
#18
Looks sick. Hopefully, you'll figure out a way to go past the limitations.
All candles lit within him, and there was purity. | First auto-promoted BW LP editor.
nlight
Profile Joined October 2011
Bulgaria58 Posts
Last Edited: 2017-04-27 01:08:38
April 26 2017 18:18 GMT
#19
I've decided to release my current version so I can work together with all of you to make it better.

The source code is available at https://github.com/AlexanderDzhoganov/langums under the MIT license. Compileable with any modern C++ compiler, doesn't have any external dependencies.

You can get the whole repo in a .zip file from https://github.com/AlexanderDzhoganov/langums/archive/master.zip

If you don't care about the source code and want just the tool you can get the latest .exe from https://github.com/AlexanderDzhoganov/langums/blob/master/langums.exe?raw=true

Check out the README for usage instructions + language how-to - https://github.com/AlexanderDzhoganov/langums/blob/master/README.md

Some code examples you can find in the test/ folder of the repo - https://github.com/AlexanderDzhoganov/langums/tree/master/test

As you'll see there is plenty missing at the moment, but I'm adding stuff all the time. The readme will also get updated with more info and examples as we go. I'm here to answer any questions.
RWLabs
Profile Joined March 2017
Korea (South)273 Posts
April 26 2017 22:17 GMT
#20
Awesome. I will give it a shot.
Aldaris was the good guy of Brood War.
1 2 3 4 5 Next All
Please log in or register to reply.
Live Events Refresh
Next event in 8h 12m
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
PiGStarcraft405
RuFF_SC2 143
Ketroc 60
PattyMac 18
ProTech8
StarCraft: Brood War
GuemChi 5519
Artosis 689
ggaemo 83
Bale 37
NaDa 18
Dota 2
monkeys_forever560
canceldota132
NeuroSwarm11
Counter-Strike
tarik_tv5128
Heroes of the Storm
Khaldor154
Other Games
summit1g18697
JimRising 527
ViBE92
Organizations
Other Games
gamesdonequick1106
BasetradeTV140
StarCraft 2
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
sctven
[ Show 17 non-featured ]
StarCraft 2
• Hupsaiya 137
• davetesta18
• IndyKCrew
• sooper7s
• AfreecaTV YouTube
• Migwel
• intothetv
• LaughNgamezSOOP
• Kozan
StarCraft: Brood War
• Azhi_Dahaki8
• STPLYoutube
• ZZZeroYoutube
• BSLYoutube
Dota 2
• WagamamaTV284
League of Legends
• Doublelift3296
Other Games
• Scarra652
• Shiphtur118
Upcoming Events
Afreeca Starleague
8h 12m
Wardi Open
8h 12m
Replay Cast
22h 12m
Sparkling Tuna Cup
1d 8h
Kung Fu Cup
2 days
The PondCast
3 days
Replay Cast
3 days
Replay Cast
4 days
CranKy Ducklings
5 days
BSL
5 days
[ Show More ]
Replay Cast
5 days
Sparkling Tuna Cup
6 days
BSL
6 days
Replay Cast
6 days
Liquipedia Results

Completed

CSL Elite League 2026
RSL Revival: Season 4
NationLESS Cup

Ongoing

BSL Season 22
ASL Season 21
CSL Season 20: Qualifier 2
CSL 2026 SPRING (S20)
StarCraft2 Community Team League 2026 Spring
Nations Cup 2026
PGL Bucharest 2026
Stake Ranked Episode 1
BLAST Open Spring 2026
ESL Pro League S23 Finals
ESL Pro League S23 Stage 1&2
PGL Cluj-Napoca 2026
IEM Kraków 2026
BLAST Bounty Winter 2026

Upcoming

Escore Tournament S2: W2
IPSL Spring 2026
Escore Tournament S2: W3
Acropolis #4
BSL 22 Non-Korean Championship
CSLAN 4
Kung Fu Cup 2026 Grand Finals
HSC XXIX
uThermal 2v2 2026 Main Event
RSL Revival: Season 5
IEM Cologne Major 2026
Stake Ranked Episode 2
CS Asia Championships 2026
Asian Champions League 2026
IEM Atlanta 2026
PGL Astana 2026
BLAST Rivals Spring 2026
CCT Season 3 Global Finals
IEM Rio 2026
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.