Estoy tratando con archivos de diálogo del juego (conversación entre jugadores y personajes no jugables) donde las elecciones de diálogo y su resultado dependen de ciertas condiciones y dan como resultado ciertas acciones. Ahora, podría escribir un analizador simple para manejar algún tipo de lenguaje para especificar las condiciones previas y posteriores, pero un amigo mío sugirió usar XML. Las condiciones se pueden almacenar como atributos de un elemento de diálogo y las elecciones y acciones son elementos internos. Luego usaría una función eval para analizar estas condiciones y afirmaciones (estoy usando Ruby para hacer este juego). Para simplificar dicho enfoque, podría escribir una GUI simple para manipular estos archivos sin preocuparme por XML feo.Juego lógico en archivos XML
Pero me parece una elección extraña manejar la lógica en archivos XML. Tengo entendido que los archivos XML son para el almacenamiento y el intercambio de datos, y siempre leo discursos acerca de cómo la gente usa en exceso XML para todo tipo de cosas para las que no fue diseñado. Mis amigos responden señalando cómo se usa XML para todo, incluso XHTML y this bullet description language (que también ilustra algo de lógica).
Para ser sincero, usar XML me simplificaría muchas cosas. Escribir un analizador puede ser doloroso y lento, y mis requisitos son generalmente simples. Pero, ¿está realmente bien o lamentaría tal elección más adelante?
Para las personas interesadas en los detalles, aquí es lo que un intercambio de diálogo básico podría ser similar en un archivo XML:
<dialogue id="101" condition="!npc.carsFixed">
<message>Man, fix my car!</message>
<choices>
<choice condition="hero.carFixingSkill > 5" priority="7" id="Sure!">
<command>hero.carFixingSkills += 1</command>
<command>npc.carFixed = true</command>
<command>hero.playSmokeAnimation()</command>
<command>nextDialogue = 104</command>
</choice>
<choice condition="hero.carFixingSkill <= 5" id="I can't...">
<command>nextDialogue = 105</command>
</choice>
<choice id="Fix it yourself">
<command>npc.likesHero -= 1</command>
</choice>
</choices>
</dialogue>
El código correspondiente si está escrito en Ruby sería:
def dialogue101
if !npc.carsFixed
showMessage("Man, fix my car!")
choices = []
if hero.carFixingSkill > 5
choices.push(Choice.new("Sure!", 7))
else
choices.push(Choice.new("I can't"))
end
choices.push(Choice.new("Fix it yourself"))
choices = selectTopPriority(choices) if choices.size > 4
result = showChoices(choices)
case result
when "Sure"
hero.carFixingSkills += 1
npc.carFixed = true
hero.playSmokeAnimation
dialogue104
when "I can't"
dialogue105
when "Fix it yourself"
npc.likesHero -= 1
end
end
end
Cosas como likesHero y carFixingSkills son piezas de conocimiento que los jugadores y los NPC pueden tener, que probablemente se almacenarán en hash en la implementación real. Encuentro que el enfoque del archivo de diálogo es más flexible porque podría hacer un editor para editar fácilmente el diálogo y las condiciones/acciones, y debido a la naturaleza compleja de los árboles de conversación de juegos. Un lenguaje de guiones como Ruby o Lua ayuda, pero requerirá estructuras complejas para manejar la lógica de tales árboles.
Volviendo a la pregunta original, ¿XML es la herramienta adecuada para el trabajo o me falta algo?
Buen punto sobre el control de fuente, no he pensado en eso. –