A single ChatScript server can dish hundreds of volleys per second (with Windows doing about twice as many as Linux). Since users can’t type that fast, this means it dishes hundreds of users per second. And it makes no difference whether you have a single bot or multiple bots.
Multiple bots can each have their own topics and can share topics and share responders.
topic: ~music [song] # this topic can be used by all bots
topic: ~food bot=ben [sandwich] # only ben can use this topic
topic: ~food bot=barry [sandwich] # only barry can use this one
Within a topic, to write a responder that can say different things based on which bot you have, one could do this:
u: (sandwich) if ($bot == ben) {$choice1 = true} else {$choice2 = true}
[$choice1 Ben says this.] [$choice2 Barry says this.]
But there are various flaws with this design. First, assuming that $choice1 and $choice2 are intended to be locally used, one should have said $$choice1 and $$choice2 so the values disappear at the end of the volley. Otherwise some other responder on a different volley may find values true that shouldn’t be, e.g.,
u: (sandwich) if ($bot == barry) {$choice1 = true} else {$choice2 = true}
[$choice1 Ben says this.] [$choice2 Barry says this.]
Second, the [] [] construct is intended to randomize things, but no randomization happens here. This would be better written (faster and clearer) simply not using [] such as:
u: (sandwich)
if ($bot == barry) {Barry says this.}
else {Ben says this.}
Another flaw: why set these variables locally. If they reflect which bot you have, you can set them once at bot initialization time:
outputmacro: ben()
$bot = ben
$ben = true
And once you have the choice variables as globals, then your responders are simply:
u: (sandwich) [$ben Ben says this.] [$barry Barry says this.]
This works equally well for a mood-based bot:
u: (sandwich) [$ben-angry Angry ben says] [$ben-happy Happy ben says]
But when you have a lot of bots that say long paragraphs, you can overload the size constraints on a responder. There is another way that doesn’t.
u: (sandwich) ^refine()
a: ($bot=ben) This is ben.
a: ($bot=barry) This is barry.
Of course one could have used the $ben and $barry variables to avoid the equality test. And you can have bots with moods like this:
u:(sandwich) ^refine()
a: ($ben) ^refine()
b: ($ben_mood=angry)
b: ($ben_mood = happy)
a: ($barry) ^refine
Topics also have size limits, but they are easy to handle just by nesting a topic:
u: (sandwich) ^respond(~sandwich_topic)