+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (this.numPlayers = Number(
+ (e.target as HTMLInputElement).value,
+ ))}
+ />
+ ${this.numPlayers}
+
+
+
+
+
+
+
+
+
+
+
+
+ (this.bots = Number((e.target as HTMLInputElement).value))}
+ />
+ ${this.bots}
+
+
+
+
+
+
+ (this.maxTicks = Number((e.target as HTMLInputElement).value))}
+ />
+
+
+
+
+
+
+
+ (this.renderMatch = (e.target as HTMLInputElement).checked)}
+ />
+ ${this.renderMatch
+ ? "Will render 1 match (slower)"
+ : "Headless (fast)"}
+
+
+
+
+ ${!this.renderMatch
+ ? html`
+
+
+
+ (this.numMatches = Number(
+ (e.target as HTMLInputElement).value,
+ ))}
+ />
+ ${this.numMatches}
+
+ `
+ : html``}
+
+
+ ${this.isRunning
+ ? html`
+
+
+
+
+ Match ${this.completedMatches} / ${this.totalMatches}
+ completed (${this.totalMatches - this.completedMatches}
+ running on worker threads)
+
+
+
+ `
+ : html``}
+
+
+ ${this.batchResults.length > 0
+ ? html`
+
+
+
+ Results (${this.batchResults.length}/${this.totalMatches}
+ matches)
+
+
+ ${this.getProfileName(this.selectedProfileA)}:
+ ${profileAWins} wins
+ vs
+ ${this.getProfileName(this.selectedProfileB)}:
+ ${profileBWins} wins
+ ${draws > 0
+ ? html`(${draws} draws)`
+ : html``}
+
+
+
+
+ ${this.batchResults
+ .sort((a, b) => a.matchIndex - b.matchIndex)
+ .map(
+ (r) => html`
+
+ #${r.matchIndex + 1}
+ ${r.result.winnerProfile
+ ? html`
+
+ ${r.result.winnerPlayerName}
+ (${this.getProfileName(
+ r.result.winnerProfile,
+ )})
+
+ `
+ : html`Draw`}
+ ${r.result.ticksElapsed} ticks
+
+ `,
+ )}
+
+
+
+ `
+ : html``}
+
+
+
+ ${this.isRunning
+ ? html`Running ${this.totalMatches} matches...`
+ : html`
+ 1 ? "es" : ""}`}
+ @click=${this.startCalibration}
+ >
+ `}
+
+
+