Botters of the Galaxy (CC02) - Feedback & Strategies

Before I give my opinion, let me congratulate the three creators @wildum @Illedan and @AntiSquid, the two additional testers @csj and @nmahoude and the three winners @Saelyos @ValGrowth and @reCurse .

The - (I remember a French teacher in school tell me to always finish with pros if you like a thing…)

  • Instability: too many bugs. I guess we needed one more week for tests. CG is faulty there; we were late on the toolkit stability and then couldn’t test the game enough. The amount of different complex rules didn’t help…

  • Complexity: too many rules, big statement, big stub, big referee. Hey, I play HoTS, do you expect me to like items, denying and last hitting? :stuck_out_tongue: Seriously though, we could have made a better onboarding (more wood leagues) to slowly introduce every rules and make the game more digestable.

The +

  • The team: the 3 creators were incredible. I can tell you that they worked a lot to produce the best game they could. They hot-fixed most of the bugs pretty quickly. They streamed. They did support on chat/forum…

  • The type of game: I understand complaints about the asymmetric character of the game. While it can hurt a bit the top competition, I find it great because it’s very different from what we have on CG.

I finished at rank 51 in Legend (2nd time \o/) and even reached the 2nd place on Friday afternoon. I wish I could code during the weekend and aim for top 20, but I stopped coding on Thursday night (family stuff). The creators must find my ranking funny because I told them on Monday I didn’t really like the game. Let me explain…

I forced myself during the first weekend to code a first AI and get to bronze but I was close to give up because it felt overwhelming. There was no way I could handle everything (not that I needed to). Ellipses in the statement didn’t help.
Finally, I managed to get Bronze and decided to try a few spells. I went directly for Valkyrie (isn’t she great?) and Dr Strange for the PULL-SPEARFLIP combo. Objective was to one-shot squishy targets. I continued with this start because it was very efficient vs Ironman-DrStrange which was the meta.
I think I was one of the first (if not the first) to make it work efficiently. I didn’t care at all for LH or jungle. This got me top 100 on Wednesday. Prioritizing Dr over Ironman (dat %$* BLINK) and playing backwards vs full melee got me to top 5 on Friday.

I liked the game; it was fun. And I’ll be happy to play it more when we release it (soon).

@freecode unless told otherwise, I’ll give your T-Shirt to @Petras2 (rank 22)

8 Likes

I ended 22th in legend

Thanks for the contest AntiSquid, Illedan, Wildum and Freecode for giving me that T-Shirt(it’s my first contest in legend a well as a T-shirt)(I was one place bellow from the T-Shirt range ).

It will be very interesting to see what kind of strategies will develop when the contest goes live again in multi.
So I will briefly tell my strategy that got me so high up(in my opinion).

My Strategy:(I used Strange+Ironman)

First of all I have a function isSafe(), that just returns true/false.
I’m not safe, if I’m in range of towers, infront of my units or my dist to my unit is > than to enemy Units(heroes, troops).

If I’m not safe I just go to a bush that is closest to my tower.
If I’m safe I go behind my troops :

How I select behind what troop to hide :

First, it has to have at least one more troop in its range and I choose the one that is closest to the enemy tower.

How I choose where to stand behind him :
int vx = (troop that my unit is targeting).x - (my chosen troop).x;
int vy = (troop that my unit is targeting).y - (my chosen troop).y;
vx,vy /= distance between those troops;
vx,vy= -1;*
vx,vy=my_troop_movement_speed;*

I almost always use MOVE_ATTACK x y (closest enemy or deny).
My deny algo is dumb just check if I can deny, then deny, same with last hitting.
But if I can deny and last hit, first of all, I deny.
My spells:
I use all of them except burning for Ironman. ( I thought it was not worth my mana.)
1. I use blink, always when I can, if to_go_dist > bling.range, I use it.(restores mana.)
2. Aoheal - I only use on my heroes.(Prefered if 2 heroes are together. )
3. Fireball - always. (Sometimes to lure groots to enemy)
4. Pull - always, if I have at least one unit nearby.(Prefered Strange or lower Hp hero.)
5. I use shield, after I have been puled by Strange or both enemy heroes are attacking me.

