No se si te entiendo muy bien, normalmente, en las AG, el cambio de nivel, se hace cuando se han conseguido ciertos objetivos y eso siempre es por programación, es decir el guión inicial contempla que si has hecho esto y esto y llevas los objetos x e y te doy acceso a una nueva serie de escenarios y te puedo dejar volver o no a los anteriores.
Por lo que intuyo, tu quieres cambiar de nivel cuando se den ciertas circunstancias independientemente de los objetos que se lleven ¿no es asi?
Independientemente del uso de los objetos y de que luego puedas tener problemas si no llevas algún objeto que necesites en el nivel siguiente, para generar este texto (dinos para que es, que me resulta curioso), lo que veo que estas intentando hacer en el código que has puesto puede servir siempre que los objetos no cambien de orden cuando el jugador coja uno y lo deje en distinta posición y no olvidemos las combinaciones, por ejemplo. No se como maneja el indice WME internamente (la variable i en el ejemplo que has puesto), asi que yo en tu lugar usaría Item.NAme para refereirme al objeto.
Lo que puedes hacer es crear un array con los objetos y las correspondencias y calcular la cadena cuando la necesites, asi siempre seguirás el orden de tu array, no el que pueda usar WME (que desconozco si es fijo o no), pero como además en algún lado tienes que almacenar el trozo de cadena que se corresponde a cada objeto, te da igual. Me explico:
var objs = new Array();
objs[0] = new Array("agua", "AG");
objs[1] = new Array("bote", "BT");
objs[2] = new Array("llaves", "LL");
Una vez que tienes este array con todos los objetos que necesites usar en al composición de la cadena, lo cotejas con el inventario y si están en el compones la cadena
var cadena;
// Nos recorremos nuestra lista de pares objeto - cadena
for(var i=0; i<objs.Lenght; i=i+1)
{
var objeto = objs[i]; // Cogemos cada objeto
// Buscamos nuestro objeto en los objetos del inventario
for(var idx=0; idx<Game.TotalNumItems; idx=idx+1)
{
var Item = Game.QueryItem(idx); // Cogemos el objeto del juego
var sino = Game.IsItemTaken(idx); // Comprobamos si lo tenemos en el inventario
if (sino) // Si está en el inventario
{
if (Item.Name == objeto[0]) // Si el objeto que estamos comprobando (de nuestra lista) es el objeto que está en el inventario
{
cadena = cadena + objeto[1]; // añadimos la subcadena del objeto de nuestra lista a la cadena final
}
}
}
}
Game.Msg(cadena);
Sleep(100);
Suponiendo que los tres objetos del ejemplo estuvieran en el inventario, esto debería hacer que "cadena" valiese "AGBTLL", no he probado el código, lo he puesto de cabeza, asi que puede tener algún error.
A ver si te sirve, si no pues ponlo aqui y vemos a ver