Difference between revisions of "User:Ivan/Victory conditions"

From VCMI Project Wiki
Jump to: navigation, search
(Building requirements)
(Format)
Line 4: Line 4:
 
* Merge victory conditions with lose conditions - "do not lose hero" can be turned into more generic "control object(hero ID)" and "capture town" into more generic "control object(town ID)"
 
* Merge victory conditions with lose conditions - "do not lose hero" can be turned into more generic "control object(hero ID)" and "capture town" into more generic "control object(town ID)"
 
* Json format so it can be used in future with map editor/json map format
 
* Json format so it can be used in future with map editor/json map format
== Format ==
+
== Format considerarions ==
Example, using H3 victory condition "capture town or defeat all enemies in 60 days", with "does not applies to AI" flag set to true and "don't lose hero X" lose conditions.
+
Why I prefer this format (see next section) over others:
<syntaxhighlight lang="javascript">
 
"victory" :
 
[
 
    "anyOf",
 
    [ "standard" ],
 
    [ "allOf",
 
        [ "isHuman", { "value" : 1 } ],
 
        [ "control", { "position" : [10, 20, 0], "type" : "object.town" } ]
 
    ]
 
],
 
"lose" :
 
[
 
    "anyOf",
 
    [ "daysPassed", { "value" : 60 } ],
 
    [ "noneOf",
 
        [ "control", { "position" : [100, 200, 1], "type" : "object.hero" } ]
 
    ]
 
]
 
</syntaxhighlight>
 
Notes on why I prefer this format over others:
 
 
* I'm using prefix notation here to reduce probability of errors and to avoid thinking about operations priority which may be needed in case of mixing "or" with "and" in one expression:
 
* I'm using prefix notation here to reduce probability of errors and to avoid thinking about operations priority which may be needed in case of mixing "or" with "and" in one expression:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
Line 57: Line 37:
 
[
 
[
 
     "daysWithoutTown", { "value" : 7 }
 
     "daysWithoutTown", { "value" : 7 }
 +
]
 +
</syntaxhighlight>
 +
== Current format ==
 +
<syntaxhighlight lang="javascript">
 +
// information that will be visible  on scenario selection screen
 +
// will be generated by map reader using data from h3m & h3 text files
 +
"victoryString" : "Defeat all enemies or find artifact",
 +
"victoryImage" : "winImageList.def:12",
 +
 +
"lossString" : "Lost town",
 +
"lossImage" : "lossImageList.def:1",
 +
 +
// list of triggered events that will be generated based on scenario win/loss conditions
 +
"triggeredEvents" :
 +
{
 +
"findTheBlade" : {
 +
// logical condition for this event to trigger
 +
"condition" : [ "logical expression code" ],
 +
 +
// TODO: May be an interesting feature - display these event in quest window
 +
"message" : "Find ancient artifact, Armageddon's Blade to claim victory!",
 +
 +
// message that will be displayed to player when this happens
 +
"message" : "You have found Armageddon's Blade. You won!",
 +
 +
// effects caused by this event, hardcoded list, right now only win/loss effects are supported
 +
"effect" :
 +
{
 +
"type" : "victory",
 +
"messageToSend" : "Enemy found AB. All is lost!" // message that will be send to everyone else
 +
}
 +
},
 +
"keepGeluAlive" : {
 +
"condition" : [ "logical expression code" ],
 +
"message" : "Hero Gelu has been defeated. All is lost!",
 +
"effects" :
 +
{
 +
"type" : "defeat",
 +
"messageToSend" : "Gelu has been defeated, Playername has been defeated!"
 +
}
 +
}
 +
// event for 7 days without town
 +
// event for all enemies defeated
 
]
 
]
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 16:01, 15 December 2013

Main ideas

  • Use logical expressions to allow construction of complex conditions out of simple ones
  • Keep "logical expression" part generic enough to allow its usage in other areas (e.g. requirements for town buildings or any other allow/deny triggers)
  • Merge victory conditions with lose conditions - "do not lose hero" can be turned into more generic "control object(hero ID)" and "capture town" into more generic "control object(town ID)"
  • Json format so it can be used in future with map editor/json map format

Format considerarions

Why I prefer this format (see next section) over others:

  • I'm using prefix notation here to reduce probability of errors and to avoid thinking about operations priority which may be needed in case of mixing "or" with "and" in one expression:
"victory" :
[
    "conditionA",
    "and"         // this can be evaluated first
    "conditionB"
    "or"          // or this one
    "conditionC"
]
  • Json Vectors are used almost everywhere since json does not allows values with equal keys. Something like this is more logical but is not a valid json code:
"victory" :
{
    "allOf" :
    {
        "control" : { "position" : [0, 0, 0] }, // don't lose hero 1
        "control" : { "position" : [1, 1, 1] }, // don't lost hero 2
    }
}

Standard conditions:

