Estoy intentando crear una aventura conversacional (luego la pasare a grafica, pero esto es lo basico), y estoy atascado con distintos planteamientos. Quiero crear una estructura lo mas general posible para poder hacer aventuras posteriormente cambiando tan solo los datos de los objetos y escenarios que intervienen en ella.
De momento, la estructura que relaciona los escenarios la tengo clara. Voy a utilizar un ADT grafo que ya tengo construido, asi cada vertice sera un escenario y las aristas los caminos que llevan de un escenario a otro. La informacion la cargaria desde un fichero, asi distintos ficheros tendran distintos escenarios para distintas aventuras.
Los objetos tendran una ID, un nombre y una descripcion, tambien los cargare desde un fichero, asi que tambien es bastante general. Solo tendre que crear ficheros de datos para las distintas aventuras.
Cada escenario tendra una descripcion y una lista de objetos con los que se pueda interactuar, y el inventario del protagonista tambien sera una lista de objetos, por lo que tampoco pierdo generalidad.
El problema lo tengo a la hora de decidir como llevar a cabo las acciones (sera una cantidad pequeña de comandos, del estilo del Day Of Tentacle) sobre los distintos objetos.
Se me ocurren distintas opciones pero no se por cual decidirme ni que sera mejor o peor, aqui es donde me hace falta vuestra experiencia o sentido comun.
Tengo claro (o creo que lo tengo, si veis que voy dando palos de ciego avisad) que la estructura de la funcion que lleve a cabo la accion sobre el/los objetos tiene que ser la siguiente:
nombre_funcion(referencia a tipo_escenario, referencia a personaje, referencia a objeto1, referencia a objeto2, lista_de_objetos).
Asi podre modificar la lista de objetos del escenario y del protagonista, y decidir si el resultado es otro objeto distinto a los dos dados de entre todos los objetos que haya en el juego y realizar las modificaciones en consecuencia.
Por ejemplo:
Usar sombrero con perchero. Busco sombrero, busco perchero, compruebo que puedo realizar la accion, elimino el sombrero del inventario, elimino perchero del escenario y sustituyo perchero por perchero con sombrero que se encontrara en la lista de los objetos.
Las opciones que barajo son las siguientes:
- Crear una funcion, que dependiendo del comando introducido, discrimine con if-elses los objetos sobre los que se lleva a cabo, por ejemplo.
Código:
ejecutar_accion(accion, escenario, prota, objeto1, objeto2, lista_objetos)
{
if(accion == UNA_ACCION)
{
if(objeto1 == UN_OBJETO)
{
if(objeto2 == OTRO_OBJETO)
{
una_accion(escenario, prota, objeto1, objeto2, lista_objetos);
}
else if(objeto2 == MAS_OBJETOS)
{
...
}
...
}
}
}
una_accion(escenario, prota, objeto1, objeto2, lista_objetos)
{
Lo mismo de arriba, con if elses compruebo con que par de objetos estoy tratando y actuo en consecuencia.
}
Con este tipo de codigo me puedo volver loco discriminando todos los posibles casos y para cada aventura tendria que modificar todas las relaciones en el codigo fuente...
- La segunda opcion que estoy pensando es crear ficheros dependientes de cada accion con matrices NxN, donde N es la cantidad de objetos, con la siguiente estructura:
Código:
ID1 ID2 ... IDN
ID1 R11 R12 ... R1N
ID2 R21 R22 ... R2N
. . . . .
. . . . .
. . . . .
IDN RN1 RN2 ... RNN
Rij es el nombre de una funcion que realiza acciones sobre el protagonista y el escenario correspondiente dependiendo de la accion.
Rij, en el ejecutable, sera unsigned long funcion(escenario *, protagonista *, objeto1*, objeto2 *, listaobjetos*)
Rij con i < j sera una funcion binaria (relacionara dos objetos)
Rij con i >= j sera una funcion unaria (la accion recaera sobre un solo objeto, segundo = NULL)
Rij = NULL si los objetos no se relacionan por la accion indicada.
La forma de relacionar el nombre de la funcion con la funcion que cree en el codigo, seria utilizando una lista de pares (nombre funcion, puntero a funcion), asi al leer el nombre de la funcion en el fichero podria traducirlo a la direccion de dicha funcion para asignarlo en la matriz del ejecutable.
Lo malo de este metodo es, que aunque gano en generalidad, si por ejemplo tengo 30 objetos, tendria que rellenar 900 datos de una matriz por cada accion.
¿Cual es la mejor forma para trabajar este problema?
Si conoceis o se os ocurre otro metodo me gustaria saberlo. Si quereis que os aclare algo mas sobre lo que tengo pensado, preguntad. Solo quiero tener las ideas claras antes de empezar a teclear codigo.
Muchas gracias por vuestra atencion.
¡Saludos!