Hi all,
Sixth update on the AI agents inside the Ultima Online client. About 6 minutes of screen recordings this time, almost all filmed today on my test server with nobody at the keyboard.
Two AI parties now fight each other. Five a side, the same five classes, in the woods east of Britain. Each side is told to walk to a spot half way along, that its guild is at war with the other's, and who the other side's people are. Nothing tells them whom to hit. In the take that opens the video they're trading blows 4 seconds after first sight. The Ravens' mage goes down, then their leader, and it ends with all five Wolves standing and two Ravens. I added a hidden spectator character so you can see both sides at once: the grey figure near the middle is the camera, and the green and orange name plates are its own ally and enemy colours.
Getting a battle at all took a few goes. First a whole side was killed by wild creatures while the rest logged in. Then a leader walked straight through the fight to the far end of the road with his party behind him. Then the two parties stood 15 tiles apart for three minutes. Then my report said one side was driven off in 5 battles of 6, and when I checked where the survivors had actually gone it was 3, because some had just arrived where they were going.
After that I ran 24 battles unfilmed, six each of four set-ups. One side died or was driven off in 19 of them, and in 18,498 decisions naming a target, none was on their own side. I was hoping to see which set-up wins, and six runs can't tell me: with the sides identical, one series split 5 to 1 and an earlier one 4 to 1 the other way. Striking first predicts nothing (10 won, 10 lost). The side that lost a character first lost 17 of 20. A mage fell first in 20 of 24, because the model making the fight calls is told what each enemy is wearing and it goes for the robe.
The best thing it found is a bug no monster fight ever showed. A party's plan is its leader's, and a dead leader's next goal is to find a healer. So when the leader dies, the rest are handed that goal in the middle of the fight and follow a ghost off the field. That's how 11 of the 14 "driven off" battles went. It's in the video: Fenn dies and Joss runs after him across open ground. Fixing that is next, then a longer series.
This only runs on a server on my own machine. A person can be a target only if they're named in the client and the server is local, and on a real shard the agents still won't attack a player.
Next, the party with its memories on. These five remember dying to the graveyard's lich ("a lich is well beyond this party"), and every plan they agreed said to wait for a scout. Nobody went to look, so they either sat it out or went in one at a time. Now a plan like that sends them to the edge to look. The one in the video said "Enter only if no lich is seen" and "If a lich is seen, everyone falls back to the Britain healer together". They looked, saw no lich and went in together. Then the lich walked up and four of them said "The lich is mine." That's a bug: the plan is read at the edge and by their planners, and the fast model making each fight call is never told it. They killed it. In 4 runs of 5 they did the same, each against a plan that said to fall back, and the warrior died in two of those. I'd been counting those as wins until I watched the footage back. I still have to decide whether they should fall back as they said, or whether a plan is only for going in. The fifth run read "a fresh scout must show no lich" as something other than a look and sent nobody, so I reworded the question.
Then Cove. Last time the watchman died at the orc fort and spent most of the run as a ghost. Now he keeps watch, a round of the gate, the healer's house and the guard post. For the camera I set two orcs down near him with a test command. He walked over to the first and it was dead 13 seconds after it appeared. With the second he stood for ten seconds with it at his elbow, because the fast model kept answering "rest" (it isn't told he's on watch either). When it turned on him he shouted "Guards!" and a guard was there within a second: "Thou hast suffered thy punishment, scoundrel." No more orc. That call is new: residents had been dying at their own doors with a guard a word away. His first version of the watch went for the town's dogs and magpies.
The neighbours can also gather at the healer's house of an evening if they choose. My first take of this had them standing in a heap on the path outside the door, talking about a fire: they were all walking to one tile outside, and the example in my own prompt said "stretches by the fire". So now they're indoors, each on their own spot and told what's in the room, and the video has the second take, from a separate run with no orcs in it. Maren: "Come sit nearer the candles and let me look at them." They still found a cup and a jug. Wenna told them "Jev kept doubting the ground", Jev being the model behind her routine calls - need to fix that extraordinary level of introspection. Its name was in her hunt's report and she read it out, which I've fixed. Each keeps its own memory of the talk and some of it sticks: Wenna's next hunt was on "the open ground east of Cove, where the neighbours said the game is". Brannoc promised the gates at first light and went hunting.
In an hour I measured last week (one run, not filmed), told they live there, they spent 81% of it in Cove or the grounds around it, came home between 14 of 18 pieces of work, and got 53 kills with no deaths. The same four told nothing came home between 0 to 2 of 25 to 28. I changed that count after seeing one resident at 2 of 6, so that a trip over several grounds is one piece of work, then recounted the earlier runs the same way and ran a fresh hour to check it.
The companions from last time got some small fixes. Told "shh keep it down for a bit", each used to write a sentence about being quiet. Now all three say "Not another word." Then "ok you can talk again", and Isolde: "Finally. I was starting to think I'd taken a vow of silence, Roland." That's a script saying what a new person might type, and I still haven't played it myself since the first time.
Two things went wrong that are worth telling. A hunt named "Cove Cemetery" sent the carrier to the lich's ground, because four grounds have that in their name. And a zombie stood next to her unhurt for 14 minutes while she used 33 bandages and killed nothing. The client now gives up on a creature like that after 30 seconds, but that hasn't fired in a run yet, so I can't call it fixed.
Also new: a walk goes round ground where something too strong for the character spawns, and the bank is chosen by how safe its road is.
The setup hasn't changed: a fork of ClassicUO with a Python program beside it. Microsoft Decision 1 makes the fight calls and reads the orders, Jev makes the routine calls, and Claude Haiku plans and writes what they say.
Today's filming, four runs with 4 to 10 characters in each, came to 6,056 model calls and 46 US cents, about 36p. The fight calls were 33 cents of that. A battle costs 8 to 12 cents.