"victory" :
[
    "standardWin"
],
"lose" :
[
    "daysWithoutTown", { "value" : 7 }
]

Current format

// information that will be visible  on scenario selection screen
// will be generated by map reader using data from h3m & h3 text files
"victoryString" : "Defeat all enemies or find artifact",
"victoryImage" : "winImageList.def:12",

"lossString" : "Lost town",
"lossImage" : "lossImageList.def:1",

// list of triggered events that will be generated based on scenario win/loss conditions
"triggeredEvents" :
{
	"findTheBlade" : {
		// logical condition for this event to trigger
		"condition" : [ "logical expression code" ],

		// TODO: May be an interesting feature - display these event in quest window
		"message" : "Find ancient artifact, Armageddon's Blade to claim victory!",

		// message that will be displayed to player when this happens
		"message" : "You have found Armageddon's Blade. You won!",

		// effects caused by this event, hardcoded list, right now only win/loss effects are supported
		"effect" :
		{
			"type" : "victory",
			"messageToSend" : "Enemy found AB. All is lost!" // message that will be send to everyone else
		}
	},
	"keepGeluAlive" : {
		"condition" : [ "logical expression code" ],
		"message" : "Hero Gelu has been defeated. All is lost!",
		"effects" :
		{
			"type" : "defeat",
			"messageToSend" : "Gelu has been defeated, Playername has been defeated!"
		}
	}
	// event for 7 days without town
	// event for all enemies defeated
]

List of victory/loss objectives

List of objectives that I have at the moment. Unless I missed something, should fully cover H3 objectives including campaigns

HAVE_ARTIFACT

Any player hero must hold an artifact

  • position - N/A (TODO: hero that must obtain the artifact? Or even merge this with "transport"?)
  • type - required artifact ID
  • value - N/A

HAVE_CREATURES

Player must control certain number of creatures

  • position - N/A
  • type - creature ID to collect
  • value - required amount of creatures

HAVE_RESOURCES

Player must have certain amount of resources

  • position - N/A
  • type - resource ID
  • value - required amount of resource

HAVE_BUILDING

Player must control certain building, also includes H3 "build Grail" condition

  • position - town in which this structure must be built, optional
  • type - building ID to construct
  • value - N/A

Note: if position is not set - building can be built in any town

CONTROL

Covers all conditions that require certain object(s) to be controlled by player

  • position - position of object to control, optional
  • type - type of object to control.
  • value - N/A

Note: If position is not set - all objects of this type must be captured

DESTROY

Covers objections where player must destroy certain object(s)

  • position - position of object to destroy, optional
  • type - type of object to destroy
  • value - N/A

Note: If position is not set - all objects of this type must be destroyed

TRANSPORT

Transport artifact in certain town

  • position - town to which this artifact must be transported
  • type - artifact ID to transport
  • value - N/A

DAYS_PASSED

Player must survive or win in certain number of days

  • position - N/A
  • type - N/A
  • value - number of days for this objective to trigger

Note: covers both "win in X days" as well as "survive for X days" conditions, depending on block in which this objective will be placed.

IS_HUMAN

Helper condition to allow ai-only or human-only conditions

  • position - N/A
  • type - N/A
  • value - 0 will trigger this objective for AI players, 1 will trigger it for humans

STANDARD_WIN

Standard win condition - defeat all enemies

  • position - N/A
  • type - N/A
  • value - N/A

DAYS_WITHOUT_TOWN

Standard lose condition - stay for X days without towns

  • position - N/A
  • type - N/A
  • value - number of days to survive, 0 = player dies on the next day.

Note: another part of standard lose condition - no heroes/towns is hardcoded.

Other areas for logic expressions

Mod dependencies

Not really necessary right now but it is possible to use them to specify more complex set of dependencies, e.g.

"requirements" :
[
    "allOf",
    [ "modA" ],  // "normal" dependencies - this mod requires mod A
    [
        "modB",  // dependencies with specific version limitations
        { "minimum" : "1.0.1", "maximum" : "1.2.9" }
    ],
    [
        "anyOf"  // at least one mod out of this list should be installed
        [ "modC" ],
        [ "modD" ]
    ],
    [
        "noneOf",  // essentially list of conflicts - none of these mods should be present
        [ "modE" ]
    ]
]

Building requirements

Already implemented in code

Something that was requested quite often, usually as part of alternative creatures in towns feature. Should be simple to implement compared to "main" area - campaigns. Will probably try to do this area first due to its small scale (less chance to mess up bigger systems).

Format is pretty much same as in previous cases:

"requirements" :
[
    "allOf", // Normal H3 "build all" mode
    [ "mageGuild1" ],
    [
        "noneOf",  // available only if dwelling 5 "A" was not built
        [ "dwelling5A" ],
        [ "dwelling5AUpgrade" ]
    ],
    [
        "anyOf", // at least one must be built
        [ "tavern" ],
        [ "blacksmith" ]
    ]
]