Comic Chat ovvero Microsoft Chat
A metà luglio Microsoft ha annunciato di aver rilasciato un altro dei sui software dimenticato dai più, credo: Microsoft Comic Chat.
Rabbit hole mode ACTIVATED

SIGGRAPH 1996. Mentre il mondo della grafica parla di raytracing e radiosity, tre tizi salgono sul palco a spiegare come far generare a un PC delle strisce a fumetti partendo da una chat IRC. I tre sono David Kurlander e Tim Skelly di Microsoft Research, e David Salesin dell’Università di Washington. Il paper si chiama semplicemente Comic Chat.
Siamo a metà degli anni 90 e le chat grafiche esistevano già (Habitat, WorldsChat, la V-Chat di MSN), i partecipanti avevano avatar e si muovevano in stanze 2D e 3D ma quando salvavi la conversazione, cosa restava? Un log di testo. Tutta la componente visiva andava persa. In più in quelle chat si passava la metà del tempo a fare cose che non erano chattare: navigare per trovare una conversazione interessante, ricordarsi quale tasto funzione faceva il gesto che ti serviva, evitare di finire dietro l’avatar di qualcun altro e la scena aveva sempre la stessa inquadratura.
La soluzione: il fumetto, un linguaggio visivo che tutti conoscono. Presero trascrizioni di chat vere, presero nota di tutto ciò che pensavano un computer potesse estrarre facilmente e le diedero a Jim Woodring, un fumettista, chiedendogli di illustrarle a mano. Poi guardarono il risultato e si resero conto di una cosa: non serviva capire la conversazione e bastavano regole stupide per far girare il tutto.
Le regole stupide in questione erano quelle della Netiquette:
:-)e:-(→ felice e triste- LOL e ROTFL → il personaggio ride
- IMHO → il personaggio si indica da solo
- BRB → saluta con la mano
- TUTTO MAIUSCOLO oppure
!!!→ sta urlando - “Hi”, “hello”, “bye” a inizio frase → saluto con la mano
- “I”, “I’m”, “I’ll” a inizio frase → punta verso di sé
- “You”, “are you”, “did you” → punta verso l’interlocutore
Se due regole vanno in conflitto (“Hi Sue, how are you?” dovrebbe salutare e puntare) c’è uno schema di priorità che sceglie il gesto più importante. Chi voleva fare l’override della scelta automatica aveva la emotion wheel: un cerchio con otto emozioni (coy, happy, laughing, shouting, angry, sad, scared, bored), neutro al centro e più ci si allontana più l’emozione è intensa.
La parte di composizione della vignetta è la parte più tecnica: massimo cinque personaggi per vignetta, chi parla dev’esserci sempre e chi entra nella stanza viene mostrato subito così i partecipanti sanno che è presente un nuovo utente. Per decidere chi va dove c’è un evaluation function che usa delle penalties per evitare le composizioni errate: ogni disposizione “sbagliata” costa punti, e il software cerca quella che ne costa meno. La penalty più severa è di 40 punti ed è riservata al peccato capitale di far parlare un personaggio verso qualcuno dandogli le spalle.
Per il rendering vengono usate delle bitmap separate per testa e corpo che vengono messe insieme tenendo conto dei vari offset e facendo il flipping quando necessario. Il resto segue le regole del buon fumettista: un alone bianco intorno a teste e corpi per separarli dagli sfondi fittissimi, i fumetti che avvolgono il testo hanno delle piccole irregolarità invece di essere perfettamente ovali, proprio come in vero fumetto. C’era poi un altro sistema per disegnare le codine delle nuvolette di testo che usava dei routing channels per riservare dello spazio vuoto ed essere certi che nessuna codina finisse sopra la nuvoletta di qualcun altro.
Comic Chat cercava keyword ricorrenti, da dove vieni, che lavoro fai, squadre sportive (queesta è ’na americanata btw), animali, figli e alterava la scena di conseguenza. C’era anche un meta-character, tale Greek Chorus il cui unico scopo era fare battute acide sulla conversazione altrui (che onestamente non ho capito ma che ne so io degli anni 90 in Ohio).
Greek Chorus sarebbe la ranocchietta
Dopo tutto ‘sto spiegone tecnico mi sono chiesta: si ma per fare tutte queste cosine… chemmerda mi manda questo software qui? Se fossi un utente con un client IRC normalissimo che le vignettine non le ha? La buona notizia è che usa il protocollo IRC standard (RFC 1459) PERÒ le informazioni non testuali (gesti, espressioni, bitmap index) sono codificate come stringa davanti a ogni messaggio. Sì, occhei, definiamo “stringa”.
Non è male come avevo immaginato comunque
Ora che abbiamo la stringa ed il sorgente possiamo decodificarla!
L’encoder (ci chiama così? Bo…) si trova in protsupp.cpp:
#define CGESTUREPREFIX 'G'
#define CEXPRESSIONPREFIX 'E'
#define CREQUESTEDPREFIX 'R'
#define CMODEPREFIX 'M'
#define CTALKTOPREFIX 'T'
La stringa completa è:
(#G <torsoIndex> <torsoEmotion> <torsoIntensity> E <faceIndex> <faceEmotion> <faceIntensity> [R] M <modeByte> [T<nick>,<nick>...])
G— gesture: tre byte che descrivono il corpo (indice della posa, emozione, intensità)E— expression: tre byte per la testaR— flag presente solo se la posa è stata scelta manualmente dalla emotion wheelM— mode: say / think / whisperT— compare solo sussurrando o parlando a persone specifiche, seguito dalla lista di nickname separati da virgola
Nel file avatario.cpp invece ci sono emotion ed intensity.
Quindi (#G7::E810M1) si legge così:
| field | raw | value |
|---|---|---|
| torso | 7 : : |
posa 7, emozione 10 (EM_WAVE), intensità 10 |
| face | 8 1 0 |
posa 8, emozione 1 (EM_HAPPY), intensità 0 |
| R flag | assente | nessun override manuale |
| mode | 1 |
say |
Comunque, la funzione per spegnere queste stringhette c’è e si chiama g_bSendComicsData che però di default è accesa dunque, a meno che qualcuno non si mettesse a frugare un pochino in giro, almeno per un pochino spammava messaggi con caratteri strani, fino a che qualcuno (sicuro come l’oro) gli avrà urlato di disabilitare quella cosa lì, o peggio, di essere bannato direttamente perché era evidente che usasse Microsoft Chat. La mia io diecenne l’avrebbe usato al 100%, altro che IRC testuale triste.
Andrò all’inferno per questa chat
Ho perso invece una quantità eccessiva di tempo a cercare di capire come cambiare il titolo in alto a sinistra, credevo fosse il TOPIC del canale e di essere io impedita o di aver mancato un flag da qualche parte ma niente.
Alle fine ho utilizzato l’unica skill che ho, il grep, ed ho trovato una cosa promettente in panel.cpp che va a pescare da una lista in chat.rc:
| ID | Title |
|---|---|
IDS_NOTITLE |
UNTITLED |
IDS_TITLE1 |
EVERYONE’S A COMIC |
IDS_TITLE2 |
DOGGY DOGGY WAH WAH |
IDS_TITLE3 |
YOU SHOULDA BEEN THERE |
IDS_TITLE4 |
NO EXIT |
IDS_TITLE5 |
WISH YOU WERE HERE |
IDS_TITLE6 |
DEEPEST DARKEST DESIRES |
IDS_TITLE7 |
JUST US CHUMPS |
IDS_TITLE8 |
SIGHTED IN CYBERSPACE |
IDS_TITLE9 |
THE GANG’S ALL HERE |
IDS_TITLE10 |
BORN TO CHAT |
IDS_TITLE11 |
NETWORKED NERDS |
IDS_TITLE12 |
VIRTUALLY VACUOUS |
IDS_TITLE13 |
IF I ONLY HAD A BRAIN |
IDS_TITLE14 |
SLUMBER PARTY |
IDS_TITLE15 |
MEET MARKET |
IDS_TITLE16 |
MICROSOFT CHAT |
Una curiosità, il paper è del 1996, se si va a sbirciare la v1.0 si vede che l’ultimo title è “Comic Chat” ma che è stato poi rinominato in “Microsoft Chat” nel 1998 dopo la v2.0. Inoltre, nella versione iniziale i titoli erano in un comodo file di testo dunque editabili dall’utente (che è quello che avrei apprezzato fare) ma che dalla 2.0 in avanti sono stati infilati in una stringtable dunque ciao Betty, bisogna tenersi questi titoli orrendi.
Comic Chat non ha fatto la storia e di certo non era manco nemmeno stato pensato per farla o per rispondere a chissà quale “esigenza di business”, come si direbbe ora. Era quello che io chiamo il “classico progetto anni 90”: non serviva a nulla, l’avrebbero usato quattro persone (forse) ma lo si faceva ugualmente per dimostrare che si poteva fare e ci si divertiva un sacco, come è evidente dal paper.
E 30 anni dopo eccomi qui con Windows 98 ed un server IRC, a fare tcpdump per scoprire che faccia avesse un pacchetto di MS Chat.
Tutto molto inutile, tutto molto bello.