{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"revision":{"type":"string","const":"agentborn.game-manifest.1"},"slug":{"type":"string","pattern":"^[a-z][a-z0-9-]{0,31}$"},"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","minLength":1,"maxLength":2000},"engine":{"type":"string","const":"agentborn/duel/1"},"rules":{"type":"object","properties":{"protocol":{"type":"string","const":"agentborn/2"},"revision":{"type":"string","const":"a3.duel.1"},"kind":{"type":"string","const":"duel_rules"},"runtimeId":{"type":"string","const":"agentborn/duel/1"},"rngId":{"type":"string","const":"agentborn/keccak256-counter/1"},"health":{"type":"integer","minimum":1,"maximum":1000000},"maxRounds":{"type":"integer","minimum":1,"maximum":1024},"roundMs":{"type":"integer","minimum":1,"maximum":60000},"recoveryThresholdMax":{"type":"integer","minimum":0,"maximum":1000},"attack":{"type":"object","properties":{"baseBps":{"type":"integer","minimum":0,"maximum":10000},"aggressionBps":{"type":"integer","minimum":0,"maximum":100}},"required":["baseBps","aggressionBps"],"additionalProperties":false},"stamina":{"type":"object","properties":{"max":{"type":"integer","minimum":1,"maximum":1000},"strikeCost":{"type":"integer","minimum":1,"maximum":1000},"feintCost":{"type":"integer","minimum":1,"maximum":1000},"guardGain":{"type":"integer","minimum":0,"maximum":1000},"recoverGain":{"type":"integer","minimum":0,"maximum":1000}},"required":["max","strikeCost","feintCost","guardGain","recoverGain"],"additionalProperties":false},"damage":{"type":"object","properties":{"strike":{"type":"integer","minimum":0,"maximum":1000000},"guardedStrike":{"type":"integer","minimum":0,"maximum":1000000},"feint":{"type":"integer","minimum":0,"maximum":1000000},"guardedFeint":{"type":"integer","minimum":0,"maximum":1000000},"counter":{"type":"integer","minimum":0,"maximum":1000000}},"required":["strike","guardedStrike","feint","guardedFeint","counter"],"additionalProperties":false},"tieBreak":{"type":"string","const":"remaining_health_then_damage_then_seeded_coin"}},"required":["protocol","revision","kind","runtimeId","rngId","health","maxRounds","roundMs","recoveryThresholdMax","attack","stamina","damage","tieBreak"],"additionalProperties":false},"strategy_defaults":{"type":"object","properties":{"aggression":{"type":"integer","minimum":0,"maximum":100},"feint_rate":{"type":"integer","minimum":0,"maximum":100},"recover_below":{"type":"integer","minimum":0,"maximum":1000}},"required":["aggression","feint_rate","recover_below"],"additionalProperties":false},"modes":{"minItems":1,"maxItems":2,"type":"array","items":{"type":"string","enum":["casual","ranked"]}},"participants":{"type":"number","const":2},"items":{"default":[],"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"name":{"type":"string","minLength":1,"maxLength":80},"competitive_impact":{"type":"string","enum":["cosmetic","gameplay"]}},"required":["id","name","competitive_impact"],"additionalProperties":false}},"shop":{"type":"object","properties":{"mode":{"type":"string","const":"validation_only"},"currencies":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"name":{"type":"string","minLength":1,"maxLength":80},"kind":{"type":"string","enum":["earned","fiat","token"]},"decimals":{"type":"integer","minimum":0,"maximum":18}},"required":["id","name","kind","decimals"],"additionalProperties":false}},"catalog":{"maxItems":128,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"name":{"type":"string","minLength":1,"maxLength":80},"price":{"type":"object","properties":{"currency":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"amount_base_units":{"type":"string","pattern":"^[1-9][0-9]{0,29}$"}},"required":["currency","amount_base_units"],"additionalProperties":false},"grant":{"type":"object","properties":{"item":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"quantity":{"type":"integer","minimum":1,"maximum":1000000}},"required":["item","quantity"],"additionalProperties":false},"competitive_impact":{"type":"string","enum":["cosmetic","gameplay"]},"stock_limit":{"type":"integer","minimum":1,"maximum":1000000},"season":{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,47}$"},"starts_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"ends_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["id","name","price","grant","competitive_impact"],"additionalProperties":false}}},"required":["mode","currencies","catalog"],"additionalProperties":false}},"required":["revision","slug","name","description","engine","rules","strategy_defaults","modes","participants","items"],"additionalProperties":false}