This bot is pretty good at Watcher | Slay the Spire
HTML-код
- Опубликовано: 7 сен 2024
- 🏃The final character is here. Logan and Robert sit down to watch a run and provide casual commentary.
If you're feeling a bit lost, check out the introduction video to the bot here: • We made a bot! | Slay ...
🗣️ If you’ve got questions or comments, let us know!
👨💻 The bot is written in Python, uses the CommunicationMod by ForgottenArbiter, and it only knows the same information a human would!
I like that at 1:28 in shop the bot just goes “fuck no, i don’t want to think hard for that” and remove the conjurblade
yeah,thats how i woulda done it
Better watch out then! AI is coming for your gaming 👀
+2
Egg references everywhere
@@BottledAIlmao
I especially enjoyed seeing the bot pause to run through stuff at certain points, that was pretty cool to imagine it thinking haha
Haha if you like it when the bot takes a long time to calculate, consider checking out this uncommented earlier vid: ruclips.net/video/FmwfSu4Er1M/видео.htmlsi=iGCzVCz8yC1GiGz9
Lots of playable cards in hand make for a long calculation time 😄
This is an extremely impressive run. I was thinking about how it was probably better than me at this character and then you talked about it's current win rate, this bot is absolutely better then I am.
Thank you for your kind words!
Super cool to see how far the bot has come, especially with how much more complex Watcher’s card pool is. Hoping it eventually gets a way to consistently get to act 4.
Yeah! Personally I like watching Watcher the best, because she gets to do the most complex turns so far.
Heart kill remains an ambition to achieve at some point. 😄
I'd love to see even a snippet of the code. This is fascinating
Happy to hear it! Our next step will be to make it Open Source, and then you can see allll the code!
Commenting for support, so you can get yourselves better audio setups. Great job on the bot though! 👏🎉
We will get good mics so that we can pivot to ASMR if the whole bot thing doesn’t work out!
Agreeing with this guy.
this is amazing!! so glad the algorithm picked it up, you deserve way more eyes on this project
Thank you! 🙏
Really fascinating stuff, especially considering just how many variables need to be considered to play StS optimally!
Thanks! And yeah uh... the codebase has grown quite a bit since our first version. 🙈
I figured in post AlpgaGo era of AI, we'd be more accustomed to AI beating games in spite of large parameter space.
@@michaeletzkorn AlphaGo cost around $40 million dollars, took multiple years, was made for an established game with very few parameters and had around 30 engineers working on it with the aid of a professional Go player.
By few parameters I mean it makes the same single decision a turn and makes around 40 decisions a game. In STS you do that a dozen times a floor and it's done in a dozen different ways. The decision tree is several dimensions more complicated.
AlphaGo is an outlier not the norm. This bot was made with none of that lmao
how does this have so few interactions? this is amazing
Thank you! Glad you like it! 🙏
This is so cool! My friend and I are trying to create our own "combat solver" (if that's possible lmao (it's probably not)) in python as a way for me to learn python. What were ending up doing is basically recreating spire in python and then simulating combats versus the enemies and calculating average damage taken and the best and worst cases. Of course we're starting with the most complicated class, watcher (she's my favorite character) and it's cool to see how you guys are basically telling it how to play combats, and communicate with the game versus us where we are trying to collect information about combats and doing it all outside the game! I do have a quick final question. About how long has this whole process taken you?
Can't wait to see even more progress on making your bot better! Earned a sub!
Cool! Consider publishing your results when you’ve got them. 😄
How long it has taken:
Uh hard to say. Our first discussions about it were in September 2022. We put some time into it then for several weeks, then picked up work again in 2023 for a couple months, and again this year the same. Not exactly pulling full 40-hour work weeks on it though, 😛 it’s a side project. And for the last two stints, most of the time when we are working on it, it’s only one person putting in significant time usually.
Overall though, I can say we put quite a bit of time into this! 😄
Impressive, but those skipped scrawls and vaults pain me somewhat.
Heheh, fair.
Vault specifically is actually one of the ~4 Watcher cards we didn’t implement yet. The issue was I looked at the list of interactions it has and noped out of there. We will get it in there at some point. 🙏
In case you were curious, the other Watcher cards the bot doesn’t understand yet are Omniscience, Meditate, and Foreign Influence. 😄
I'm interested to see the results of implemnting those, meditate especially as it's quite a strong card imo.
Agreed!
Let me know if you’ve got an idea for generalizing how and when the bot should use the “select card to retain” part of it.
Though… now that I’m thinking about it, I guess just selecting basically _any_ card is already valuable and gives more options for next turn, so we could just go with that and not worry too much.
Oh! That’s actually exactly what the bot would choose to do once we teach it the choose-to-retain mechanic.
Nice! Thank you for sending me on this journey.
@@BottledAIyou could choose which cards to retain by either assigning value to individual cards based on how good they are in isolation assuming they are drawn for free, or you could assign value based on how each card can interact with other cards that might be in the character’s hand next turn (weighted by how likely those cards are to be drawn, by looking at the draw pile and discard pile and such). the interactions there probably go too deep to really solve, but i think it would be an interesting challenge to figure out how to look just 1 turn forward (which, if you do really well, might even be able to be made recursive and think further ahead? the breadth would get really wide though)
Can’t wait for the next one, this one is very impressive.
Excellent work gentlemen. I have spent some time trying to create an AI for a two player card game that I like that I've been trying to digitize called "Exceed: Fighting System" and it's been very difficult b/c there are so many complex interactions to boil down into if/else statements and whatnot. I'm saying this to let you know that I understand a little about the steep uphill climb you've had to face to get to this point and what you've accomplished is truly remarkable. I imagine at this point the bot plays better than either of you do, which is a really amazing feat as well. (My win rate is somewhere around 8%)
Thank you! We hope your project goes well.
In terms of our skill compared to the bot’s: the bot is faster than we are for some kinds of battle turns, and will sometimes see more efficient single battle turns than we would. However, several other areas are still quite behind a strong human player. For example its card picking, potion usage, and mid-term battle decision-making are all still quite limited! For now we both outperform the bot, and this will likely stay that way for a long time still. 🥲
and they said it couldnt be done, amazing work!
Thank you!! It has been good fun.
This is extremely impressive!
Thank you! We had quite a bit of fun making it.
The entropic brew for 2 at 8:15 hurt to watch
I feel you. We need to improve the panic potion chugging at some point. 😄
@@BottledAI Really cool bot and video btw! I was very impressed with it, you guys did a great job. I just thought that part was really funny
I’d like to see this aı vs hearth fight
Would be cool!
We currently can’t yet recognize the burning Elite on the map, which makes it hard to go for the Heart kill.
3:25 Please train the bot to use card creation potions BEFORE using blessing of the forge potion 🔨
7:32 Did this bot just skip Scrawl?! WTAF?! Scrawl is the Watcher's best card. 🤦
Potions: Yeah potion handling is currently still very barebones. 😄 The bot just yolo panic chugs everything when some conditions are met (like seeing
a boss) and doesn’t actually know yet what most potions do. We will improve this at some stage!
Scrawl: We had some other people upset about this one too, sounds like we should adjust it. 😄
do you allow your bot to take runic dome, considering real players *do* memorise encounters and *could* calculate exact incoming damage given buffs/debuffs/strength etc?
Not currently, because we would have to give it the enemy patterns to store. It doesn’t know any of them currently - so when it’s got Runic Dome it just assumes there’s no damage incoming and goes ham. 😄
commenting for support
Yay, thanks!
Was pointed your way by folks in the STS community. Is your bot a rules based agent? Or in other words, did your bot learn from training data directly or did you program rules in to teach it how to play in the general case?
If it learned from training data, how did you generate the set of data?
For context, I'm interested in trying to build an AI myself for STS.
Hi, cool! Our bot is rules-based, informed by the training data our human brains collected over the years. 😄
I think there's a bunch of training data available in the Slay-I project, in case that's helpful for you: github.com/alexdriedger/SlayTheSpireFightPredictor
@@BottledAI This does look helpful! The link to the data in that project appears broken though :(
@@sethdeneroff6490 I think there's some included in the project itself potentially.
If you add me on Discord, I can also add you to a server where people might have more. (EDIT: I have removed my Discord username.)
@@BottledAI I believe I just sent you a friend request. I go by a different name on discord as well but for similar reasons I'd like to avoid posting here.
Really cool project, kudos guys! Would you open source the code? Would love to contribute and extend this out
Glad to hear it! That’s the next thing we will be working on, and would welcome contributions.
Very interesting/impressive guys! I was wondering if the attack pattern of the enemies and the draw pile are used for its decision making?
Possible future enemy behavior is not directly taken into account for the bot’s battle calculations - those are done mainly based on what it can currently see. There are a few special cases we have taught it for specific enemies though. For example, the bot knows it can take a couple free turns against Lagavulin before waking him up.
The possible contents of the draw pile contents are not currently used, though the bot does know that it’ll lose things it might want from the discard pile (relevant with e.g. All For One) if we force a reshuffle.
This bot is "pure clockwork", with no ML/NN component?
Correct.
In some places it makes decisions with a simple prioritized list, in some places with a few/several basic conditionals, and in combat it picks the preferred outcome from among the (many) options it calculates using a graph traversal of the different possible card plays. It can calculate the outcomes because it can simulate the result of play in much the same way a player would when looking at their hand, because we’ve taught it most cards/powers/relics. The evaluation of outcomes is done by checking about 30 different scores (e.g damage dealt, damage taken, etc) and picking which is most desirable given the criteria we give it.
Where will it be announced if this goes open source?
At least with a video here. We will post in other places as well but they don’t always get much visibility!
what ascension are you playing on?
It seems to be ascension 0, altho it should not really affect much other than map pathing (?)
Yeah, Bottle currently plays on Ascension 0!
Us creators both play on 20, and uh, don’t tell him I said this, but Logan is significantly better than I (Robert) am.
what a waste of time. I don't know any easy way to say it.
You're being an asshole online for no good reason. I'd suggest reflecting on yourself and why you're acting this way.
I hope you enjoy the next video you watch more! 🙂
Quiet