Store :

I buy items which has mana > 70, that’s it + I always leave one spot free - for potions.
I buy mana potions - only on ironman.
I only buy mana potions and regular items just for Ironman(Because fireballs are OP. )
I buy health, if my health < maxHealth * 0.7f && item.health + myHealth < maxHealth.
That’s all about it(1k lines of code)
There was some more hard coded strategies to avoid Hulk or Groots.

Sum up :
It was a heuristic friendly contest, even though after mean max I got into sims and I wanted a sim contest with a grid. But I still enjoyed it. I once again thank Freecode for giving his T-Shirt to others! It was really frustrating as I was 0.06 score away from him if I recall correctly… :smiley:

5 Likes

Hey, I still can’t realise that I won :slight_smile:

Here’s my PM : https://github.com/Saelyos/BottersOfTheGalaxy
If you have any questions about it, feel free to ask !

13 Likes

Thinking about change my nickname to freeTShirt…
Sure, as I said that was a goal to stop - give it to @Petras2, he said he will wear it with care LOL
btw I really think it’s really a @Wildum one, even if he is a creator, I don’t agree that they shouldn’t take part:)

@pb4 - tactics… I’ll describe, to be honest I don’t remember everything in details, I even did push on a server bunch of changes without any testing:
0. I used attack_nearest to attack creeps or heroes. Imagine, attack nearest and with this I reached legend!

  1. Always stay behind my creeps. If no creeps between my hero and enemy tower - RUN to my tower
  2. I had one formula only - ‘toughness’, which I compare for my hero versus enemy (separately). Both my doctor strange and ironman always RUN to my tower if they see that enemy will win the potential fight
  3. If I fight versus 2 melee heroes, RUN back to tower if distance from it is more than ~500. Just RUN.
  4. I sorted items by damage and did buy new until I had 3. didn’t sell anything, last place I used to take health if less then 1/3 of hp
  5. I used skills just if no cooldown and some enemy in range. Just on cooldown!

All these I wrote very fast, and was even on the 1st place with it.
That several things which I added to run into legend:

  1. Stupid abuse with groots to beat legend boss. Just fireball to some Groot closer to enemy than to my hero. Funny part here: till that time I didn’t yet read/store bushes and spawn location :slight_smile:
  2. Changed items sort by damage to sort by max mana.
  3. Gave the different location for heroes near my tower - this way when they start to RUN back they always become on different ‘lanes’. And then combining with attack_nearest they keep separately.

I think that I spent on writing two posts and read answers on forum more time than I spent to write that code :confused:

When I saw that I got 3rd place again with this ‘strategy’ in legend, I really decided to stop because it looks only @reCurse tried to play this game serious.

Criticism: my main concern I did describe in previous post. The game is completely unbalanced (with abuses, meh) and has very complicated rules for the contest.
And it was a serious problem with visualization - hard to see if any skill is used, was not clear who attacks whom, units stacks etc.

I understand that guys spent a lot of time on creating it, but for me it was not fun and not challenging, sorry :frowning:

8 Likes

Again. Thanks for sharing.

We wanted to visualize cooldowns … actually i will detail all the things we went through in a blog post, hopefully.

I was…
2 nights without sleep…

4 Likes

What do you mean by exactly by “serious” ?

While i agree with you for most of the points, i don’t think “abusing” of a strategy is not serious playing. For example if we look back at codebuster, Recar won with a “secret tactics” he hide during the whole contest. And i don’t think we can say that Recar is not a serious player :smiley:

2 Likes

I wrote up a full post-mortem of my experience in the competition.

Dissecting my Rusty Superhero Bots — A contest post-mortem

I talk about my experience on the stream, how I apporoached the coding, and a followup about using Rust.

6 Likes

Magus answered for me :smile:. I will add:

  • differents sprites for melee and range units to distinguish them
  • sprites for all spells, some color adjust for example or an icon with opacity on a hero for shield, particles or horizontal lines animation for ironman blink
  • sprite evolution when groot go stronger
  • a debug mode with only circle colors for unit and their range, move line, something to know target

