Para empezar unifico todos los dispares y poco útiles -a mi juicio- modos de comunicarse que hay en inform:
Extend only 'grita' replace
* -> chillar
* noun -> chillar
* 'a//' creature -> chillar
* 'a//' creature topic -> hablar
* topic -> chillar;
verb 'chilla' = 'grita';
extend 'habla' replace
* ->hablar
* noun->hablar
* topic ->hablar;
extend 'pregunta' replace
* ->hablar
* noun->hablar
* topic ->hablar;
extend 'dile' replace
* ->hablar
* noun->hablar
* topic ->hablar;
extend 'pide' replace
* ->hablar
* noun->hablar
* topic ->hablar;
[hablarSub;
"Hablas, pero nadie te responde.";
];
[comohablarsub;
"Para hablar utiliza la fórmula: DECIR TAL";
];
A continuación viene el detector de cadenas, con la pequeña pega de que hay que escribir los caracteres uno a uno, y que no puedes detectar concatenación con espacios... salvo enrevesando la fórmula con más loops.
[BeforeParsing i j thisword thislength x;
bla1=0; !marca de texto detectado
bla2=0; !marca de texto detectado
bla3=0; !marca de texto detectado
bla4=0; !marca de texto detectado
for (i=parse-->0,j=1:j<=i:j++)
{
thisword = WordAddress(j);
thislength = WordLength(j);
if ( thisword -> 0 >= 'a' && thisword -> 0 <= 'z' ){ if(hablador in location){ if(thisword->0=='v' && thisword->1=='e'
&& thisword->2=='t' && thisword->3=='e') bla1=10;
if(thisword->0=='r' && thisword->1=='i'
&& thisword->1=='o') bla2=1;
if(thisword->0=='t' && thisword->1=='o' && thisword->2=='r'
&& thisword->3=='r' && thisword->4=='e') bla2=2;
!...etc
Y por fín, el personaje hablador. El nuevo sistema de hablar se detectará en el reaccionar_antes (react_before) del personaje, ya que de momento no necesito múltiples interlocutores, y todo lo que hables te lo replicará el único PSI presente, que traga con todo, hasta con su propio nombre si lo pones. Y de paso, me fusilo el Order y el Answer, que también forman parte del club de los modos de hablar múltiples:
object hablador "PSI hablador"
with name 'psi',
react_before[;
answer, order: <ComoHablar>;rtrue;
hablar:
if (bla1==10)print "Has dicho vete";
if(bla2==1)print "Has dicho río";
if(bla2==2)print "Has dicho torre, torreón, o torrecita";
],
!...etc
Por ahora, mucho mejor que lo que tenía, y... hecho y funcional.
(El código es para compilar en Glulx, para Z-code cambian ciertas cosas)