2011-09-07 12 views
15

Acabo de comenzar a jugar Elder Scrolls IV: Oblivion hace unos días, y una cosa que no puedo dejar de preguntar es cómo se maneja el sistema de misiones mediante programación.¿Cómo se modelan las misiones del juego (por ejemplo, Oblivion)?

Específicamente, hay muchas docenas (cientos) de misiones e incluso misiones secundarias en el juego, todas las cuales se reflejan en el entorno del juego de varias maneras: desde eventos con guiones que ocurren en el juego en momentos específicos/lugares entre personas específicas (asumiendo que todavía están vivos), a objetos de búsqueda relacionados (algunos de los cuales están asociados con NPCs particulares y estados de la misión), a diálogos variados con diferentes NPC (nuevamente, con un árbol complejo que puede ser alterado por diálogo con otros NPC & el estado general de la misión).

Además, puede cambiar entre misiones activas/inactivas en cualquier punto, por lo que estos comportamientos dinámicos complejos que afectan radicalmente al entorno a su alrededor se dan un paso más al ser completamente intercambiables.

Parece una pesadilla lógica, y estoy teniendo dificultades para entender cómo algo tan profundo y rico se puede definir mediante programación, aparentemente sin problemas.

¿Hay alguien con experiencia en este tipo de cosas que pueda explicar (ampliamente) lo que entra en este tipo de sistemas?

+6

Una forma directa bastante para averiguar la respuesta a esto es abrir el juego en el editor oficial de mundo y ver cómo modelan estos datos. El editor está incluido en el juego. –

Respuesta

1

Estoy adivinando aquí. No he hecho este tipo de programación pero he pensado mucho sobre cómo lo estaban haciendo mientras jugaban RuneScape.

Probablemente haya un grupo de indicadores y variables asociados a su cuenta, y a medida que avanza en una misión, sus valores cambian. Al principio, el carácter X se marca como vivo y en la ubicación Y. Más tarde, se marca como en la ubicación Z. Luego, está muerta. Entonces, cuando ingresa a la Ubicación Y, verifica la variable para ver si ella está allí, y coloca su objeto allí, o no. Mientras tanto, otro jugador que no ha iniciado la misión puede estar en la misma área y ver algo completamente diferente.

+0

Si echas un vistazo al motor Oblivion Scripting, así es como hacen muchas cosas. Incluso muchas cosas reactivas a la búsqueda son solo una bandera que establecen. Escuché en el nuevo motor Skyrim que este no es el caso y usa tecnología dinámica más avanzada. –

1

No soy un diseñador de juegos, pero puedo ver algo que puede estar en el trabajo aquí ...

Object Oriented Programming permite este tipo de complejidad y dinamismo mediante la encapsulación de datos y la lógica perfectamente dentro de muchos objetos. Estos objetos pueden interactuar "verbalmente", utilizando mensajería entre objetos para delegar tareas entre sí. El remitente del mensaje no necesita saber cómo interpretará el receptor el mensaje, dejando el método de acción completamente al receptor. Al igual que en el mundo real, la delegación permite que todo funcione sin problemas.

Por ejemplo, cuando pides un risotto de champiñones de Del Posto en la ciudad de Nueva York, ¿lo pides volviendo a la cocina y hablando con el chef directamente? ¿Te pones un delantal y preparas el risotto tú mismo? ¿Conduces hasta la granja de hongos más cercana y recoges tus propios hongos? No, tu no. Simplemente delegue estas tareas al camarero, al equipo de chefs y al proveedor de productos, respectivamente. Para obtener su risotto de hongos, todo lo que tiene que hacer es decirle al camarero que lo quiere. El resto se hace automáticamente, a través de una cadena de delegación. Este mismo tipo de delegación probablemente exista en tu juego.

Ahora, volviendo a los objetos. Algunos objetos heredan datos y lógica de objetos primarios, y de esta manera, pueden tener una gran cantidad de datos/lógica en común; llamemos a estos hermanos En el ejemplo de la búsqueda de juegos, cada búsqueda es probablemente su propio "objeto de búsqueda", con los datos de línea base y la lógica heredada del padre 'quest padre'. Los hermanos de búsqueda se pueden diferenciar entre sí agregando datos/lógica adicionales que pertenecen a las misiones específicas.

Dependiendo de sus acciones en el juego (y sus selecciones en el menú del juego, tal vez), el objeto del juego puede intercambiar uno de los objetos de búsqueda activos para uno de sus hermanos. Muchas veces, esto se puede hacer con un comando muy simple (en pseudo-código, no el modelo de cualquier lenguaje de programación en particular):

gameObject.activeQuest -> getCurrentObject(); 
//returns the object containing all of the data/logic of the current active quest: 
Gibbons_GoldenArtifacts 
//Let's say the quest description is "Scour the Catacombs of Gibbon for a 
mysterious treasure" 

gameObject.activeQuest -> setCurrentObject(Gibbon_DefeatGhost) 
//sets the activeQuest object (note that QUEST OBJECT contains baseline data/logic) 
//assuming, say, Gibbon_DefeatGhost is an object like so: 

Gibbon_DefeatGhost={QUEST OBJECT}; 
Gibbon_DefeatGhost.extend(
    description="Defeat Gibbon's ghost to retrieve his golden artifacts"; 
    objective="Defeat Gibbon's ghost"; 
    questNPC="Gibbon's ghost"; 
    questLocation="Gibbon's Inner Sanctum" 
    questTriggers[1]="When PLAYER enters Gibbon's Inner Sanction: Release Gibbon's ghost"; 
    questTriggers[2]="When Gibbon is slain: Drop Gibbon's golden artifacts" 
) 

partir de ese momento, el propio objeto de juego probablemente va a interactuar con la búsqueda activa Objeto igual que siempre, pero el objeto de búsqueda activo puede percibir esas interacciones de formas que son diferentes de las formas de los objetos de búsqueda hermanos, lo que resulta en una experiencia de juego diferente.

espero no estar manipulando totalmente el payaso en éste ...

+0

Para su información, hay mucha información sobre OOP en este sitio. –

Cuestiones relacionadas