As i said before, the game is very fun but the viewer is really important to understand what’s going on and currently only hardcore gamers will spend some times analysing logs. I think we could have more players with a better viewer and rules introduced slower

1 Like

Thanks @wildum @Illedan and @AntiSquid a lot for the contest, especially seeing the amount of work you guys put in it. It is very exciting to see challenges that change so much every times.

I finished 9th in legend. It is my best rank so far :slight_smile:

For me this contest was a bit unusual. At the start I was unmotivated seeing the complexity, I was convinced that only heuristics would be successful, and I always do very badly on those kinds of game in the past. Anyway, I decided to try doing full simulation, and worked on it quite slowly. Near the end of the contest (Saturday) I finally had my simulation and minimax algo working, and from then, I really enjoyed the game. It is the first time where I did not felt stuck, and I succeeded in constantly improving my bot. I only regret not having enough time to tests all the ideas I had in the end and not being able to keep up with all the strategies that where being submitted by other players until the last moment.

Seeing the complexity (of the rules but also of the resulting interactions), I think 10 days was too short but I think it could be a great multi.

One tiny remark: it would have been nicer IMHO if we were provided the full state…

My bot algorithm was a minimax (me playing first, with alpha beta pruning and reusing best actions previously found). I used a full simulation but I ignored the missing hidden states except the groot aggressiveness (I did not have time to try to recover them). To increase the search depth I used a very limited set of moves for each hero and I restricted my search by doing a minimax for each of my hero using only the closest enemy hero. I used previously found actions for the heroes not under search. The average depth I was reaching was around 3 simultaneous turns (I only reached about 2 to 4k simulations per 50ms, no optimization). The simulation was a straight forward port of the java code to C++.

I chose Hulk and Doctor Strange as heroes and never really tried anything else. My only motivation in choosing them was that I though that the parameter of their skills seemed easier to guess :wink: (no complicated position to compute).

My eval was dead simple, I simply summed up all the properties of every unit with a coefficient per property with the right sign. I simply chosen 10^x values using my intuitions and nearly never changed them (not enough time). Starting from Gold, I also took into account the sum of the potential damages of all the unit in range for each hero. That improved my bot a lot. My eval was symmetric between me and my opponents.

Due to the low number of simulations I could do, I used two set of moves: a limited set for the first depths (2 depths for me, only 1 for my opponent), and a very limited set for the remaining depths. In the end (legend), I decided to never attack the towers nor the groots. When I attacked a unit (hero/lane unit), I always used ATTACK_NEAREST except for skills where I targeted only heroes and, for some, the center of both heroes. I used BUY when possible and always kept one place empty for potions. I never used SELL. The only pure MOVE was to go back to the safe tower.

If you have any questions, feel free to ask !

8 Likes

For multi, try to use MOVE_ATTACK. With this command you can improve your farm, hitting the enemy Lane unit after your Lane units. It improved a lot my farm…

Hi ! I didn’t receive the t-shirt email yet. Is it only me or is it delayed for some reason? My wife is pregnant and the CG t-shirt will be the first gift I give to my soon-to-be-born child :slight_smile:

Thanks !

4 Likes

ahah. They should be sent this afternoon. Also @Saelyos has decided to give the T-Shirt to the next person in the ranking, hence @KimOlegan (rank 23)

@AntiSquid When will multiplayer/bot-programming version be available?

If you don’t want to wait, see here.

4 Likes

What is this? I mean what’s the status of this ide/demo? What does id 516862f813ed3bc2f9d992ad29f7e8aa4e1cf5 mean? What are restrictions there, and how does it differ from ordinary multiplayer/bot-programming?

There will be a few balancing changes for the multiplayer game. This link is for testing. Games are usually added on Wednesday, but I can’t tell you if it will happen tomorrow.

3 Likes

…And next contest is named «Code Royale».

Different team is working on that contest. It was planned long before you thought of asking about it.

1 Like

So it is now confirmed, that “Code Royale” refers to “Clash Royale” and not “Battle Royale” or “Casino Royale”.

5 Likes