Compare commits

..

4 commits

Author SHA1 Message Date
Martin Stickelbroeck
55effca874 Hauptstand 11. Oktober 2026: Übersicht über alle Phasen bis S4
main wird ohne Konflikte auf diesen Stand vorgerückt (alle Phasen-Branches
liegen in einer Linie); Tag stand-2026-10-11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:56:31 +02:00
Martin Stickelbroeck
7b86973197 S4 Feinschliff: Betäubung sichtbar, Nebel im Gelände, Glyphe für Gäste
Betäubungs-Ring über dem Kopf (Gäste über Bit 18 der Rahmen-Flags),
Nebel-Gitter LuneFogOverlay mit Shader Luneraria/FogOverlay aus
LuneFog.Vision (10 Hz, weiche Kante), laufende Glyphe je Team als vier
Zusatzwerte nach den Gebäude-Lebenspunkten. Reine Darstellung.
Kern 627/627 (s4 8), EditMode 35/35, PlayMode 20/20, Verify 718/0,
Selbsttest 30/30, Golden 0, Fingerabdruck unverändert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:55:42 +02:00
Martin Stickelbroeck
542a9646c8 H2 Brunhild: Figur, Skin Eiswalküre, Oberfläche, Nachweise
Meshy-Figur Brunhild (28.706 Dreiecke mit Lane-Fassung und Speer) mit
Ultimate-Clip Jump Attack, 113 Credits. Skin Eiswalküre über skin_variant.py
(Farbband über Rot, Mindestsättigung schützt Hauttöne). Heldenwahl bei fünf
Helden kompakter; Tests auf fünf Helden angehoben.
Kern 619/619 (h2 22), EditMode 34/34, PlayMode 19/19, Verify 718/0,
Selbsttest 30/30, Golden 0, Fingerabdruck unverändert; A/B mit Sylvara:
Karte gleich, Mid nah -4 %.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:21:50 +02:00
Martin Stickelbroeck
cbff678290 H2A Brunhild: Kernregeln, Markierung, Betäubung, Bot-Profil, Prüfsuite
Brunhild (held_brunhild): Heldenjägerin (+25 % gegen Helden/Champions),
Speerwurf markiert (+15 % erlittener Schaden), Walkürensturz (Sprung,
200 % in 3 m, 1 s Betäubung, Bosse immun, Walkürenschild 30 %), Talente,
Auslöser, Skin-Eintrag Eiswalküre, Bot-Profil walkuere (nur erweitert).
Neue Effektarten vulnerable und stun wirken nur durch Brunhild; Golden 0.
Probe-Vergleich 50 % wie die übrigen Helden; h2 22/22.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:44:42 +02:00
158 changed files with 68096 additions and 62027 deletions

View file

@ -0,0 +1,596 @@
{
"id": "brunhild",
"group": "Characters",
"source": "tools/meshy/build_figure.py",
"exporter_version": 11,
"blender": "5.2.2 LTS",
"fbx_settings": {
"use_selection": true,
"use_visible": false,
"use_active_collection": false,
"global_scale": 1.0,
"apply_unit_scale": true,
"apply_scale_options": "FBX_SCALE_UNITS",
"axis_forward": "Y",
"axis_up": "Z",
"bake_space_transform": false,
"object_types": [
"ARMATURE",
"EMPTY",
"MESH"
],
"use_mesh_modifiers": true,
"use_mesh_modifiers_render": true,
"mesh_smooth_type": "OFF",
"use_subsurf": false,
"use_mesh_edges": false,
"use_tspace": false,
"use_triangles": false,
"colors_type": "LINEAR",
"prioritize_active_color": true,
"use_custom_props": false,
"add_leaf_bones": false,
"primary_bone_axis": "Y",
"secondary_bone_axis": "X",
"use_armature_deform_only": true,
"armature_nodetype": "NULL",
"bake_anim": true,
"bake_anim_use_all_bones": true,
"bake_anim_use_nla_strips": false,
"bake_anim_use_all_actions": true,
"bake_anim_force_startend_keying": true,
"bake_anim_step": 1.0,
"bake_anim_simplify_factor": 0.0,
"path_mode": "STRIP",
"embed_textures": false,
"batch_mode": "OFF"
},
"checks": [
{
"check": "turn_applied",
"ok": true,
"detail": "[]"
},
{
"check": "units_metric",
"ok": true,
"detail": "METRIC"
},
{
"check": "unit_scale_1",
"ok": true,
"detail": "1.0"
},
{
"check": "no_negative_scale",
"ok": true,
"detail": "{}"
},
{
"check": "object_scale_1",
"ok": true,
"detail": "{}"
},
{
"check": "mesh_names_unique",
"ok": true,
"detail": "['BrunhildBody_LOD0', 'BrunhildBody_LOD1', 'BrunhildSpeer_LOD0', 'BrunhildSpeer_LOD1']"
},
{
"check": "material_slots_filled",
"ok": true,
"detail": "{}"
},
{
"check": "normals_unit_length",
"ok": true,
"detail": "{}"
},
{
"check": "no_blend_shapes",
"ok": true,
"detail": "{}"
},
{
"check": "triangles_match_godot",
"ok": true,
"detail": "28706 fbx / 28706 godot"
},
{
"check": "one_armature",
"ok": true,
"detail": "['BrunhildRig']"
},
{
"check": "single_root_bone",
"ok": true,
"detail": "['Root']"
},
{
"check": "root_bone_name",
"ok": true,
"detail": "['Root']"
},
{
"check": "bone_count_match_godot",
"ok": true,
"detail": "25 / 25"
},
{
"check": "bone_names_portable",
"ok": true,
"detail": "[]"
},
{
"check": "skinned_meshes_present",
"ok": true,
"detail": ""
},
{
"check": "clips_match_godot",
"ok": true,
"detail": "[]"
},
{
"check": "required_clips_present",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_mesh_names",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_triangles",
"ok": true,
"detail": "28706 / 28706"
},
{
"check": "roundtrip_materials",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_bones",
"ok": true,
"detail": "[]"
},
{
"check": "roundtrip_clips",
"ok": true,
"detail": "['ability', 'attack_a', 'attack_b', 'death', 'hit', 'idle', 'ultimate', 'walk']"
}
],
"generator": {
"clips": {
"idle": {
"source": "Idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
"walk": {
"source": "Walk_Fight_Forward",
"frames": [
0.0,
40.0
],
"seconds": 1.2917,
"loop": true,
"contact_seconds": -1.0
},
"attack_a": {
"source": "Thrust_Slash",
"frames": [
4,
30
],
"seconds": 0.9583,
"loop": false,
"contact_seconds": 0.516
},
"attack_b": {
"source": "Charged_Upward_Slash",
"frames": [
0,
45
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.5556
},
"hit": {
"source": "Hit_Reaction",
"frames": [
0,
14
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
"ability": {
"source": "Over_Shoulder_Throw",
"frames": [
50,
100
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.64
},
"death": {
"source": "Shot_and_Fall_Backward",
"frames": [
0.0,
84.0
],
"seconds": 2.4167,
"loop": false,
"contact_seconds": -1.0
},
"ultimate": {
"source": "Basic_Jump",
"frames": [
20,
80
],
"seconds": 1.2917,
"loop": false,
"contact_seconds": 0.775
}
},
"textures": {
"glow_share": 0.0,
"palette_gains": {},
"size": [
2048,
2048
]
},
"unit": 0.009999999776482582,
"lod": {
"lod0_triangles": 20663,
"lod1_triangles": 4999,
"lod1_vertices": 2468,
"welded_triangles": 20663,
"lod0_screen": 0.2
},
"props": [
{
"name": "BrunhildSpeer",
"triangles": 2545,
"textures": {
"glow_share": 0.0,
"palette_gains": {},
"size": [
2048,
2048
]
},
"lod": {
"lod0_triangles": 2545,
"lod1_triangles": 499,
"lod1_vertices": 252,
"welded_triangles": 2545,
"lod0_screen": 0.2
}
}
]
},
"inputs_sha256": {
"tools/meshy/brunhild/figure.json": "19ccf5ca996bba99f8681c8b02ce221f7700175f7d66b820c5a953017e2305d9",
"assets-source/meshy/brunhild/brunhild-skelett.glb": "f089ffcec953c76f03997cdc19f3eb2f126b7199e9698e4e0a9d5654fca1dd18",
"assets-source/meshy/brunhild/brunhild-animationen.glb": "aca3433fec67155457f05046880e30772f9fba21ff1789912acf700f26ca7bfc",
"assets-source/meshy/brunhild/brunhild-speer.glb": "a7637375a32752913dc3929fe099d3c6e2e5d75a0f0665d0244af1637459f364"
},
"source_sha256": "5a0df3fc4ab4228c0b631a038098db9e79c833ae69ddd2457a8062eb1b493283",
"removed_modifiers": 0,
"kind": "skinned",
"fps": 24.0,
"objects": 5,
"meshes": {
"BrunhildBody_LOD0": {
"mesh": "BrunhildBody_LOD0",
"triangles": 20663,
"vertices": 28942,
"ngons": 0,
"materials": [
"AI_Brunhild"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": true,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
-0.4473,
0.0,
-0.2325
],
"max": [
0.4473,
1.8,
0.2325
]
}
},
"BrunhildSpeer_LOD0": {
"mesh": "BrunhildSpeer_LOD0",
"triangles": 2545,
"vertices": 3856,
"ngons": 0,
"materials": [
"AI_BrunhildSpeer"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": true,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
0.1895,
0.7103,
-0.6358
],
"max": [
0.5065,
1.2324,
1.2914
]
}
},
"BrunhildBody_LOD1": {
"mesh": "BrunhildBody_LOD1",
"triangles": 4999,
"vertices": 2468,
"ngons": 0,
"materials": [
"AI_Brunhild"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": false,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
-0.4478,
0.0007,
-0.2335
],
"max": [
0.4466,
1.8008,
0.2343
]
}
},
"BrunhildSpeer_LOD1": {
"mesh": "BrunhildSpeer_LOD1",
"triangles": 499,
"vertices": 252,
"ngons": 0,
"materials": [
"AI_BrunhildSpeer"
],
"uv_layers": [
"UVMap"
],
"color_attributes": [],
"active_color": null,
"custom_normals": false,
"normals_unit_length": true,
"bad_normals": 0,
"degenerate_triangles": 0,
"shape_keys": 0,
"skinned": true,
"scale": [
1.0,
1.0,
1.0
],
"bounds_unity": {
"min": [
0.189,
0.7108,
-0.6379
],
"max": [
0.5086,
1.2317,
1.2931
]
}
}
},
"armatures": {
"BrunhildRig": {
"bones": [
"Root",
"Hips",
"Spine02",
"Spine01",
"Spine",
"neck",
"Head",
"head_end",
"headfront",
"LeftShoulder",
"LeftArm",
"LeftForeArm",
"LeftHand",
"RightShoulder",
"RightArm",
"RightForeArm",
"RightHand",
"LeftUpLeg",
"LeftLeg",
"LeftFoot",
"LeftToeBase",
"RightUpLeg",
"RightLeg",
"RightFoot",
"RightToeBase"
],
"roots": [
"Root"
]
}
},
"empties": {},
"bounds_unity": {
"min": [
-0.4478,
0.0,
-0.6379
],
"max": [
0.5086,
1.8008,
1.2931
]
},
"clips": [
{
"name": "ability",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.64
},
{
"name": "attack_a",
"frames": [
0.0,
23.0
],
"seconds": 0.9583,
"loop": false,
"contact_seconds": 0.516
},
{
"name": "attack_b",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.5556
},
{
"name": "death",
"frames": [
0.0,
58.0
],
"seconds": 2.4167,
"loop": false,
"contact_seconds": -1.0
},
{
"name": "hit",
"frames": [
0.0,
12.0
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
{
"name": "idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
{
"name": "ultimate",
"frames": [
0.0,
31.0
],
"seconds": 1.2917,
"loop": false,
"contact_seconds": 0.775
},
{
"name": "walk",
"frames": [
0.0,
31.0
],
"seconds": 1.2917,
"loop": true,
"contact_seconds": -1.0
}
],
"expected_from_godot": {
"triangles": 28706,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death",
"ultimate"
]
},
"meshes_with_ngons": {},
"meshes_without_uv": [],
"triangles": 28706,
"fbx": "Assets/Luneraria/Art/Characters/brunhild.fbx",
"fbx_bytes": 3796828,
"ok": true
}

View file

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 76fa6bac90ff045589eba33ed23ef0dd
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View file

@ -0,0 +1,373 @@
fileFormatVersion: 2
guid: 29d894f788c5f4fbbacf819091c19542
ModelImporter:
serializedVersion: 24300
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
searchTexturesGlobally: 0
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 0
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 0
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations:
- serializedVersion: 16
name: ability
takeName: BrunhildRig|ability
internalID: 3282932801577121271
firstFrame: 0
lastFrame: 24
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.64
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: attack_a
takeName: BrunhildRig|attack_a
internalID: -4088893210095135303
firstFrame: 0
lastFrame: 23
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.5384535
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: attack_b
takeName: BrunhildRig|attack_b
internalID: -3393105429929367649
firstFrame: 0
lastFrame: 24
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.5556
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: death
takeName: BrunhildRig|death
internalID: -575409383583182742
firstFrame: 0
lastFrame: 58
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: hit
takeName: BrunhildRig|hit
internalID: 4649535545551490279
firstFrame: 0
lastFrame: 12
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: idle
takeName: BrunhildRig|idle
internalID: -7637435868926338065
firstFrame: 0
lastFrame: 96
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 1
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: ultimate
takeName: BrunhildRig|ultimate
internalID: 7528617810713444434
firstFrame: 0
lastFrame: 31
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 0
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events:
- time: 0.5999845
functionName: OnLuneContact
data:
objectReferenceParameter: {instanceID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
- serializedVersion: 16
name: walk
takeName: BrunhildRig|walk
internalID: -759485606388579005
firstFrame: 0
lastFrame: 31
wrapMode: 0
orientationOffsetY: 0
level: 0
cycleOffset: 0
loop: 0
hasAdditiveReferencePose: 0
loopTime: 1
loopBlend: 0
loopBlendOrientation: 0
loopBlendPositionY: 0
loopBlendPositionXZ: 0
keepOriginalOrientation: 0
keepOriginalPositionY: 1
keepOriginalPositionXZ: 0
heightFromFeet: 0
mirror: 0
bodyMask: 01000000010000000100000001000000010000000100000001000000010000000100000001000000010000000100000001000000
curves: []
events: []
transformMask: []
maskType: 3
maskSource: {instanceID: 0}
additiveReferencePoseFrame: 0
isReadable: 1
meshes:
lODScreenPercentages:
- 0.25
- 0.01
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 0
importBlendShapes: 0
importCameras: 0
importLights: 0
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 1
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 1
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,275 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-9220055677375747029
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: walk
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -759485606388579005, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-4719041364407145157
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: death
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -575409383583182742, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-3340885724969997654
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ultimate
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7528617810713444434, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: brunhild
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 4919687160989328924}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &604826683839612195
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: ability
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 3282932801577121271, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &3419020185831067391
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: attack_a
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -4088893210095135303, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &4117362530366511861
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: hit
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 4649535545551490279, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &4353629903250305412
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: attack_b
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -3393105429929367649, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &4919687160989328924
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 6833392093826740936}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 604826683839612195}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: 3419020185831067391}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: 4353629903250305412}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: -4719041364407145157}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: 4117362530366511861}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: -3340885724969997654}
m_Position: {x: 410, y: 390, z: 0}
- serializedVersion: 1
m_State: {fileID: -9220055677375747029}
m_Position: {x: 445, y: 455, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 6833392093826740936}
--- !u!1102 &6833392093826740936
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: idle
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: -7637435868926338065, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8f779b941008d48fea9cfb256567bb9d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 0dbeeb8c48f344e64962b71d5e9fcca1
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: f701c67235f354e4dac0ee3235b94b3d
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 1722b2d9a084347b8845372bf878a61f
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: ed6f51893270d4a81a491e1b895a5815
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 336afb236cf9f438dae9687f76420327
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 9b19528e38c1f468a8dfb54927968778
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 1
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: cf3a5ed7600ba42349191e05cfe011e8
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 0
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 MiB

View file

@ -0,0 +1,117 @@
fileFormatVersion: 2
guid: 1fadc4bab123948b3b3f54a2fe52173a
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 1
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 1
lightmap: 0
compressionQuality: 50
spriteMode: 0
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View file

@ -60,7 +60,13 @@ namespace Luneraria.Core
new HeroSpec { Id = "held_sylvara", Name = "Sylvara", Title = "Die Mondklinge", Model = "sylvara", Cost = 260, RoleText = "Assassine / Nahkampf", Provisional = false, Summary = "Springt in die zweite Reihe, wirft Sicheln und wirbelt mit dem Mondsicheltanz durch Gruppen.", new HeroSpec { Id = "held_sylvara", Name = "Sylvara", Title = "Die Mondklinge", Model = "sylvara", Cost = 260, RoleText = "Assassine / Nahkampf", Provisional = false, Summary = "Springt in die zweite Reihe, wirft Sicheln und wirbelt mit dem Mondsicheltanz durch Gruppen.",
PassiveText = "Mondsprung: einmal pro Kampf auf den nächsten Fernkämpfer oder Unterstützer in 8 m, der höchstens 2 Begleiter in 3 m hat. Der erste Treffer danach macht 150 % Schaden; Mondschleier schützt 4 s mit 25 % ihrer Lebenspunkte.", PassiveText = "Mondsprung: einmal pro Kampf auf den nächsten Fernkämpfer oder Unterstützer in 8 m, der höchstens 2 Begleiter in 3 m hat. Der erste Treffer danach macht 150 % Schaden; Mondschleier schützt 4 s mit 25 % ihrer Lebenspunkte.",
AbilityText = "Sichelwurf: ab 4 s alle 6 s 90 % Schaden an ihrem Ziel und bis zu 2 weiteren Gegnern in 2,5 m.", AbilityText = "Sichelwurf: ab 4 s alle 6 s 90 % Schaden an ihrem Ziel und bis zu 2 weiteren Gegnern in 2,5 m.",
UltimateName = "Mondsicheltanz", UltimateText = "Einmal pro Kampf, frühestens nach 2 s: 220 % Schaden an bis zu 5 Gegnern in 5 m, die 2 s um 30 % verlangsamt werden; danach Mondschleier. Wann er ausgelöst wird, legst du in der Planung fest.", Base = new UnitDef { MaxHp = 1450.0, Damage = 42.0, AttackType = 0, ArmorType = 0, AttackRange = 1.2, Speed = 2.8, Ability = "sylvara", AbilityDescription = "Mondsprung auf ungeschützte Fernkämpfer · Sichelwurf alle 6 s · Ultimate Mondsicheltanz nach Planungsregel." } } UltimateName = "Mondsicheltanz", UltimateText = "Einmal pro Kampf, frühestens nach 2 s: 220 % Schaden an bis zu 5 Gegnern in 5 m, die 2 s um 30 % verlangsamt werden; danach Mondschleier. Wann er ausgelöst wird, legst du in der Planung fest.", Base = new UnitDef { MaxHp = 1450.0, Damage = 42.0, AttackType = 0, ArmorType = 0, AttackRange = 1.2, Speed = 2.8, Ability = "sylvara", AbilityDescription = "Mondsprung auf ungeschützte Fernkämpfer · Sichelwurf alle 6 s · Ultimate Mondsicheltanz nach Planungsregel." } },
// H2: Brunhild, the second hero of the champions concept.
new HeroSpec { Id = "held_brunhild", Name = "Brunhild", Title = "Die Walküre", Model = "brunhild", Cost = 260, RoleText = "Heldenjägerin / Nahkampf", Provisional = false, Summary = "Markiert mit dem Speer, stürzt sich auf Helden und betäubt mit dem Walkürensturz.",
PassiveText = "Heldenjägerin: +25 % Schaden gegen Helden und Angriffschampions.",
AbilityText = "Speerwurf: ab 3 s alle 6 s 120 % Schaden am fernsten Gegner in 7 m; er ist 4 s markiert und nimmt 15 % mehr Schaden.",
UltimateName = "Walkürensturz", UltimateText = "Einmal pro Kampf, frühestens nach 2 s: Sprung auf ihr Ziel (ein Held oder der markierte Gegner zuerst), 200 % Schaden an allen Gegnern in 3 m und 1 s Betäubung (Bosse sind immun); danach Walkürenschild (30 % ihrer Lebenspunkte, 5 s). Wann sie springt, legst du in der Planung fest.",
Base = new UnitDef { MaxHp = 2000.0, Damage = 42.0, AttackType = 1, ArmorType = 1, AttackRange = 2.0, Speed = 2.4, Ability = "brunhild", AbilityDescription = "Heldenjägerin · Speerwurf markiert alle 6 s · Ultimate Walkürensturz nach Planungsregel." } }
); );
/// <summary>Heroes of the Godot reference; ContentTests compares exactly these, later heroes follow them.</summary> /// <summary>Heroes of the Godot reference; ContentTests compares exactly these, later heroes follow them.</summary>
@ -91,6 +97,11 @@ namespace Luneraria.Core
{ {
new[] { new TalentOption("mondsilber", "Mondsilber", "Einzelziel: Der Sichelwurf trifft nur das Ziel, dafür mit 200 % statt 90 % Schaden."), new TalentOption("sichelsturm", "Sichelsturm", "Fläche: Der Sichelwurf trifft bis zu 5 statt 3 Gegner in 3,5 m.") }, new[] { new TalentOption("mondsilber", "Mondsilber", "Einzelziel: Der Sichelwurf trifft nur das Ziel, dafür mit 200 % statt 90 % Schaden."), new TalentOption("sichelsturm", "Sichelsturm", "Fläche: Der Sichelwurf trifft bis zu 5 statt 3 Gegner in 3,5 m.") },
new[] { new TalentOption("neumond", "Neumond", "+20 % Angriffstempo."), new TalentOption("vollmond", "Vollmond", "Mondsicheltanz: bis zu 7 statt 5 Ziele, 280 % statt 220 % Schaden.") } new[] { new TalentOption("neumond", "Neumond", "+20 % Angriffstempo."), new TalentOption("vollmond", "Vollmond", "Mondsicheltanz: bis zu 7 statt 5 Ziele, 280 % statt 220 % Schaden.") }
} },
{ "held_brunhild", new[]
{
new[] { new TalentOption("walkuerenblut", "Walkürenblut", "Einzelziel: Der Speerwurf macht gegen Helden und Champions doppelten Schaden."), new TalentOption("speerregen", "Speerregen", "Fläche: Der Speerwurf trifft die drei fernsten Gegner in 7 m.") },
new[] { new TalentOption("rabenschwinge", "Rabenschwinge", "+20 % Angriffstempo."), new TalentOption("goetterdaemmerung", "Götterdämmerung", "Walkürensturz: 2 s Betäubung in 4 m statt 1 s in 3 m.") }
} } } }
}; };
@ -102,6 +113,7 @@ namespace Luneraria.Core
public static readonly Dictionary<string, TalentOption[]> HeroSkins = new Dictionary<string, TalentOption[]> public static readonly Dictionary<string, TalentOption[]> HeroSkins = new Dictionary<string, TalentOption[]>
{ {
{ "held_sylvara", new[] { new TalentOption("blutmond", "Blutmond", "Variante: rote Klingen und Runen, dunkelrotes Tuch, nachgedunkeltes Silber.") } }, { "held_sylvara", new[] { new TalentOption("blutmond", "Blutmond", "Variante: rote Klingen und Runen, dunkelrotes Tuch, nachgedunkeltes Silber.") } },
{ "held_brunhild", new[] { new TalentOption("eiswalkuere", "Eiswalküre", "Variante: eisblauer Umhang und Federn statt Rot, frostiges Gold.") } },
}; };
/// <summary> /// <summary>
@ -118,6 +130,13 @@ namespace Luneraria.Core
new TalentOption("notfall", "Notfall", "Wenn Sylvara unter 40 % Leben fällt und ein Gegner in 4 m steht."), new TalentOption("notfall", "Notfall", "Wenn Sylvara unter 40 % Leben fällt und ein Gegner in 4 m steht."),
new TalentOption("sofort", "Sofort", "Beim ersten Gegner in 4 m."), new TalentOption("sofort", "Sofort", "Beim ersten Gegner in 4 m."),
} }, } },
{ "held_brunhild", new[]
{
new TalentOption("gruppe", "Gruppe", "Sobald mindestens 3 Gegner in 4 m um ihr Ziel stehen."),
new TalentOption("held", "Heldenjagd", "Sobald ein gegnerischer Held oder Angriffschampion in 7 m steht."),
new TalentOption("notfall", "Notfall", "Wenn Brunhild unter 40 % Leben fällt und ein Gegner in 7 m steht."),
new TalentOption("sofort", "Sofort", "Beim ersten Gegner in 7 m."),
} },
}; };
public static readonly OrderedMap<string, ItemSpec> Items = Ordered( public static readonly OrderedMap<string, ItemSpec> Items = Ordered(
@ -145,7 +164,7 @@ namespace Luneraria.Core
/// <summary>Base troop id to role; iteration order matters for RoleOf (first match).</summary> /// <summary>Base troop id to role; iteration order matters for RoleOf (first match).</summary>
public static readonly OrderedMap<string, string> MatchRoles = Pairs("g01", "melee", "g03", "front", "g05", "ranged", "g07", "splash", "g09", "support", "w01", "melee", "w03", "front", "w05", "ranged", "w07", "splash", "w09", "support"); public static readonly OrderedMap<string, string> MatchRoles = Pairs("g01", "melee", "g03", "front", "g05", "ranged", "g07", "splash", "g09", "support", "w01", "melee", "w03", "front", "w05", "ranged", "w07", "splash", "w09", "support");
public static readonly OrderedMap<string, string> HeroRoles = Pairs("held_ringborke", "front", "held_quellgeflecht", "support", "held_funkenlanze", "ranged", "held_sylvara", "melee"); public static readonly OrderedMap<string, string> HeroRoles = Pairs("held_ringborke", "front", "held_quellgeflecht", "support", "held_funkenlanze", "ranged", "held_sylvara", "melee", "held_brunhild", "melee");
public static readonly string[] RowOrder = { "front", "melee", "splash", "ranged", "support" }; public static readonly string[] RowOrder = { "front", "melee", "splash", "ranged", "support" };
public static readonly string[] BotNames = { "Eichrufer", "Aschenzunge", "Quellwächter", "Glutfaust", "Moosauge", "Basaltherz", "Rindenkrone", "Funkenschritt" }; public static readonly string[] BotNames = { "Eichrufer", "Aschenzunge", "Quellwächter", "Glutfaust", "Moosauge", "Basaltherz", "Rindenkrone", "Funkenschritt" };
public static readonly string[] WavesMelee = { "e01", "e02", "e05" }; public static readonly string[] WavesMelee = { "e01", "e02", "e05" };
@ -168,7 +187,8 @@ namespace Luneraria.Core
/// bot match). Usable as a fixed profile per slot (MatchOptions.Profiles, balance runs). /// bot match). Usable as a fixed profile per slot (MatchOptions.Profiles, balance runs).
/// </summary> /// </summary>
public static readonly OrderedMap<string, BotProfile> ExtraBotProfiles = Ordered( public static readonly OrderedMap<string, BotProfile> ExtraBotProfiles = Ordered(
new BotProfile { Name = "assassine", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_sylvara", HeroRound = 3, Items = new[] { "glutklinge", "funkenfokus", "basaltschild" }, TalentChoices = new[] { 1, 0 }, Champion = "" } new BotProfile { Name = "assassine", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_sylvara", HeroRound = 3, Items = new[] { "glutklinge", "funkenfokus", "basaltschild" }, TalentChoices = new[] { 1, 0 }, Champion = "" },
new BotProfile { Name = "walkuere", Front = 0.3, Melee = 0.25, Ranged = 0.25, Splash = 0.1, Support = 0.1, UpgradeFrom = 6, SupportLane = 0.0, Hero = "held_brunhild", HeroRound = 3, Items = new[] { "glutklinge", "basaltschild", "funkenfokus" }, TalentChoices = new[] { 0, 1 }, Champion = "" }
); );
} }
} }

View file

@ -130,7 +130,7 @@ namespace Luneraria.Core
reduction += 0.15; reduction += 0.15;
if (hero.Talents.Contains("fernsicht")) if (hero.Talents.Contains("fernsicht"))
definition.AttackRange = definition.AttackRange + 1.5; definition.AttackRange = definition.AttackRange + 1.5;
if (hero.Talents.Contains("glutsalve") || hero.Talents.Contains("neumond")) if (hero.Talents.Contains("glutsalve") || hero.Talents.Contains("neumond") || hero.Talents.Contains("rabenschwinge"))
attackSpeed += 0.20; attackSpeed += 0.20;
definition.UltimateRule = UltimateRuleFor(hero); definition.UltimateRule = UltimateRuleFor(hero);
definition.Skin = ValidSkin(hero.HeroId, hero.Skin) ? hero.Skin ?? "" : ""; definition.Skin = ValidSkin(hero.HeroId, hero.Skin) ? hero.Skin ?? "" : "";

View file

@ -711,6 +711,7 @@ namespace Luneraria.Core
// H1: leap and ultimate counters ride in the flag bits (8 bits each, compared for change only). // H1: leap and ultimate counters ride in the flag bits (8 bits each, compared for change only).
unit.LeapSerial = (flags >> 2) & 0xFF; unit.LeapSerial = (flags >> 2) & 0xFF;
unit.UltimateSerial = (flags >> 10) & 0xFF; unit.UltimateSerial = (flags >> 10) & 0xFF;
unit.NetStunned = (flags & (1 << 18)) != 0;
unit.AttackProgress = data[baseIndex + 7]; unit.AttackProgress = data[baseIndex + 7];
unit.HitCount = (int)data[baseIndex + 8]; unit.HitCount = (int)data[baseIndex + 8];
unit.AttackSerial = (int)data[baseIndex + 9]; unit.AttackSerial = (int)data[baseIndex + 9];
@ -731,6 +732,13 @@ namespace Luneraria.Core
building.Hp = buildingHp[index]; building.Hp = buildingHp[index];
building.Alive = building.Hp > 0.0; building.Alive = building.Hp > 0.0;
} }
for (int team = 0; team < 2 && buildingHp.Length >= buildings.Count + 4; team++)
{
int lane = (int)buildingHp[buildings.Count + team * 2] - 1;
float left = buildingHp[buildings.Count + team * 2 + 1];
combat.GlyphLane[team] = lane >= 0 && lane < 3 ? LuneMap.Lanes[lane] : "";
combat.GlyphUntil[team] = lane >= 0 ? combat.Elapsed + left : -1.0;
}
} }
} }
@ -813,7 +821,7 @@ namespace Luneraria.Core
{ {
if (!unit.IsMobile()) if (!unit.IsMobile())
continue; continue;
int flags = (unit.Alive ? 1 : 0) | (unit.InRange ? 2 : 0) | ((unit.LeapSerial & 0xFF) << 2) | ((unit.UltimateSerial & 0xFF) << 10); int flags = (unit.Alive ? 1 : 0) | (unit.InRange ? 2 : 0) | ((unit.LeapSerial & 0xFF) << 2) | ((unit.UltimateSerial & 0xFF) << 10) | (unit.Stunned() ? 1 << 18 : 0);
data.Add(unit.Id); data.Add(unit.Id);
data.Add((float)unit.Position.X); data.Add((float)unit.Position.X);
data.Add((float)unit.Position.Y); data.Add((float)unit.Position.Y);
@ -834,7 +842,19 @@ namespace Luneraria.Core
public float[] BuildingHpArray() public float[] BuildingHpArray()
{ {
IReadOnlyList<BuildingDef> buildings = MatchState.Map.Buildings; IReadOnlyList<BuildingDef> buildings = MatchState.Map.Buildings;
var data = new float[buildings.Count]; // S4: four more values after the buildings carry the running glyph of each team (lane
// index + 1, seconds left) so guests see the glyph ring; older guests ignore them.
var data = new float[buildings.Count + 4];
LuneCombat glyphs = MatchState.Phase == Phase.Combat ? MatchState.Combat : null;
for (int team = 0; team < 2 && glyphs != null; team++)
{
double left = glyphs.GlyphUntil[team] - glyphs.Elapsed;
if (glyphs.GlyphLane[team].Length > 0 && left > 0.0)
{
data[buildings.Count + team * 2] = LuneMap.LaneIndex(glyphs.GlyphLane[team]) + 1;
data[buildings.Count + team * 2 + 1] = (float)left;
}
}
for (int index = 0; index < buildings.Count; index++) for (int index = 0; index < buildings.Count; index++)
{ {
double hp; double hp;

View file

@ -747,6 +747,8 @@ namespace Luneraria.Core
} }
if (unit.HitCount % 3 == 0 && unit.HasTalent("stammschlag")) if (unit.HitCount % 3 == 0 && unit.HasTalent("stammschlag"))
damage *= 1.6; damage *= 1.6;
if (unit.Ability() == "brunhild" && HeroLike(target))
damage *= BrunhildHunter;
if (unit.LeapStrike) if (unit.LeapStrike)
{ {
damage *= SylvaraLeapStrike; damage *= SylvaraLeapStrike;
@ -811,6 +813,9 @@ namespace Luneraria.Core
case "sylvara": case "sylvara":
unit.AbilityReady = SylvaraFirstThrow; unit.AbilityReady = SylvaraFirstThrow;
break; break;
case "brunhild":
unit.AbilityReady = BrunhildFirstSpear;
break;
} }
} }
@ -863,6 +868,8 @@ namespace Luneraria.Core
{ {
if (unit.Ability() == "sylvara") if (unit.Ability() == "sylvara")
SylvaraStep(unit, gates); SylvaraStep(unit, gates);
else if (unit.Ability() == "brunhild")
BrunhildStep(unit, gates);
double regen = unit.Def.Regen; double regen = unit.Def.Regen;
if (regen > 0.0 && unit.Hp < unit.MaxHp) if (regen > 0.0 && unit.Hp < unit.MaxHp)
QueueHeal(unit, unit.MaxHp * regen * Balance.SimStep); QueueHeal(unit, unit.MaxHp * regen * Balance.SimStep);
@ -969,6 +976,9 @@ namespace Luneraria.Core
case "sylvara": case "sylvara":
success = SylvaraThrow(unit, gates); success = SylvaraThrow(unit, gates);
break; break;
case "brunhild":
success = BrunhildSpear(unit, gates);
break;
} }
if (success) if (success)
{ {
@ -1104,6 +1114,97 @@ namespace Luneraria.Core
return true; return true;
} }
// H2 Brunhild
public const double BrunhildFirstSpear = 3.0;
public const double BrunhildSpearRange = 7.0;
public const double BrunhildHunter = 1.25;
public const double BrunhildShield = 0.30;
static bool HeroLike(LuneUnit unit) { return unit.Kind == "hero" || unit.Kind == "champion"; }
/// <summary>Enemies within the radius, farthest first (ties by id), mobile only.</summary>
List<LuneUnit> Farthest(LuneUnit unit, double radius, int maximum)
{
List<LuneUnit> result = NearbyMobile(unit, radius, 1000);
result.Reverse();
GdMath.SortStable(result, (a, b) =>
{
double ad = a.Position.DistanceTo(unit.Position);
double bd = b.Position.DistanceTo(unit.Position);
return GdMath.IsEqualApprox(ad, bd) ? a.Id < b.Id : ad > bd;
});
if (result.Count > maximum)
result.RemoveRange(maximum, result.Count - maximum);
return result;
}
/// <summary>Speerwurf: 120 % to the farthest enemy in 7 m (Speerregen: three), marked 4 s (+15 % damage taken).</summary>
bool BrunhildSpear(LuneUnit unit, Dictionary<string, bool> gates)
{
List<LuneUnit> victims = Farthest(unit, BrunhildSpearRange, unit.HasTalent("speerregen") ? 3 : 1);
if (victims.Count == 0)
return false;
double damage = unit.Def.Damage * (1.0 + unit.DamageBonus()) * 1.2;
foreach (LuneUnit victim in victims)
{
double hit = damage * (HeroLike(victim) ? BrunhildHunter * (unit.HasTalent("walkuerenblut") ? 2.0 : 1.0) : 1.0);
QueueDamage(victim, victim.Mitigated(hit, unit.Def.AttackType), gates);
AddEffect(victim, "valkyrie_mark", "vulnerable", 0.15, 4.0);
}
return true;
}
/// <summary>
/// Walkürensturz (once per combat after 2 s, by the planned rule): she leaps to her target
/// (an enemy hero or champion in 7 m first, then the marked enemy, then her current target),
/// deals 200 % to every enemy within 3 m of it and stuns them 1 s (Götterdämmerung: 2 s in
/// 4 m); bosses are not stunned. Decided on the state at the start of the step.
/// </summary>
void BrunhildStep(LuneUnit unit, Dictionary<string, bool> gates)
{
if (unit.UltimateUsed || string.IsNullOrEmpty(unit.Def.UltimateRule) || unit.CombatTime + 0.000001 < LuneContent.UltimateDelay)
return;
List<LuneUnit> reach = NearbyMobile(unit, BrunhildSpearRange, 1000);
if (reach.Count == 0)
return;
LuneUnit target = reach.Find(HeroLike) ?? reach.Find(other => other.Effects.ContainsKey("valkyrie_mark"))
?? (unit.Target != null && reach.Contains(unit.Target) ? unit.Target : reach[0]);
bool full = unit.HasTalent("goetterdaemmerung");
double radius = full ? 4.0 : 3.0;
bool release = false;
switch (unit.Def.UltimateRule)
{
case "gruppe":
release = Nearby(unit, false, target.Position, 4.0, 1000).FindAll(other => other.IsMobile()).Count >= 3;
break;
case "held":
release = HeroLike(target);
break;
case "notfall":
release = unit.Hp < unit.MaxHp * 0.4;
break;
case "sofort":
release = true;
break;
}
if (!release)
return;
double damage = unit.Def.Damage * (1.0 + unit.DamageBonus()) * 2.0;
foreach (LuneUnit victim in Nearby(unit, false, target.Position, radius, 1000))
{
if (!victim.IsMobile())
continue;
QueueDamage(victim, victim.Mitigated(damage * (HeroLike(victim) ? BrunhildHunter : 1.0), unit.Def.AttackType), gates);
if (!victim.IsBoss())
AddEffect(victim, "valkyrie_stun", "stun", 1.0, full ? 2.0 : 1.0);
}
// Walkürenschild: after the leap she is shielded like Sylvara after hers.
_pendingShields.Add(new PendingShield { Unit = unit, Amount = unit.MaxHp * BrunhildShield, Duration = 5.0 });
unit.LeapTarget = target;
unit.UltimateUsed = true;
unit.UltimateSerial += 1;
}
void OnHit(LuneUnit unit, LuneUnit primary, List<LuneUnit> living, Dictionary<string, bool> gates) void OnHit(LuneUnit unit, LuneUnit primary, List<LuneUnit> living, Dictionary<string, bool> gates)
{ {
string ability = unit.Ability(); string ability = unit.Ability();

View file

@ -74,6 +74,40 @@ namespace Luneraria.Core
return match.Map.LanePoint(0, lane, match.Map.LanePaths[lane].Length * 0.5, 0.0); return match.Map.LanePoint(0, lane, match.Map.LanePaths[lane].Length * 0.5, 0.0);
} }
/// <summary>
/// S4: everything that gives the team sight in the shown combat (or planning preview):
/// own living units, own standing buildings (from the match, so the planning preview has
/// them too) and the team's wards. Each as point, radius and zone.
/// </summary>
public static List<KeyValuePair<Vec2, double>> Vision(LuneMatch match, LuneCombat shown, int team, string zone = "lane")
{
var result = new List<KeyValuePair<Vec2, double>>();
if (match == null || team < 0 || team > 1)
return result;
if (shown != null)
{
foreach (LuneUnit unit in shown.Units)
{
if (unit.Team == team && unit.Alive && unit.IsMobile() && unit.Zone == zone)
result.Add(new KeyValuePair<Vec2, double>(unit.Position, UnitSight));
}
}
if (zone == "lane")
{
foreach (BuildingDef definition in match.Map.Buildings)
{
if (definition.Team == team && match.BuildingHp[definition.Id] > 0.0)
result.Add(new KeyValuePair<Vec2, double>(definition.Position, BuildingSight));
}
foreach (string lane in LuneMap.Lanes)
{
if (match.Boss.Wards[team * 3 + LuneMap.LaneIndex(lane)] > 0)
result.Add(new KeyValuePair<Vec2, double>(WardPoint(match, lane), WardSight));
}
}
return result;
}
/// <summary> /// <summary>
/// Ids of the enemy units the team cannot see in the shown combat (the live combat, or /// Ids of the enemy units the team cannot see in the shown combat (the live combat, or
/// the planning preview when planning). Empty without the extended rules or for team -1. /// the planning preview when planning). Empty without the extended rules or for team -1.

View file

@ -79,6 +79,11 @@ namespace Luneraria.Core
public int AbilitySerial; public int AbilitySerial;
public int LeapSerial; public int LeapSerial;
public int UltimateSerial; public int UltimateSerial;
/// <summary>S4: stunned as reported by the host's frame (guests have no effects); presentation only.</summary>
public bool NetStunned;
/// <summary>Stunned for the view: the own effect on the host, the frame flag on a guest.</summary>
public bool ShowsStun() { return NetStunned || Stunned(); }
public double HitFlash; public double HitFlash;
public bool InRange; public bool InRange;
public double DeathTime = -1.0; public double DeathTime = -1.0;
@ -103,7 +108,8 @@ namespace Luneraria.Core
public double Mitigated(double raw, int attackType) public double Mitigated(double raw, int attackType)
{ {
double value = GdMath.Max(0.0, raw) * DamageMatrix[GdMath.Clamp(attackType, 0, 2), ArmorType()]; double value = GdMath.Max(0.0, raw) * DamageMatrix[GdMath.Clamp(attackType, 0, 2), ArmorType()];
return value * (1.0 - DamageReduction()); // H2: a unit marked by Brunhild's spear takes more damage ("vulnerable"; 0 for everyone else).
return value * (1.0 - DamageReduction()) * (1.0 + StrongestEffect("vulnerable"));
} }
/// <summary>Applies an already mitigated amount through the shield.</summary> /// <summary>Applies an already mitigated amount through the shield.</summary>
@ -209,8 +215,13 @@ namespace Luneraria.Core
return GdMath.Min(0.35, result + Def.ReductionBonus); return GdMath.Min(0.35, result + Def.ReductionBonus);
} }
/// <summary>H2: Brunhild's stun stops attacks and movement for its duration.</summary>
public bool Stunned() { return StrongestEffect("stun") > 0.0; }
public double AttackSpeedFactor() public double AttackSpeedFactor()
{ {
if (Stunned())
return 0.0;
double slowing = StrongestEffect("attack_slow") * (IsBoss() ? 0.5 : 1.0); double slowing = StrongestEffect("attack_slow") * (IsBoss() ? 0.5 : 1.0);
double bonus = Def.AttackSpeedBonus; double bonus = Def.AttackSpeedBonus;
return 1.0 + GdMath.Clamp(StrongestEffect("attack_speed") - slowing + bonus, -0.25, 0.5); return 1.0 + GdMath.Clamp(StrongestEffect("attack_speed") - slowing + bonus, -0.25, 0.5);
@ -222,6 +233,8 @@ namespace Luneraria.Core
public double MovementFactor() public double MovementFactor()
{ {
if (Stunned())
return 0.0;
return 1.0 - GdMath.Min(0.35, StrongestEffect("movement_slow") * (IsBoss() ? 0.5 : 1.0)); return 1.0 - GdMath.Min(0.35, StrongestEffect("movement_slow") * (IsBoss() ? 0.5 : 1.0));
} }

View file

@ -48,6 +48,7 @@ namespace Luneraria.EditorTools
} }
library.HeroRing = Marker("Ring_Hero", LuneMaterialFactory.Hex("f2c96b"), 2.2f, false); library.HeroRing = Marker("Ring_Hero", LuneMaterialFactory.Hex("f2c96b"), 2.2f, false);
library.MoonBurst = Marker("Ring_MoonBurst", LuneMaterialFactory.Hex("8fb8ff"), 4f, false); library.MoonBurst = Marker("Ring_MoonBurst", LuneMaterialFactory.Hex("8fb8ff"), 4f, false);
library.FogOverlay = FogMaterial();
for (int team = 0; team < 2; team++) for (int team = 0; team < 2; team++)
{ {
library.OwnerRing[team] = Marker("Ring_Owner_" + team, LuneMaterialFactory.TeamColor[team], 3f, false); library.OwnerRing[team] = Marker("Ring_Owner_" + team, LuneMaterialFactory.TeamColor[team], 3f, false);
@ -180,6 +181,24 @@ namespace Luneraria.EditorTools
return existing; return existing;
} }
/// <summary>S4: the fog of war overlay material (night blue, alpha from the grid's vertices).</summary>
static Material FogMaterial()
{
string path = LuneMaterialFactory.Folder + "/Markers/Fog_Overlay.mat";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Shader shader = Shader.Find("Luneraria/FogOverlay");
var material = AssetDatabase.LoadAssetAtPath<Material>(path);
if (material == null)
{
material = new Material(shader);
AssetDatabase.CreateAsset(material, path);
}
material.shader = shader;
material.SetColor("_Color", new Color(.03f, .04f, .08f, 1f));
EditorUtility.SetDirty(material);
return material;
}
/// <summary>Unshaded marker colour (Godot _flat with emission energy); bars draw on top.</summary> /// <summary>Unshaded marker colour (Godot _flat with emission energy); bars draw on top.</summary>
static Material Marker(string name, Color srgb, float energy, bool onTop) static Material Marker(string name, Color srgb, float energy, bool onTop)
{ {

View file

@ -189,6 +189,14 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: 2844b8628dab84e70bea79fbffa9958f, type: 2} Neutral: {fileID: 2100000, guid: 2844b8628dab84e70bea79fbffa9958f, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
Rot: {fileID: 0} Rot: {fileID: 0}
- Key: AI_Brunhild
Neutral: {fileID: 2100000, guid: 86538db76bda54b19acbf73c7e1e6432, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_BrunhildSpeer
Neutral: {fileID: 2100000, guid: 683e7a7f8c9ff4bafbe24e22287ad674, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Funkenlanze - Key: AI_Funkenlanze
Neutral: {fileID: 2100000, guid: d5a88e3321a884b30bd8a8606b78090d, type: 2} Neutral: {fileID: 2100000, guid: d5a88e3321a884b30bd8a8606b78090d, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
@ -745,6 +753,14 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: 09c239a4cf52e4af4969869c24b078ff, type: 2} Neutral: {fileID: 2100000, guid: 09c239a4cf52e4af4969869c24b078ff, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
Rot: {fileID: 0} Rot: {fileID: 0}
- Key: AI_Brunhild_Eiswalkuere
Neutral: {fileID: 2100000, guid: 8058295d8bee34a8b831603ad53f5501, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_BrunhildSpeer_Eiswalkuere
Neutral: {fileID: 2100000, guid: 40b5dbee4b87547ef9b92e96deeb30a6, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Sylvara_Blutmond - Key: AI_Sylvara_Blutmond
Neutral: {fileID: 2100000, guid: aa1c3bf7df6bd46ddbe3d0c8051d5b82, type: 2} Neutral: {fileID: 2100000, guid: aa1c3bf7df6bd46ddbe3d0c8051d5b82, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}

View file

@ -0,0 +1,31 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Fog_Overlay
m_Shader: {fileID: 4800000, guid: 7633b9f391704a8f84ae742a82128282, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs: []
m_Ints: []
m_Floats: []
m_Colors:
- _Color: {r: 0.03, g: 0.04, b: 0.08, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7846e5bf0b03a456ab8720cbca2c8d9d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AI_Brunhild
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlbedoMap:
m_Texture: {fileID: 2800000, guid: 0dbeeb8c48f344e64962b71d5e9fcca1, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: f701c67235f354e4dac0ee3235b94b3d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: 1722b2d9a084347b8845372bf878a61f, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StoneMap:
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Cull: 2
- _Energy: 1
- _Flicker: 0
- _Glow: 1.25
- _Metallic: 1
- _Mode: 0
- _NormalStrength: 1
- _ObjectSpace: 0
- _Quality: 1
- _Relief: 0.016
- _Rim: 0.35
- _Roughness: 1
- _Seed: 0
- _ShadowNormalScale: 0
- _StoneScale: 1
- _UvMaps: 1
- _VertexColor: 0
m_Colors:
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 86538db76bda54b19acbf73c7e1e6432
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AI_BrunhildSpeer
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlbedoMap:
m_Texture: {fileID: 2800000, guid: 336afb236cf9f438dae9687f76420327, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 9b19528e38c1f468a8dfb54927968778, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: cf3a5ed7600ba42349191e05cfe011e8, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StoneMap:
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Cull: 2
- _Energy: 1
- _Flicker: 0
- _Glow: 1.25
- _Metallic: 1
- _Mode: 0
- _NormalStrength: 1
- _ObjectSpace: 0
- _Quality: 1
- _Relief: 0.016
- _Rim: 0.35
- _Roughness: 1
- _Seed: 0
- _ShadowNormalScale: 0
- _StoneScale: 1
- _UvMaps: 1
- _VertexColor: 0
m_Colors:
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 683e7a7f8c9ff4bafbe24e22287ad674
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AI_BrunhildSpeer_Eiswalkuere
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlbedoMap:
m_Texture: {fileID: 2800000, guid: 1fadc4bab123948b3b3f54a2fe52173a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 9b19528e38c1f468a8dfb54927968778, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: cf3a5ed7600ba42349191e05cfe011e8, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StoneMap:
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Cull: 2
- _Energy: 1
- _Flicker: 0
- _Glow: 1.25
- _Metallic: 1
- _Mode: 0
- _NormalStrength: 1
- _ObjectSpace: 0
- _Quality: 1
- _Relief: 0.016
- _Rim: 0.35
- _Roughness: 1
- _Seed: 0
- _ShadowNormalScale: 0
- _StoneScale: 1
- _UvMaps: 1
- _VertexColor: 0
m_Colors:
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 40b5dbee4b87547ef9b92e96deeb30a6
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,68 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AI_Brunhild_Eiswalkuere
m_Shader: {fileID: 4800000, guid: 9809bd5750e264586bd30e14a6f1bd4e, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_InvalidKeywords: []
m_LightmapFlags: 0
m_EnableInstancingVariants: 1
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AlbedoMap:
m_Texture: {fileID: 2800000, guid: ed6f51893270d4a81a491e1b895a5815, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: f701c67235f354e4dac0ee3235b94b3d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: 1722b2d9a084347b8845372bf878a61f, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _StoneMap:
m_Texture: {fileID: 2800000, guid: 2e11a30a0df8143ab84722ec0a116b6d, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _Cull: 2
- _Energy: 1
- _Flicker: 0
- _Glow: 1.25
- _Metallic: 1
- _Mode: 0
- _NormalStrength: 1
- _ObjectSpace: 0
- _Quality: 1
- _Relief: 0.016
- _Rim: 0.35
- _Roughness: 1
- _Seed: 0
- _ShadowNormalScale: 0
- _StoneScale: 1
- _UvMaps: 1
- _VertexColor: 0
m_Colors:
- _AlbedoMean: {r: 1, g: 1, b: 1, a: 1}
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _OrmMean: {r: 1, g: 1, b: 1, a: 1}
- _RimColor: {r: 0.8, g: 0.86, b: 1, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8058295d8bee34a8b831603ad53f5501
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load diff

View file

@ -25,6 +25,9 @@ MonoBehaviour:
- Id: basaltbastion_meshy - Id: basaltbastion_meshy
Prefab: {fileID: 919132149155446097, guid: aa5734da897ea44808385f37d34070bf, type: 3} Prefab: {fileID: 919132149155446097, guid: aa5734da897ea44808385f37d34070bf, type: 3}
Controller: {fileID: 9100000, guid: a456a0a7fa6d34b699183f75137f8f86, type: 2} Controller: {fileID: 9100000, guid: a456a0a7fa6d34b699183f75137f8f86, type: 2}
- Id: brunhild
Prefab: {fileID: 919132149155446097, guid: 29d894f788c5f4fbbacf819091c19542, type: 3}
Controller: {fileID: 9100000, guid: 8f779b941008d48fea9cfb256567bb9d, type: 2}
- Id: e01 - Id: e01
Prefab: {fileID: 919132149155446097, guid: 940635ed8b965461daabecd5cafdba92, type: 3} Prefab: {fileID: 919132149155446097, guid: 940635ed8b965461daabecd5cafdba92, type: 3}
Controller: {fileID: 0} Controller: {fileID: 0}
@ -270,6 +273,7 @@ MonoBehaviour:
- {fileID: 2100000, guid: 77d940cdf3d6043cb93c647607c3e35e, type: 2} - {fileID: 2100000, guid: 77d940cdf3d6043cb93c647607c3e35e, type: 2}
HeroRing: {fileID: 2100000, guid: 862d58435f9824d969aecf8551257a64, type: 2} HeroRing: {fileID: 2100000, guid: 862d58435f9824d969aecf8551257a64, type: 2}
MoonBurst: {fileID: 2100000, guid: c79261fd1aa5e42479782d3bac53f7ba, type: 2} MoonBurst: {fileID: 2100000, guid: c79261fd1aa5e42479782d3bac53f7ba, type: 2}
FogOverlay: {fileID: 2100000, guid: 7846e5bf0b03a456ab8720cbca2c8d9d, type: 2}
BarBack: {fileID: 2100000, guid: 8efe289a463614fee8dcb19e789f2bf8, type: 2} BarBack: {fileID: 2100000, guid: 8efe289a463614fee8dcb19e789f2bf8, type: 2}
BarFill: BarFill:
- {fileID: 2100000, guid: 778bc4f74208340e38dc099b897f3db3, type: 2} - {fileID: 2100000, guid: 778bc4f74208340e38dc099b897f3db3, type: 2}

View file

@ -0,0 +1,39 @@
// S4 fog of war: a ground-hugging grid whose vertex alpha darkens what the viewer's team cannot see.
Shader "Luneraria/FogOverlay"
{
Properties
{
_Color("Fog colour", Color) = (0.03, 0.04, 0.07, 1)
}
SubShader
{
Tags { "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" "Queue" = "Transparent-50" }
Pass
{
Name "Fog"
Tags { "LightMode" = "UniversalForward" }
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
ZTest LEqual
Cull Off
HLSLPROGRAM
#pragma vertex Vert
#pragma fragment Frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
CBUFFER_START(UnityPerMaterial)
half4 _Color;
CBUFFER_END
struct Attributes { float4 positionOS : POSITION; half4 color : COLOR; };
struct Varyings { float4 positionCS : SV_POSITION; half alpha : TEXCOORD0; };
Varyings Vert(Attributes input)
{
Varyings output;
output.positionCS = TransformObjectToHClip(input.positionOS.xyz);
output.alpha = input.color.a;
return output;
}
half4 Frag(Varyings input) : SV_Target { return half4(_Color.rgb, _Color.a * input.alpha); }
ENDHLSL
}
}
}

View file

@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 7633b9f391704a8f84ae742a82128282
ShaderImporter:
externalObjects: {}
defaultTextures: []
nonModifiableTextures: []
userData:
assetBundleName:
assetBundleVariant:

View file

@ -50,7 +50,7 @@ namespace Luneraria.Core.Tests
public static IList<CheckSuite> All() public static IList<CheckSuite> All()
{ {
return new List<CheckSuite> { new ContentSuite(), new CoreRulesSuite(), new M2RulesSuite(), new GoldenSuite(), new DeterminismSuite(), new NetSuite(), new NetRoundsSuite(), new H1HeroSuite(), new S1RulesSuite(), new S2RulesSuite(), new S3RulesSuite() }; return new List<CheckSuite> { new ContentSuite(), new CoreRulesSuite(), new M2RulesSuite(), new GoldenSuite(), new DeterminismSuite(), new NetSuite(), new NetRoundsSuite(), new H1HeroSuite(), new S1RulesSuite(), new S2RulesSuite(), new S3RulesSuite(), new H2HeroSuite(), new S4NetSuite() };
} }
} }
} }

View file

@ -90,7 +90,7 @@ namespace Luneraria.Core.Tests
// Heroes added after the port (H1) follow the reference heroes; those must match exactly. // Heroes added after the port (H1) follow the reference heroes; those must match exactly.
Check(expected.Keys.SequenceEqual(ContentData.ReferenceHeroes) && ContentData.Heroes.Keys.Take(ContentData.ReferenceHeroes.Length).SequenceEqual(ContentData.ReferenceHeroes), Check(expected.Keys.SequenceEqual(ContentData.ReferenceHeroes) && ContentData.Heroes.Keys.Take(ContentData.ReferenceHeroes.Length).SequenceEqual(ContentData.ReferenceHeroes),
"heroes: same reference ids in the same order, later heroes after them"); "heroes: same reference ids in the same order, later heroes after them");
Check(ContentData.Heroes.Keys.Skip(ContentData.ReferenceHeroes.Length).SequenceEqual(new[] { "held_sylvara" }), "heroes: exactly the documented later heroes (H1: held_sylvara)"); Check(ContentData.Heroes.Keys.Skip(ContentData.ReferenceHeroes.Length).SequenceEqual(new[] { "held_sylvara", "held_brunhild" }), "heroes: exactly the documented later heroes (H1 Sylvara, H2 Brunhild)");
foreach (KeyValuePair<string, object> pair in expected) foreach (KeyValuePair<string, object> pair in expected)
{ {
var entry = MiniJson.Obj(pair.Value); var entry = MiniJson.Obj(pair.Value);

View file

@ -0,0 +1,148 @@
using System.Collections.Generic;
using System.Linq;
namespace Luneraria.Core.Tests
{
/// <summary>
/// H2: Brunhild, the Valkyrie. Purchase and rules, hunter passive, spear with mark, the leap
/// with area damage and stun (bosses immune), talents, skin, bot profile; reference untouched.
/// </summary>
public sealed class H2HeroSuite : CheckSuite
{
public override string Name { get { return "h2"; } }
protected override void RunChecks()
{
TestPurchase();
TestSpear();
TestUltimate();
TestPassiveAndTalents();
TestBots();
}
static LuneCombat Arena(HeroState hero, out LuneUnit brunhild, params KeyValuePair<string, double>[] enemies)
{
var balance = LuneBalance.Default();
var combat = new LuneCombat(new LuneMap(balance), balance, 5);
UnitDef definition = LuneContent.HeroDefinition(hero);
definition.Role = "melee";
brunhild = combat.Spawn("hero", 0, "mid", definition, 40.0, 0.0, 0, "h0-1");
Vec2 forward = combat.Map.LaneForward(0, "mid", 40.0);
foreach (KeyValuePair<string, double> enemy in enemies)
{
bool isHero = enemy.Key == "held";
UnitDef def = isHero ? LuneContent.HeroDefinition(new HeroState { HeroId = "held_ringborke" }) : ContentData.Enemies[enemy.Key].Clone();
def.MaxHp = 50000.0;
def.Speed = 0.0;
LuneUnit unit = combat.Spawn(isHero ? "hero" : "monster", 1, "mid", def, 40.0, 0.0, isHero ? 3 : -1, isHero ? "h3-1" : "");
unit.Position = brunhild.Position + forward * enemy.Value;
unit.PreviousPosition = unit.Position;
}
return combat;
}
static KeyValuePair<string, double> At(string id, double distance) { return new KeyValuePair<string, double>(id, distance); }
static void Run(LuneCombat combat, double seconds)
{
int steps = (int)(seconds / combat.Balance.SimStep + 0.5);
for (int i = 0; i < steps && !combat.Finished; i++)
combat.Step();
}
void TestPurchase()
{
var state = new LuneMatch();
state.Setup(new MatchOptions { Seed = 71, HumanSlot = -1 });
state.Players[0].Draft.Gold += 1000;
Check(state.Submit(0, Command.HeroBuy("held_brunhild")).Ok, "Brunhild can be recruited for 260");
Check(LuneContent.UltimateRuleFor(state.Players[0].Draft.Hero) == "gruppe", "default rule Gruppe");
Check(state.Submit(0, Command.UltimateRule("held")).Ok && state.Submit(0, Command.HeroSkin("eiswalkuere")).Ok, "rule Heldenjagd and skin Eiswalküre");
Check(!state.Submit(0, Command.HeroSkin("blutmond")).Ok, "Sylvara's skin is not hers");
UnitDef definition = LuneContent.HeroDefinition(state.Players[0].Draft.Hero);
Check(definition.Id == "brunhild" && definition.Skin == "eiswalkuere" && definition.UltimateRule == "held" && GdMath.IsEqualApprox(definition.AttackRange, 2.0), "definition carries model, skin, rule and the spear's reach");
}
void TestSpear()
{
LuneUnit brunhild;
LuneCombat combat = Arena(new HeroState { HeroId = "held_brunhild", Ultimate = "notfall" }, out brunhild, At("e01", 1.5), At("e01", 4.0), At("e04", 6.5));
LuneUnit far = combat.Units.First(u => u.Def.Id == "e04");
Run(combat, LuneCombat.BrunhildFirstSpear - 0.1);
Check(brunhild.AbilitySerial == 0, "no spear before 3 s");
Run(combat, 0.2);
Check(brunhild.AbilitySerial == 1 && far.Effects.ContainsKey("valkyrie_mark"), "the first spear marks the farthest enemy in 7 m");
double raw = 100.0;
var probe = new LuneUnit { Def = far.Def };
Check(GdMath.IsEqualApprox(far.Mitigated(raw, 0), probe.Mitigated(raw, 0) * 1.15), "a marked enemy takes 15 % more damage");
}
void TestUltimate()
{
LuneUnit brunhild;
LuneCombat combat = Arena(new HeroState { HeroId = "held_brunhild", Ultimate = "held" }, out brunhild, At("e01", 1.5), At("held", 6.0), At("e01", 6.8), At("e07", 6.5));
LuneUnit hero = combat.Units.First(u => u.Kind == "hero" && u.Team == 1);
LuneUnit boss = combat.Units.First(u => u.Def.Id == "e07");
Run(combat, LuneContent.UltimateDelay - 0.1);
Check(brunhild.UltimateSerial == 0, "no ultimate before 2 s");
Run(combat, 0.1);
Check(brunhild.UltimateSerial == 1, "Heldenjagd fires with an enemy hero in 7 m");
Check(brunhild.Position.DistanceTo(hero.Position) < 1.5, "she leaps next to the hero");
Check(hero.Stunned() && !boss.Stunned(), "the hero is stunned, the boss is immune");
Check(hero.AttackSpeedFactor() == 0.0 && hero.MovementFactor() == 0.0, "a stunned unit neither attacks nor moves");
Run(combat, 1.1);
Check(!hero.Stunned(), "the stun ends after 1 s");
Run(combat, 8.0);
Check(brunhild.UltimateSerial == 1, "once per combat");
LuneUnit calm;
LuneCombat group = Arena(new HeroState { HeroId = "held_brunhild" }, out calm, At("e01", 3.0), At("e01", 3.5));
Run(group, 4.0);
Check(calm.UltimateSerial == 0, "Gruppe waits for three enemies at the target");
}
void TestPassiveAndTalents()
{
LuneUnit brunhild;
LuneCombat combat = Arena(new HeroState { HeroId = "held_brunhild", Ultimate = "notfall" }, out brunhild, At("held", 1.5));
LuneUnit hero = combat.Units.First(u => u.Kind == "hero" && u.Team == 1);
double before = hero.Hp;
int guard = 0;
while (brunhild.HitCount == 0 && guard++ < 200)
combat.Step();
double expected = hero.Mitigated(brunhild.Def.Damage * (1.0 + brunhild.DamageBonus()) * LuneCombat.BrunhildHunter, brunhild.Def.AttackType);
Check(GdMath.IsEqualApprox(before - hero.Hp, expected), "Heldenjägerin: +25 % against heroes");
UnitDef raven = LuneContent.HeroDefinition(new HeroState { HeroId = "held_brunhild", Xp = 1000, Talents = new List<string> { "speerregen", "rabenschwinge" } });
Check(GdMath.IsEqualApprox(raven.AttackSpeedBonus, 0.20), "Rabenschwinge: +20 % attack tempo");
LuneUnit rain;
LuneCombat spears = Arena(new HeroState { HeroId = "held_brunhild", Ultimate = "notfall", Talents = new List<string> { "speerregen", "goetterdaemmerung" } }, out rain,
At("e01", 4.0), At("e01", 5.0), At("e01", 6.0), At("e01", 1.0));
Run(spears, 3.1);
Check(spears.Units.Count(u => u.Effects.ContainsKey("valkyrie_mark")) == 3, "Speerregen: three marked enemies");
LuneUnit dusk;
LuneCombat stun = Arena(new HeroState { HeroId = "held_brunhild", Ultimate = "sofort", Talents = new List<string> { "speerregen", "goetterdaemmerung" } }, out dusk, At("e01", 2.0));
Run(stun, 2.05);
LuneUnit victim = stun.Units.First(u => u.Kind == "monster");
Run(stun, 1.5);
Check(victim.Stunned(), "Götterdämmerung: the stun lasts 2 s");
}
void TestBots()
{
bool picked = false;
for (int seed = 1; seed <= 16 && !picked; seed++)
{
var probe = new LuneMatch();
probe.Setup(new MatchOptions { Seed = seed, HumanSlot = -1, Extended = true });
for (int slot = 0; slot < 6; slot++)
picked |= LuneBot.ProfileFor(probe, slot) == "walkuere";
}
Check(picked, "extended bots pick Brunhild's profile");
var reference = new LuneMatch();
reference.Setup(new MatchOptions { Seed = 3, HumanSlot = -1 });
bool clean = true;
for (int slot = 0; slot < 6; slot++)
clean &= !ContentData.ExtraBotProfiles.ContainsKey(LuneBot.ProfileFor(reference, slot));
Check(clean, "reference rotation untouched");
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 2fa3dc51ddee4a919bec93bf34fc29f9

View file

@ -0,0 +1,55 @@
using System.Collections.Generic;
using System.Linq;
namespace Luneraria.Core.Tests
{
/// <summary>
/// S4: what guests see of the extended rules. Over the in-process loopback a guest receives
/// the running glyph of each team (extra values after the building HP of a frame) and the
/// stun flag of every unit, and its fog sources match the host's (LuneFog.Vision).
/// </summary>
public sealed class S4NetSuite : CheckSuite
{
public override string Name { get { return "s4"; } }
protected override void RunChecks()
{
var hub = new LuneLoopback();
LuneSession host = hub.Attach(1, new LuneSession());
var options = new MatchOptions { Seed = 42, HumanSlot = 0, Extended = true,
Bunds = new List<string> { "glutpakt", "wurzelbund", "glutpakt", "wurzelbund", "glutpakt", "wurzelbund" } };
Check(host.HostNetwork(options, "Host"), "host starts");
LuneSession guest = hub.Attach(10, new LuneSession());
guest.JoinNetwork("Gast");
guest.OnClientConnected();
Check(guest.MatchState != null && guest.MatchState.Extended, "the guest's match has the extended rules");
host.PlanBotSeats();
host.Submit(Command.Buy("g01"));
host.ReadyUp();
guest.Submit(Command.Buy(guest.MatchState.BaseIds(guest.MatchState.Players[guest.LocalSlot].Bund)[0]));
guest.ReadyUp();
for (int i = 0; i < 20 && host.MatchState.Phase != Phase.Combat; i++)
host.HostTick(LuneNet.FrameInterval);
Check(host.MatchState.Phase == Phase.Combat && guest.MatchState.Phase == Phase.Combat, "both sides are in combat");
LuneCombat combat = host.MatchState.Combat;
for (int i = 0; i < 10; i++)
host.MatchState.StepCombat();
combat.GlyphLane[0] = "mid";
combat.GlyphUntil[0] = combat.Elapsed + 3.0;
LuneUnit target = combat.Units.First(u => u.IsMobile() && u.Team == 1 && u.Alive);
target.ApplyEffect("valkyrie_stun", "stun", 1.0, 2.0);
host.HostTick(LuneNet.FrameInterval);
LuneCombat mirror = guest.MatchState.Combat;
Check(mirror.GlyphLane[0] == "mid" && mirror.GlyphLane[1] == "", "the guest knows Blau's glyph on mid");
LuneUnit tower;
Check(mirror.Buildings.TryGetValue("blau_mid_outer", out tower) && mirror.Glyphed(tower), "the guest sees the mid tower glyphed");
LuneUnit copy = mirror.Units.FirstOrDefault(u => u.Id == target.Id);
Check(copy != null && copy.ShowsStun(), "the guest sees the stun");
Check(mirror.Units.Where(u => u.Id != target.Id && u.IsMobile()).All(u => !u.ShowsStun()), "nobody else looks stunned");
int team = 0;
int hostSources = LuneFog.Vision(host.MatchState, combat, team).Count;
int guestSources = LuneFog.Vision(guest.MatchState, mirror, team).Count;
Check(hostSources == guestSources && hostSources > 0, "fog sources agree on host and guest (" + hostSources + "/" + guestSources + ")");
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: df9ba1b1ef594679b037f9c14faa13c0

View file

@ -55,5 +55,7 @@ namespace Luneraria.Core.Tests
[Test] public void S1Rules() { RunSuite(new S1RulesSuite()); } [Test] public void S1Rules() { RunSuite(new S1RulesSuite()); }
[Test] public void S2Rules() { RunSuite(new S2RulesSuite()); } [Test] public void S2Rules() { RunSuite(new S2RulesSuite()); }
[Test] public void S3Rules() { RunSuite(new S3RulesSuite()); } [Test] public void S3Rules() { RunSuite(new S3RulesSuite()); }
[Test] public void H2Heroes() { RunSuite(new H2HeroSuite()); }
[Test] public void S4Net() { RunSuite(new S4NetSuite()); }
} }
} }

View file

@ -61,7 +61,7 @@ namespace Luneraria.UI.Tests
s.Hud.OpenHero(); s.Hud.OpenHero();
yield return HudSession.Frames(2); yield return HudSession.Frames(2);
s.Sync(); s.Sync();
Assert.AreEqual(4, s.Hud.HeroDetail.RecruitButtons.Count, "four heroes to recruit"); Assert.AreEqual(LuneContent.Heroes.Count, s.Hud.HeroDetail.RecruitButtons.Count, "every hero can be recruited");
Assert.IsTrue(s.Hud.HeroDetail.RecruitButtons.ContainsKey("held_sylvara"), "Sylvara can be recruited"); Assert.IsTrue(s.Hud.HeroDetail.RecruitButtons.ContainsKey("held_sylvara"), "Sylvara can be recruited");
s.Click(s.Hud.HeroDetail.RecruitButtons["held_sylvara"]); s.Click(s.Hud.HeroDetail.RecruitButtons["held_sylvara"]);
yield return HudSession.Frames(2); yield return HudSession.Frames(2);

View file

@ -0,0 +1,175 @@
using System;
using System.Collections;
using System.Linq;
using Luneraria.Core;
using Luneraria.View;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
namespace Luneraria.UI.Tests
{
/// <summary>
/// H2: Brunhild in the real scene (derived from the H1 test). BrunhildHud checks recruiting,
/// the tab "Ultimate & Skin" (four rules, two skins), the command slot, her figure with the
/// ultimate clip and the Eiswalküre material on body and spear, and the ultimate in combat.
/// BrunhildBilder captures the H2 evidence (1920×1080); LUNE_EVIDENCE names the folder below
/// docs/port/screenshots (default h2/spiel).
/// </summary>
public sealed class H2HeroViewsTests
{
static void Send(HudSession s, Command command)
{
CommandResult result = s.Match.Submit(HudSession.Human, command);
Assert.IsTrue(result.Ok, command.Type + ": " + result.Message);
s.Game.RebuildPreview();
s.Sync();
}
static LuneUnit Hero(HudSession s)
{
return s.Match.Combat?.Units.FirstOrDefault(u => u.Kind == "hero" && u.OwnerSlot == HudSession.Human);
}
static LuneUnitView ViewOf(LuneUnit unit)
{
return UnityEngine.Object.FindObjectsByType<LuneUnitView>(FindObjectsSortMode.None).FirstOrDefault(v => v.Unit == unit);
}
/// <summary>Steps the combat in single simulation steps until the condition holds (or the combat ends).</summary>
static IEnumerator Until(HudSession s, Func<bool> done, double limit = 60.0)
{
double time = 0.0;
while (!done() && time < limit && s.Runner.Current == LuneMatchRunner.Stage.Combat)
{
s.Runner.Advance(.05);
time += .05;
if ((int)(time / .05) % 10 == 0)
yield return null;
}
yield return HudSession.Frames(2);
s.Sync();
}
[UnityTest, Timeout(600000)]
public IEnumerator BrunhildHud()
{
var s = new HudSession();
yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 1500);
s.Hud.OpenHero();
yield return HudSession.Frames(2);
s.Sync();
Assert.AreEqual(LuneContent.Heroes.Count, s.Hud.HeroDetail.RecruitButtons.Count, "every hero can be recruited");
Assert.IsTrue(s.Hud.HeroDetail.RecruitButtons.ContainsKey("held_brunhild"), "Brunhild can be recruited");
s.Click(s.Hud.HeroDetail.RecruitButtons["held_brunhild"]);
yield return HudSession.Frames(2);
s.Sync();
Assert.AreEqual("held_brunhild", s.Me.Draft.Hero?.HeroId, "the recruit button buys Brunhild");
s.Hud.OpenHero(LuneHeroDetail.TabUltimate);
yield return HudSession.Frames(2);
s.Sync();
Assert.AreEqual(4, s.Hud.HeroDetail.RuleCards.Count, "four trigger rules");
Assert.AreEqual(2, s.Hud.HeroDetail.SkinCards.Count, "standard look and Eiswalküre");
Assert.IsTrue(s.Hud.HeroDetail.RuleCards["gruppe"].On, "default rule Gruppe is marked");
s.Click(s.Hud.HeroDetail.RuleCards["held"]);
yield return HudSession.Frames(2);
s.Sync();
Assert.AreEqual("held", s.Me.Draft.Hero.Ultimate, "a rule card sets the rule");
s.Click(s.Hud.HeroDetail.SkinCards["eiswalkuere"]);
yield return HudSession.Frames(2);
s.Sync();
Assert.AreEqual("eiswalkuere", s.Me.Draft.Hero.Skin, "a skin card sets the skin");
Assert.IsTrue(HudSession.Visible(s.Hud.HeroCard.CommandSlot), "the hero card shows the ultimate");
StringAssert.Contains("HELDENJAGD", s.Hud.HeroCard.CommandSlot.Text, "the command slot names the rule");
s.Hud.CloseModal();
s.Game.Key(KeyCode.Space);
yield return HudSession.Frames(2);
LuneUnit hero = Hero(s);
Assert.IsNotNull(hero, "Brunhild fights");
Assert.AreEqual("eiswalkuere", hero.Def.Skin);
yield return HudSession.Frames(3);
LuneUnitView view = ViewOf(hero);
Assert.IsNotNull(view, "Brunhild has a view");
Animator animator = view.GetComponentInChildren<Animator>();
Assert.IsNotNull(animator, "skinned figure");
Assert.IsTrue(animator.HasState(0, Animator.StringToHash("ultimate")), "ultimate clip");
string[] materials = view.GetComponentsInChildren<Renderer>().SelectMany(r => r.sharedMaterials).Where(m => m != null).Select(m => m.name).Distinct().ToArray();
Assert.Contains("AI_Brunhild_Eiswalkuere", materials, "the Blutmond material is dressed: " + string.Join(", ", materials));
Assert.Contains("AI_BrunhildSpeer_Eiswalkuere", materials, "both sickles in Blutmond");
yield return Until(s, () => hero.UltimateSerial > 0 || !hero.Alive);
Assert.IsTrue(hero.UltimateSerial > 0 || !hero.Alive, "the ultimate fires (or Brunhild fell first)");
if (hero.UltimateSerial > 0)
StringAssert.Contains("GENUTZT", s.Hud.HeroCard.CommandSlot.Text, "the card reports the fired ultimate");
s.Close();
}
[UnityTest, Timeout(900000), Explicit("Bildwerkzeug: nur gezielt per -testFilter")]
public IEnumerator BrunhildBilder()
{
string evidence = Environment.GetEnvironmentVariable("LUNE_EVIDENCE");
string folder = "docs/port/screenshots/" + (string.IsNullOrEmpty(evidence) ? "h2/spiel" : evidence) + "/";
var s = new HudSession();
yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 1500);
yield return s.Starter();
s.Leave();
s.Hud.OpenHero();
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "01-heldenwahl.png");
Send(s, Command.HeroBuy("held_brunhild"));
s.Hud.OpenHero(LuneHeroDetail.TabValues);
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "02-heldenfenster.png");
s.Hud.OpenHero(LuneHeroDetail.TabUltimate);
yield return new WaitForSecondsRealtime(.8f);
yield return s.Shot(folder + "03-ultimate-und-skin.png");
s.Hud.CloseModal();
yield return new WaitForSecondsRealtime(.3f);
LuneUnit waiting = s.View.Preview?.Units.FirstOrDefault(u => u.Kind == "hero" && u.OwnerSlot == HudSession.Human);
Assert.IsNotNull(waiting, "Brunhild in the planning preview");
s.Rig.LookAt(waiting.Position, 9f, true);
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "04-aufstellung.png");
s.Game.Key(KeyCode.Space);
yield return HudSession.Frames(2);
LuneUnit hero = Hero(s);
yield return Until(s, () => hero.UltimateSerial > 0 || !hero.Alive);
s.Driver.Paused = true;
s.Rig.LookAt(hero.Position, 11f, true);
yield return new WaitForSecondsRealtime(.35f);
yield return s.Shot(folder + "05-walkuerensturz.png");
s.Rig.LookAt(hero.Position, 11f, true);
yield return new WaitForSecondsRealtime(.2f);
yield return s.Shot(folder + "06-betaeubt.png");
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "07-nach-dem-sturz.png");
s.Rig.LookAt(hero.Position, 20f, true);
yield return new WaitForSecondsRealtime(.4f);
yield return s.Shot(folder + "08-kampf-lane.png");
s.Driver.Paused = false;
yield return s.FinishCombat();
// Space is blocked for a moment after a combat (no accidental skip of the planning).
float waited = 0f;
while (s.Hud.ReadyBlocked() && waited < 5f)
{
waited += Time.unscaledDeltaTime;
yield return null;
}
Send(s, Command.HeroSkin("eiswalkuere"));
s.Hud.OpenHero(LuneHeroDetail.TabUltimate);
yield return new WaitForSecondsRealtime(.8f);
yield return s.Shot(folder + "09-skin-eiswalkuere-fenster.png");
s.Hud.CloseModal();
int round = s.Match.RoundNumber;
s.Game.Key(KeyCode.Space);
yield return HudSession.Frames(2);
Assert.AreEqual(LuneMatchRunner.Stage.Combat, s.Runner.Current, "combat of round " + round);
hero = Hero(s);
yield return s.Fight(9.0);
s.Driver.Paused = true;
s.Rig.LookAt(hero.Position, 9f, true);
yield return new WaitForSecondsRealtime(.5f);
yield return s.Shot(folder + "10-skin-eiswalkuere-kampf.png");
s.Close();
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: c13db54917f6463ebc138e12a6922458

View file

@ -188,8 +188,8 @@ namespace Luneraria.UI.Tests
yield return s.Open(); yield return s.Open();
yield return s.Tap(() => s.Hud.HeroCard); yield return s.Tap(() => s.Hud.HeroCard);
Check(s.Hud.ModalOpen, "hero card opens the hero window"); Check(s.Hud.ModalOpen, "hero card opens the hero window");
// H1: every hero of the catalogue (G3: three; Sylvara is the fourth). // H1/H2: every hero of the catalogue (G3: three; Sylvara and Brunhild follow).
Check(s.Hud.HeroDetail.RecruitButtons.Count == LuneContent.Heroes.Count && LuneContent.Heroes.Count == 4, "all four heroes to recruit (H1)"); Check(s.Hud.HeroDetail.RecruitButtons.Count == LuneContent.Heroes.Count && LuneContent.Heroes.Count == 5, "all five heroes to recruit (H2)");
int heroCost = LuneContent.Heroes.Values[0].Cost; int heroCost = LuneContent.Heroes.Values[0].Cost;
bool unaffordable = s.Match.GoldOf(HudSession.Human) < heroCost; bool unaffordable = s.Match.GoldOf(HudSession.Human) < heroCost;
Check(!unaffordable || s.Hud.HeroDetail.RecruitButtons.Values.All(b => b.Disabled), "recruiting blocked without gold"); Check(!unaffordable || s.Hud.HeroDetail.RecruitButtons.Values.All(b => b.Disabled), "recruiting blocked without gold");

View file

@ -0,0 +1,87 @@
using System;
using System.Collections;
using System.Linq;
using Luneraria.Core;
using Luneraria.View;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
namespace Luneraria.UI.Tests
{
/// <summary>
/// S4 in the real scene: the fog of war darkens the terrain outside the team's vision (light
/// at the own base, dark at the enemy base), and a stunned unit shows the gold ring over its
/// head. S4Bilder (explicit) captures both at 1920×1080; LUNE_EVIDENCE names the folder below
/// docs/port/screenshots (default s4/spiel).
/// </summary>
public sealed class S4PolishViewsTests
{
static float AlphaAt(LuneFogOverlay fog, Vec2 point)
{
int side = Mathf.CeilToInt((float)(LuneMap.HalfExtent * 2.0) / LuneFogOverlay.Cell) + 1;
int column = Mathf.Clamp(Mathf.RoundToInt((float)((point.X + LuneMap.HalfExtent) / LuneFogOverlay.Cell)), 0, side - 1);
int row = Mathf.Clamp(Mathf.RoundToInt((float)((point.Y + LuneMap.HalfExtent) / LuneFogOverlay.Cell)), 0, side - 1);
return fog.Alpha[row * side + column];
}
static IEnumerator Fight(HudSession s)
{
yield return s.Starter();
s.Leave();
s.Game.Key(KeyCode.Space);
yield return HudSession.Frames(2);
yield return s.Fight(4.0);
yield return HudSession.Frames(4);
}
[UnityTest, Timeout(600000)]
public IEnumerator S4Views()
{
var s = new HudSession();
yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500, extended: true);
yield return Fight(s);
LuneFogOverlay fog = s.Game.View.Fog;
Assert.IsNotNull(fog, "an extended match with a human seat has the fog overlay");
Assert.IsTrue(fog.gameObject.activeSelf && fog.Refreshes > 0, "the fog is active and refreshed");
Assert.Less(AlphaAt(fog, s.Match.Map.CorePosition(0)), .05f, "the own Ancient stands in light");
Assert.Greater(AlphaAt(fog, s.Match.Map.CorePosition(1)), .5f, "the enemy Ancient lies in the fog");
LuneUnit victim = s.Match.Combat.Units.First(u => u.IsMobile() && u.Alive && u.Team == 0);
victim.ApplyEffect("valkyrie_stun", "stun", 1.0, 3.0);
yield return HudSession.Frames(3);
LuneUnitView view = UnityEngine.Object.FindObjectsByType<LuneUnitView>(FindObjectsSortMode.None).First(v => v.Unit == victim);
Transform ring = view.transform.Find("StunRing");
Assert.IsTrue(ring != null && ring.gameObject.activeSelf, "a stunned unit shows the stun ring");
s.Close();
var reference = new HudSession();
yield return reference.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500);
yield return Fight(reference);
Assert.IsTrue(reference.Game.View.Fog == null || !reference.Game.View.Fog.gameObject.activeSelf, "no fog under the reference rules");
reference.Close();
}
[UnityTest, Timeout(600000), Explicit("Bildwerkzeug: nur gezielt per -testFilter")]
public IEnumerator S4Bilder()
{
string evidence = Environment.GetEnvironmentVariable("LUNE_EVIDENCE");
string folder = "docs/port/screenshots/" + (string.IsNullOrEmpty(evidence) ? "s4/spiel" : evidence) + "/";
var s = new HudSession();
yield return s.Open(1920, 1080, seed: 4, startRound: 6, extraGold: 500, extended: true);
yield return Fight(s);
s.Driver.Paused = true;
s.Rig.LookAt(new Vec2(0.0, 0.0), 60f, true);
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "01-nebel-uebersicht.png");
LuneUnit front = s.Match.Combat.Units.Where(u => u.IsMobile() && u.Alive && u.Team == 0 && u.Lane == "mid").OrderByDescending(u => u.Progress).First();
s.Rig.LookAt(front.Position, 22f, true);
yield return new WaitForSecondsRealtime(.5f);
yield return s.Shot(folder + "02-nebelgrenze-mid.png");
foreach (LuneUnit unit in s.Match.Combat.Units.Where(u => u.IsMobile() && u.Alive && u.Position.DistanceTo(front.Position) < 6.0))
unit.ApplyEffect("valkyrie_stun", "stun", 1.0, 10.0);
s.Rig.LookAt(front.Position, 9f, true);
yield return new WaitForSecondsRealtime(.6f);
yield return s.Shot(folder + "03-betaeubung.png");
s.Close();
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 62a4209ed52348a182c63f43dc65a85b

View file

@ -352,7 +352,11 @@ namespace Luneraria.UI
portrait.style.height = 170f; portrait.style.height = 170f;
column.Add(portrait); column.Add(portrait);
portrait.ShowModel(spec.Model, true); portrait.ShowModel(spec.Model, true);
LuneUi.Label(spec.Name, "HudTitle", column); // H2: five heroes share the window; the columns get more compact.
bool compact = LuneContent.Heroes.Count > 4;
Label title = LuneUi.Clip(LuneUi.Label(spec.Name, "HudTitle", column));
if (compact)
title.style.fontSize = 24f;
LuneUi.Label(spec.Title, "HudMuted", column); LuneUi.Label(spec.Title, "HudMuted", column);
UnitDef definition = model.HeroDefinition(new HeroState { HeroId = heroId }); UnitDef definition = model.HeroDefinition(new HeroState { HeroId = heroId });
VisualElement role = LuneUi.Box(false, 5f, column); VisualElement role = LuneUi.Box(false, 5f, column);
@ -362,7 +366,7 @@ namespace Luneraria.UI
{ {
VisualElement line = LuneUi.Box(false, 6f, column); VisualElement line = LuneUi.Box(false, 6f, column);
LuneUi.Glyph(entry[0], LuneUiTheme.Muted, 13f, line); LuneUi.Glyph(entry[0], LuneUiTheme.Muted, 13f, line);
LuneUi.Label(entry[1], "HudMuted", line).style.minWidth = 104f; LuneUi.Label(entry[1], "HudMuted", line).style.minWidth = compact ? 88f : 104f;
LuneUi.Clip(LuneUi.Label(entry[2], "HudText", line)).style.flexGrow = 1f; LuneUi.Clip(LuneUi.Label(entry[2], "HudText", line)).style.flexGrow = 1f;
} }
Label summary = LuneUi.Wrap(LuneUi.Label(spec.Summary, "HudText", column)); Label summary = LuneUi.Wrap(LuneUi.Label(spec.Summary, "HudText", column));

View file

@ -0,0 +1,91 @@
using System.Collections.Generic;
using Luneraria.Core;
using UnityEngine;
namespace Luneraria.View
{
/// <summary>
/// S4 fog of war in the terrain: a grid over the map (2 m cells) that follows the ground and
/// darkens every point no vision source of the viewer's team reaches (LuneFog.Vision: own
/// units 9 m, own buildings 10 m, wards 12 m). The alpha has a soft 2 m edge and is
/// recomputed ten times a second. Presentation only; the rules never read it.
/// </summary>
public sealed class LuneFogOverlay : MonoBehaviour
{
public const float Cell = 2f;
public const float Darkness = .55f;
public const float Edge = 2f;
public const float Interval = .1f;
Mesh _mesh;
Vec2[] _points;
Color32[] _colors;
float _timer;
/// <summary>Darkness of every grid point (0 = seen), for tests.</summary>
public float[] Alpha { get; private set; }
public int Refreshes { get; private set; }
public void Build(LuneGround ground, Material material)
{
int side = Mathf.CeilToInt((float)(LuneMap.HalfExtent * 2.0) / Cell) + 1;
var vertices = new Vector3[side * side];
_points = new Vec2[side * side];
for (int row = 0; row < side; row++)
{
for (int column = 0; column < side; column++)
{
var map = new Vec2(-LuneMap.HalfExtent + column * Cell, -LuneMap.HalfExtent + row * Cell);
float height = ground != null ? ground.StandHeight(map) : 0f;
_points[row * side + column] = map;
vertices[row * side + column] = LuneSpace.World(map, height + .45f);
}
}
var triangles = new List<int>();
for (int row = 0; row + 1 < side; row++)
{
for (int column = 0; column + 1 < side; column++)
{
int a = row * side + column;
triangles.AddRange(new[] { a, a + side, a + 1, a + 1, a + side, a + side + 1 });
}
}
_colors = new Color32[vertices.Length];
Alpha = new float[vertices.Length];
_mesh = new Mesh { name = "FogOverlay", indexFormat = UnityEngine.Rendering.IndexFormat.UInt32 };
_mesh.SetVertices(vertices);
_mesh.SetTriangles(triangles, 0);
_mesh.SetColors(_colors);
_mesh.RecalculateBounds();
gameObject.AddComponent<MeshFilter>().sharedMesh = _mesh;
var renderer = gameObject.AddComponent<MeshRenderer>();
renderer.sharedMaterial = material;
renderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
renderer.receiveShadows = false;
}
/// <summary>Recomputes the darkness at most every Interval seconds (force: now).</summary>
public void Tick(float dt, List<KeyValuePair<Vec2, double>> sources, bool force = false)
{
_timer -= dt;
if (!force && _timer > 0f)
return;
_timer = Interval;
Refreshes++;
for (int i = 0; i < _points.Length; i++)
{
double best = double.PositiveInfinity;
foreach (KeyValuePair<Vec2, double> source in sources)
{
double gap = _points[i].DistanceTo(source.Key) - source.Value;
if (gap < best)
best = gap;
}
float t = Mathf.Clamp01((float)(best + Edge * .5) / Edge);
Alpha[i] = Darkness * t;
_colors[i] = new Color32(0, 0, 0, (byte)Mathf.RoundToInt(Alpha[i] * 255f));
}
_mesh.SetColors(_colors);
}
}
}

View file

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a539f6fdd87d43728442d53d45a23e97

View file

@ -74,6 +74,29 @@ namespace Luneraria.View
/// <summary>Ids of the units hidden in the fog this frame.</summary> /// <summary>Ids of the units hidden in the fog this frame.</summary>
public HashSet<int> Hidden { get; private set; } = new HashSet<int>(); public HashSet<int> Hidden { get; private set; } = new HashSet<int>();
static readonly HashSet<int> Empty = new HashSet<int>(); static readonly HashSet<int> Empty = new HashSet<int>();
/// <summary>S4: the darkening grid of the fog (null until a fogged match runs).</summary>
public LuneFogOverlay Fog { get; private set; }
void FogTick(LuneMatch match, float dt)
{
bool on = FogSlot >= 0 && FogSlot < match.Players.Count && match.Extended && Library != null && Library.FogOverlay != null;
if (!on)
{
if (Fog != null && Fog.gameObject.activeSelf)
Fog.gameObject.SetActive(false);
return;
}
if (Fog == null)
{
var go = new GameObject("FogOverlay");
go.transform.SetParent(transform, false);
Fog = go.AddComponent<LuneFogOverlay>();
Fog.Build(Library.Ground, Library.FogOverlay);
}
if (!Fog.gameObject.activeSelf)
Fog.gameObject.SetActive(true);
Fog.Tick(dt, LuneFog.Vision(match, _combat, match.Players[FogSlot].Team));
}
/// <summary>Main-thread cost of the last frame's view update (milliseconds).</summary> /// <summary>Main-thread cost of the last frame's view update (milliseconds).</summary>
public double LastSyncMs { get; private set; } public double LastSyncMs { get; private set; }
readonly System.Diagnostics.Stopwatch _clock = new System.Diagnostics.Stopwatch(); readonly System.Diagnostics.Stopwatch _clock = new System.Diagnostics.Stopwatch();
@ -117,6 +140,7 @@ namespace Luneraria.View
Hidden = FogSlot >= 0 && FogSlot < match.Players.Count && showUnits Hidden = FogSlot >= 0 && FogSlot < match.Players.Count && showUnits
? LuneFog.Hidden(match, _combat, match.Players[FogSlot].Team, planning, planning ? match.Players[FogSlot].Draft : null) ? LuneFog.Hidden(match, _combat, match.Players[FogSlot].Team, planning, planning ? match.Players[FogSlot].Draft : null)
: Empty; : Empty;
FogTick(match, dt);
float alpha = Driver.Runner.Current == LuneMatchRunner.Stage.Combat ? (float)Driver.Runner.Clock.Alpha : 1f; float alpha = Driver.Runner.Current == LuneMatchRunner.Stage.Combat ? (float)Driver.Runner.Clock.Alpha : 1f;
if (showUnits) if (showUnits)
{ {

View file

@ -38,6 +38,8 @@ namespace Luneraria.View
public Material HeroRing; public Material HeroRing;
/// <summary>H1: expanding ring of a hero's ultimate (moon light).</summary> /// <summary>H1: expanding ring of a hero's ultimate (moon light).</summary>
public Material MoonBurst; public Material MoonBurst;
/// <summary>S4: fog of war overlay (Luneraria/FogOverlay, vertex alpha).</summary>
public Material FogOverlay;
public Material BarBack; public Material BarBack;
public Material[] BarFill = new Material[3]; public Material[] BarFill = new Material[3];
public Material[] Bolt = new Material[3]; public Material[] Bolt = new Material[3];

View file

@ -30,6 +30,8 @@ namespace Luneraria.View
/// <summary>H1: expanding moon ring of an ultimate (seconds left, 0 = none).</summary> /// <summary>H1: expanding moon ring of an ultimate (seconds left, 0 = none).</summary>
Transform _burst; Transform _burst;
float _burstTime; float _burstTime;
/// <summary>S4: a small gold ring circling over the head of a stunned unit.</summary>
Transform _stun;
float _attackFlash; float _attackFlash;
float _time; float _time;
Vector3 _lastVisual; Vector3 _lastVisual;
@ -116,6 +118,9 @@ namespace Luneraria.View
_burst.localPosition = new Vector3(0f, .08f, 0f); _burst.localPosition = new Vector3(0f, .08f, 0f);
_burst.gameObject.SetActive(false); _burst.gameObject.SetActive(false);
} }
_stun = Marker("StunRing", library.RingRound, library.HeroRing);
_stun.localScale = new Vector3(.55f, 1f, .55f);
_stun.gameObject.SetActive(false);
transform.position = Ground(unit.Position); transform.position = Ground(unit.Position);
transform.rotation = LuneSpace.Facing(unit.Facing); transform.rotation = LuneSpace.Facing(unit.Facing);
_lastVisual = transform.position; _lastVisual = transform.position;
@ -164,6 +169,14 @@ namespace Luneraria.View
if (ultimate && _burst != null) if (ultimate && _burst != null)
_burstTime = BurstSeconds; _burstTime = BurstSeconds;
Burst(dt); Burst(dt);
bool stunned = Unit.Alive && Unit.ShowsStun();
if (_stun.gameObject.activeSelf != stunned)
_stun.gameObject.SetActive(stunned);
if (stunned)
{
_stun.localPosition = new Vector3(0f, _height + .15f, 0f);
_stun.Rotate(0f, 360f * dt, 0f, Space.Self);
}
if (attacked || ability) if (attacked || ability)
_attackFlash = .28f; _attackFlash = .28f;
_attackFlash = Mathf.Max(0f, _attackFlash - dt); _attackFlash = Mathf.Max(0f, _attackFlash - dt);

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

View file

@ -106,3 +106,5 @@ Die Fähigkeiten setzen die **Ultimate-Bedingungen** aus [IDEEN.md](IDEEN.md) vo
**Sylvara mit einem Varianten-Skin (Blutmond).** Ziel: das Slot-System einmal vollständig prüfen (Körper, Waffen-Prop, Umhang, VFX-Palette, Teamfarbe, Variantenmaterial), bevor weitere Helden folgen. **Sylvara mit einem Varianten-Skin (Blutmond).** Ziel: das Slot-System einmal vollständig prüfen (Körper, Waffen-Prop, Umhang, VFX-Palette, Teamfarbe, Variantenmaterial), bevor weitere Helden folgen.
**Umgesetzt in H1** (10. Oktober 2026): Sylvara als voller Held mit Ultimate-Auslöser und Blutmond-Skin, siehe [H1-SYLVARA.md](H1-SYLVARA.md). Werte nach der Balance-Abstimmung: 1.450 Leben, Sprung nur auf ungeschützte Ziele, Mondschleier, Tanz 220 %. **Umgesetzt in H1** (10. Oktober 2026): Sylvara als voller Held mit Ultimate-Auslöser und Blutmond-Skin, siehe [H1-SYLVARA.md](H1-SYLVARA.md). Werte nach der Balance-Abstimmung: 1.450 Leben, Sprung nur auf ungeschützte Ziele, Mondschleier, Tanz 220 %.
**Umgesetzt in H2** (11. Oktober 2026): Brunhild als voller Held mit Markierung, Betäubung und Skin Eiswalküre, siehe [H2-BRUNHILD.md](H2-BRUNHILD.md). Abweichung vom Konzept: Der Speerwurf trifft den fernsten Gegner in 7 m (statt eines beliebigen Ziels), und nach dem Sturz schützt der Walkürenschild.

View file

@ -0,0 +1,91 @@
# H2 · Brunhild, die Walküre
Stand: 11. Oktober 2026 · Branch `luneraria/h2-brunhild` (von `luneraria/s3-strategie`).
Grundlage: [CHAMPIONS-KONZEPT.md](CHAMPIONS-KONZEPT.md) und das Muster aus [H1-SYLVARA.md](H1-SYLVARA.md). Auftrag: „weiter“; Brunhild war die Empfehlung seit S1.
![Walkürensturz](../port/screenshots/h2/spiel/05-walkuerensturz.jpg)
## Kurzfassung
- **Neue Heldin:** Brunhild ist der fünfte kaufbare Held, Heldenjägerin in der Nahkampfreihe, 260 Gold. Sie ist das Gegenstück zu Siegfried.
- **Kit:**
- Heldenjägerin (passiv)
- Speerwurf mit Markierung
- Ultimate Walkürensturz: Sprung, Flächenschaden, Betäubung
- zwei Talentstufen
- vier Auslöser
- **Neue Regelbausteine** (wirken nur durch Brunhild, deshalb bleibt die Referenz unverändert):
- **Markierung** (`vulnerable`): Das Ziel nimmt mehr Schaden.
- **Betäubung** (`stun`): Das Ziel greift weder an noch bewegt es sich. Bosse sind immun.
- **Skin:** „Eiswalküre“ (Variante): Der karmesinrote Umhang wird eisblau, das Gold kühler, Haut und Haar bleiben.
- **Figur:** Meshy-Figur mit dem Speer als eigenem Modell; das Ultimate nutzt den Clip „Jump Attack“. Verbrauch: 113 Credits, danach sind 110 übrig.
- **Bots:** Mit erweiterten Regeln wählen sie das Profil `walkuere` (acht Profile in der Rotation, Schritt 5, weiterhin sechs verschiedene je Partie).
## Regeln
| Teil | Wirkung |
| --- | --- |
| Grundwerte | 2.000 Leben, 42 Schaden, Durchschlag gegen Schwer, Reichweite 2,0 m (Speer), Tempo 2,4, Rolle Nahkampf |
| Heldenjägerin (passiv) | +25 % Schaden gegen Helden und Angriffschampions, auch bei Speer und Sturz |
| Speerwurf | Ab 3 s alle 6 s: 120 % Schaden am fernsten Gegner in 7 m. Er ist 4 s markiert und nimmt 15 % mehr Schaden |
| Walkürensturz (Ultimate) | Einmal pro Kampf, frühestens nach 2 s. Sprung auf das Ziel: zuerst ein Held oder Angriffschampion in 7 m, dann der markierte Gegner, dann ihr Ziel. 200 % Schaden an allen Gegnern in 3 m und 1 s Betäubung (Bosse immun). Danach Walkürenschild: Schild von 30 % ihrer Lebenspunkte für 5 s |
| Auslöser | **Gruppe** (Standard): 3 Gegner in 4 m um das Ziel · **Heldenjagd:** ein Held oder Champion in 7 m · **Notfall:** unter 40 % Leben · **Sofort:** erster Gegner in 7 m |
| Talente Stufe 3 | **Walkürenblut:** Speerwurf gegen Helden und Champions doppelt · **Speerregen:** die drei fernsten Gegner |
| Talente Stufe 6 | **Rabenschwinge:** +20 % Angriffstempo · **Götterdämmerung:** 2 s Betäubung in 4 m |
## Balance
Probe-Vergleich (`dotnet run -c Release --project tools/dotnet/Luneraria.Balance 40`): gleiches Bot-Profil, nur der Held getauscht, 80 Partien.
| Fassung | Brunhild | Überlebenszeit im Kampf |
| --- | --- | --- |
| Erste Fassung (1.700 Leben, kein Schild) | 0 % | fällt in jedem Kampf nach etwa 25 s (Ringborke etwa 42 s, Funkenlanze etwa 51 s) |
| Mit 2.000 Leben und Walkürenschild | **50 %**, wie Ringborke, Funkenlanze und Sylvara | – |
Die Siegquoten einzelner Bot-Profile in der Rotation schwanken stark mit den Teamkombinationen (15 bis 83 von 90) und taugen deshalb nicht für Heldenvergleiche. Maßgeblich ist der Probe-Vergleich.
## Technik
- **Kern:**
- `ContentData`: Held, Talente, Auslöser, Skin, Bot-Profil.
- `LuneCombat.BrunhildStep` / `BrunhildSpear`: Der Sprung nutzt dieselbe Landung wie Sylvaras Mondsprung.
- `LuneUnit`: `vulnerable` in `Mitigated`, `Stunned()` in Angriffstempo und Bewegung.
- **Figur:**
- `tools/meshy/brunhild/figure.json`, Speer als Prop in der rechten Hand.
- Export 23/23, zwei Läufe byteidentisch.
- **Skin:**
- `tools/meshy/brunhild/skins.json`.
- `skin_variant.py` kann jetzt Farbbänder über 0° (Rot) und eine Mindestsättigung, damit Hauttöne unverändert bleiben.
- **HUD:** Bei mehr als vier Helden werden die Spalten der Heldenwahl kompakter (Name 24 px, schmalere Beschriftung).
## Tests und Nachweise
| Prüfung | Ergebnis |
| --- | --- |
| Kern (.NET 8) | 619/619, darunter **h2 22**: Kauf, Regel, Skin; Speer erst ab 3 s, markiert den fernsten Gegner, +15 % erlittener Schaden; Sturz bei Heldenjagd, Landung am Helden, Betäubung (Boss immun), keine Bewegung und kein Angriff, Ende nach 1 s, einmal pro Kampf; Gruppe wartet; +25 % gegen Helden; Talente; Bot-Profil nur erweitert |
| Golden und Fingerabdrücke | 0 Abweichungen; `DCE95C96556F3A1A` bei 30/60/120 fps und unbegrenzt unverändert |
| Unity EditMode | 34/34 |
| Unity PlayMode | 19/19, neu `H2HeroViewsTests.BrunhildHud`: fünf Helden, Regel- und Skin-Karten, Befehlsplatz „HELDENJAGD“, Figur mit Ultimate-Clip, Eiswalküre-Material an Körper und Speer, Ultimate im Kampf. Verify A–I 718/0; die Prüfung der Heldenwahl erwartet jetzt fünf Helden |
| Asset-Prüfung | Export 23/23, byteidentisch in zwei Läufen |
| Player-Selbsttest | macOS 30/30 |
| Leistung | A/B im selben Player, abwechselnd, je sechs Heldinnen. Karte: Brunhild 138,1 / 142,9 / 143,3 fps, Sylvara 142,9 / 141,7 / 141,2 fps, Mittel gleich (141,4 zu 141,9). Mid nah: 153,3 / 157,1 / 157,8 zu 161,8 / 162,5 / 163,2 fps, also −4 %. Brunhild hat weniger Dreiecke (28.706 zu 30.782); der Unterschied kommt aus dem Kampfgeschehen im Nahbild. Rohdaten in `docs/port/logs/h2/` |
**Bilder** in `docs/port/screenshots/h2/spiel/`:
1. Heldenwahl mit fünf Helden
2. Heldenfenster
3. Ultimate und Skin
4. Aufstellung
5. Walkürensturz
6. Betäubt
7. Nach dem Sturz
8. Lane
9. Eiswalküre im Fenster
10. Eiswalküre im Kampf
Das Figurenblatt liegt in `figur/`.
## Offene Punkte
- **Betäubung sichtbar machen:** Betäubte Einheiten erkennt man bisher nur daran, dass sie stillstehen.
- **Brunhild und Siegfried als Paar:** Ein Götterdämmerung-Set-Skin ist möglich, sobald Siegfried als Held kommt.
- **Meshy-Guthaben:** 110 Credits übrig, das reicht für einen weiteren Helden mit Waffe knapp nicht. Die nächste Monatsgutschrift kommt laut Meshy im November.

View file

@ -0,0 +1,46 @@
# Hauptstand · 11. Oktober 2026
Stand: 11. Oktober 2026 · Branch `main` (vorgerückt) · Tag `stand-2026-10-11`.
Champions of Luneraria in Unity mit allen Phasen bis S4.
- **Zusammenführung:** `main` enthielt bisher nur den ersten Commit („Unity-Projekt angelegt“). Alle Phasen-Branches liegen in einer Linie; `main` wurde ohne Konflikte auf den Endstand vorgerückt.
- **Phasen-Branches:** Sie bleiben als Nachweis erhalten.
## Was der Stand enthält
| Phase | Inhalt | Doku |
| --- | --- | --- |
| U1–U5.5 | Port aus Godot mit Verhaltensgleichheit, Welt, HUD, Netzwerk, PBR-Grafik, alle zehn Glutpakt-Truppen als Meshy-Figuren | `docs/port/PORT-STATUS.md`, `PORT-QA.md` |
| Konzept | Ideensammlung Strategie/MOBA, sieben neue Champions, Skin-Regeln | [IDEEN.md](IDEEN.md), [CHAMPIONS-KONZEPT.md](CHAMPIONS-KONZEPT.md) |
| H1 | Sylvara: Ultimate-Auslöser in der Planung, Skin-System (Blutmond) | [H1-SYLVARA.md](H1-SYLVARA.md) |
| S1 | Regelschalter „Erweitert“: Söldner-Einkommen, Kasernen, Rückkauf, Mondsegen | [S1-STRATEGIE.md](S1-STRATEGIE.md) |
| S2 | Glyphe, Item-Rezepte, Ancient-Stufen, Grottenjagd der Bots | [S2-STRATEGIE.md](S2-STRATEGIE.md) |
| S3 | frühe Bot-Helden (Rotationsfehler behoben), Neutrallager, Fog of War mit Spähern | [S3-STRATEGIE.md](S3-STRATEGIE.md) |
| H2 | Brunhild: Markierung, Betäubung, Skin Eiswalküre | [H2-BRUNHILD.md](H2-BRUNHILD.md) |
| S4 | Betäubung sichtbar, Nebel im Gelände, Glyphe und Betäubung für Gäste | [S4-FEINSCHLIFF.md](S4-FEINSCHLIFF.md) |
## Spielen
- **Startbildschirm:** „Allein spielen“, „Hosten“ oder „Beitreten“. Der Schalter **REGELN** steht auf ERWEITERT (Legion TD 2, Dota 2, LoL); REFERENZ spielt die Regeln des Godot-Originals.
- **Helden (5):** Ringborke, Quellgeflecht, Funkenlanze, Sylvara, Brunhild. Ultimate-Auslöser und Skin wählst du im Heldenfenster unter „Ultimate & Skin“.
- **Team-Aktionen im Teampanel links:** Glyphe, Ancient-Stufe, Späher, Lager-Übersicht.
- **macOS-Player:** `Builds/macOS/Luneraria.app` im Arbeitsordner, aus dem der Stand gebaut wurde. Ein frischer Bau entsteht mit `LunePlayerBuild.BuildMac`.
## Prüfstand
| Prüfung | Ergebnis |
| --- | --- |
| Kern (.NET 8) | 627/627: content 77, core 91, m2 73, golden 157, determinism 6, net 43, net_rounds 12, h1 42, s1 31, s2 34, s3 31, h2 22, s4 8 |
| Parität zur Godot-Referenz | Golden 51.221 Werte, 0 Abweichungen; Bot-Fingerabdrücke `DCE95C96556F3A1A` (Seed 2) und `7B8E43AEFC0D60C5` (Seed 9 ab Welle 21) unverändert. Alle neuen Regeln wirken nur mit `MatchOptions.Extended` |
| Unity | EditMode 35/35, PlayMode 20/20, Verify A–I 718/0, Player-Selbsttest 30/30 |
## Offene Punkte
- **Build-Module für Windows und Linux** (Zielplattformen) fehlen weiterhin; Installation nur nach Freigabe.
- **Git LFS:** Das Repo wächst mit jeder Figur um rund 40 bis 60 MB.
- **Weitere Helden des Konzepts:** Thalion, Ilyra, Isolde, Aurelian, Rowan (Meshy-Guthaben 110 Credits, nächste Gutschrift im November).
- **Regeln, die du entscheiden musst:**
- manuelles Ultimate im Kampf (braucht Kampfbefehle im Netz)
- Quellgeflecht-Dominanz in Probe-Vergleichen (Referenzbalance)
- kürzere Partien mit Lagern beobachten
- **Netz:** Der Nebel ist Darstellung, keine Geheimhaltung; Gäste erhalten alle Einheiten.

View file

@ -0,0 +1,32 @@
# S4 · Feinschliff: Betäubung, Nebel im Gelände, Glyphe für Gäste
Stand: 11. Oktober 2026 · Branch `luneraria/s4-feinschliff` (von `luneraria/h2-brunhild`).
Auftrag: „1 und 2 durchführen“. Punkt 1 ist der Feinschliff aus S3 und H2 ohne Meshy-Credits, Punkt 2 die Zusammenführung zum Hauptstand (siehe unten).
![Nebel in der Übersicht](../port/screenshots/s4/spiel/01-nebel-uebersicht.jpg)
## Inhalt
| Punkt | Umsetzung |
| --- | --- |
| Betäubung sichtbar | Ein goldener Ring kreist über dem Kopf jeder betäubten Einheit (`LuneUnitView`, Marker `StunRing`). Gäste sehen ihn ebenfalls: Der Host überträgt den Zustand als Bit 18 in den Flags des Kampfrahmens (`LuneUnit.NetStunned`, `ShowsStun()`) |
| Nebel im Gelände | `LuneFogOverlay` ist ein Gitter aus 2-m-Zellen über die ganze Karte, das dem Gelände folgt (0,45 m darüber). Die Deckkraft der Gitterpunkte wird zehnmal pro Sekunde aus den Sichtquellen berechnet, mit weicher Kante von 2 m: außerhalb jeder Sicht 55 % Nachtblau, innerhalb klar. Shader `Luneraria/FogOverlay` (transparent, Deckkraft aus den Vertexfarben). Die Sichtquellen kommen aus `LuneFog.Vision`; dieselbe Funktion steuert das Ausblenden. Der Nebel ist nur aktiv mit erweiterten Regeln und einem menschlichen Sitz |
| Glyphe für Gäste | Der Kampfrahmen hängt an die Gebäude-Lebenspunkte vier Werte an: je Team die Lane der laufenden Glyphe und die Restsekunden. Gäste setzen damit `GlyphLane`/`GlyphUntil` und sehen den Glyphen-Ring. Ältere Gäste lesen nur die Gebäudewerte und ignorieren den Rest |
Die Simulation ist unberührt: Betäubungs-Ring, Nebel-Gitter und Gast-Glyphe sind reine Darstellung.
## Tests und Nachweise
| Prüfung | Ergebnis |
| --- | --- |
| Kern (.NET 8) | 627/627, darunter **s4 8**: Über die Loopback-Verbindung sieht der Gast die Glyphe von Blau auf Mid, den Mid-Turm als geschützt und die Betäubung genau einer Einheit; Host und Gast zählen gleich viele Sichtquellen |
| Golden und Fingerabdrücke | 0 Abweichungen; `DCE95C96556F3A1A` unverändert |
| Unity EditMode | 35/35 |
| Unity PlayMode | 20/20, neu `S4PolishViewsTests.S4Views`: Nebel aktiv, eigener Ancient im Licht (< 5 %), gegnerischer Ancient im Nebel (> 50 %), Betäubungs-Ring sichtbar, kein Nebel unter den Referenzregeln. Verify A–I 718/0 |
| Player-Selbsttest | macOS 30/30 |
| Leistung | Benchmark (Bot-Partie, sechs Brunhilds): Karte 148,6–151,5 fps, Mid nah 163,4–167,3 fps, Ansichten 0,19–0,22 ms. Der Benchmark hat keinen menschlichen Sitz, der Nebel ist dort also aus. Nicht gemessene Schätzung für den Nebel: 1.521 Gitterpunkte gegen 50–90 Sichtquellen, zehnmal pro Sekunde |
Bilder in `docs/port/screenshots/s4/spiel/`:
1. Nebel in der Übersicht
2. Nebelgrenze auf Mid
3. Betäubung

View file

@ -312,6 +312,29 @@ Die Glutpakt-Arbeit entstand als Kette aufeinander aufbauender Zweige (`lunerari
| Bild | `screenshots/s3/spiel/` | | Bild | `screenshots/s3/spiel/` |
| Commits | `luneraria/s3-strategie` (S3A `e756a90`) | | Commits | `luneraria/s3-strategie` (S3A `e756a90`) |
## H2 · Brunhild
| Punkt | Ergebnis |
| --- | --- |
| Tests | Kern .NET 619/619 (neu `h2` 22), EditMode 34/34, PlayMode 19/19 (neu `BrunhildHud`), Verify A–I 718/0 (Heldenwahl erwartet fünf Helden), Player-Selbsttest 30/30, Export 23/23 |
| Parität | Golden 0 Abweichungen, Fingerabdruck `DCE95C96556F3A1A` gleich; Markierung und Betäubung wirken nur durch Brunhild |
| Inhalt | Heldenjägerin, Speerwurf mit Markierung, Walkürensturz mit Betäubung und Schild, Talente, Auslöser, Skin Eiswalküre, Bot-Profil `walkuere`; Meshy-Figur mit Speer, 113 Credits |
| Balance | Probe-Vergleich 50 % wie die übrigen Helden (erste Fassung 0 %, `logs/h2/balance-h2-probe.txt`) |
| Leistung | A/B mit Sylvara: Karte gleich (141,4 / 141,9 fps), Mid nah −4 % (156,1 / 162,5) |
| Bild | `screenshots/h2/spiel/`, `figur/` |
| Commits | `luneraria/h2-brunhild` (H2A `cbff678`) |
## S4 · Feinschliff (Betäubung, Nebel im Gelände, Glyphe für Gäste)
| Punkt | Ergebnis |
| --- | --- |
| Tests | Kern .NET 627/627 (neu `s4` 8), EditMode 35/35, PlayMode 20/20 (neu `S4Views`), Verify A–I 718/0, Player-Selbsttest 30/30 |
| Parität | Golden 0 Abweichungen, Fingerabdruck `DCE95C96556F3A1A` gleich; alles Darstellung |
| Inhalt | Betäubungs-Ring (auch für Gäste über Bit 18 der Rahmen-Flags), Nebel-Gitter im Gelände (`LuneFogOverlay`, Shader `Luneraria/FogOverlay`), Glyphe im Kampfrahmen für Gäste |
| Leistung | Karte 148,6–151,5 fps, Mid nah 163,4–167,3 fps (Bot-Partie ohne Nebel); die Nebelkosten sind nicht gemessen |
| Bild | `screenshots/s4/spiel/` |
| Commits | `luneraria/s4-feinschliff` |
## Ausblick ## Ausblick
Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux. Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux.

View file

@ -1,6 +1,6 @@
# Port-Status · Champions of Luneraria in Unity # Port-Status · Champions of Luneraria in Unity
Stand: 11. Oktober 2026 (S3, Bots, Neutrallager, Fog of War). Stand: 11. Oktober 2026 (Hauptstand: `main` = S4, Tag `stand-2026-10-11`; Übersicht [../luneraria/HAUPTSTAND.md](../luneraria/HAUPTSTAND.md)).
Referenz ist der Godot-Stand `luneraria/g3` (`1b540f2`) in `../saumwacht-godot`; er wird nicht mehr verändert. Engine: Unity 6.3 LTS (6000.3.20f1), Renderer URP. HDRP ist ausgeschlossen, bis ein Vergleich mit einer echten Szene etwas anderes nahelegt. Referenz ist der Godot-Stand `luneraria/g3` (`1b540f2`) in `../saumwacht-godot`; er wird nicht mehr verändert. Engine: Unity 6.3 LTS (6000.3.20f1), Renderer URP. HDRP ist ausgeschlossen, bis ein Vergleich mit einer echten Szene etwas anderes nahelegt.
@ -18,6 +18,8 @@ Zielplattformen sind Fedora 44 und Windows 11; macOS ist die Entwicklungsplattfo
| S1 · Strategie-Regeln | **fertig** (`luneraria/s1-strategie`): Söldner-Einkommen (Legion TD 2), Kasernen und Rückkauf (Dota 2), Mondsegen (League of Legends) hinter dem Regelschalter „Erweitert“ (Standard im Spiel); Referenzregeln für Tests unverändert | [../luneraria/S1-STRATEGIE.md](../luneraria/S1-STRATEGIE.md) | | S1 · Strategie-Regeln | **fertig** (`luneraria/s1-strategie`): Söldner-Einkommen (Legion TD 2), Kasernen und Rückkauf (Dota 2), Mondsegen (League of Legends) hinter dem Regelschalter „Erweitert“ (Standard im Spiel); Referenzregeln für Tests unverändert | [../luneraria/S1-STRATEGIE.md](../luneraria/S1-STRATEGIE.md) |
| S2 · Glyphe, Rezepte, Ancient | **fertig** (`luneraria/s2-strategie`): Glyphe (Dota 2), Item-Rezepte (Dota 2/LoL), Ancient-Stufen (Legion TD 2), Grottenjagd der Bots; hinter dem Regelschalter „Erweitert“ | [../luneraria/S2-STRATEGIE.md](../luneraria/S2-STRATEGIE.md) | | S2 · Glyphe, Rezepte, Ancient | **fertig** (`luneraria/s2-strategie`): Glyphe (Dota 2), Item-Rezepte (Dota 2/LoL), Ancient-Stufen (Legion TD 2), Grottenjagd der Bots; hinter dem Regelschalter „Erweitert“ | [../luneraria/S2-STRATEGIE.md](../luneraria/S2-STRATEGIE.md) |
| S3 · Bots, Neutrallager, Fog of War | **fertig** (`luneraria/s3-strategie`): frühe Bot-Helden und Rotationsfehler behoben, Neutrallager mit LoL-Buffs, Fog of War mit Spähern (Dota 2) und Aufklärung in der Planung; hinter dem Regelschalter „Erweitert“ | [../luneraria/S3-STRATEGIE.md](../luneraria/S3-STRATEGIE.md) | | S3 · Bots, Neutrallager, Fog of War | **fertig** (`luneraria/s3-strategie`): frühe Bot-Helden und Rotationsfehler behoben, Neutrallager mit LoL-Buffs, Fog of War mit Spähern (Dota 2) und Aufklärung in der Planung; hinter dem Regelschalter „Erweitert“ | [../luneraria/S3-STRATEGIE.md](../luneraria/S3-STRATEGIE.md) |
| H2 · Brunhild | **fertig** (`luneraria/h2-brunhild`): zweite Heldin des Champions-Konzepts mit Markierung und Betäubung, Skin Eiswalküre; Referenzpartien unverändert | [../luneraria/H2-BRUNHILD.md](../luneraria/H2-BRUNHILD.md) |
| S4 · Feinschliff | **fertig** (`luneraria/s4-feinschliff`): Betäubung sichtbar, Nebel im Gelände, Glyphe und Betäubung für Gäste | [../luneraria/S4-FEINSCHLIFF.md](../luneraria/S4-FEINSCHLIFF.md) |
QA je Meilenstein: [PORT-QA.md](PORT-QA.md). QA je Meilenstein: [PORT-QA.md](PORT-QA.md).

View file

@ -0,0 +1,6 @@
hero; seat wins; losses; draws; open; win rate; mean rounds; leaps/combat; ultimates/combat
held_ringborke; 40; 40; 0; 0; 50 %; 15.0; 0.00; 0.00
held_quellgeflecht; 80; 0; 0; 0; 100 %; 13.5; 0.00; 0.00
held_funkenlanze; 40; 40; 0; 0; 50 %; 15.0; 0.00; 0.00
held_sylvara; 40; 40; 0; 0; 50 %; 14.5; 0.28; 0.31
held_brunhild; 40; 40; 0; 0; 50 %; 15.0; 0.00; 0.33

View file

@ -0,0 +1,19 @@
{
"suites": [
{"suite": "content", "checks": 77, "failures": 0, "seconds": 0.02, "failed": [], "notes": ["map geometry: largest deviation lanes 0.00E+000 m, buildings 0.00E+000 m"]},
{"suite": "core", "checks": 91, "failures": 0, "seconds": 1.92, "failed": [], "notes": ["full match seed 2 -> Rot after 9 rounds"]},
{"suite": "m2", "checks": 73, "failures": 0, "seconds": 0.40, "failed": [], "notes": []},
{"suite": "golden", "checks": 157, "failures": 0, "seconds": 1.58, "failed": [], "notes": ["golden values compared: 51221", "largest deviation angle: 0.00E+000 over 1140 values (tolerance 1E-004)", "largest deviation effect: 0.00E+000 over 264 values (tolerance 1E-006)", "largest deviation hp: 0.00E+000 over 5679 values (tolerance 1E-002)", "largest deviation other: 0.00E+000 over 34 values (tolerance 1E-006)", "largest deviation position: 0.00E+000 over 3420 values (tolerance 1E-003)", "largest deviation time: 0.00E+000 over 780 values (tolerance 1E-006)", "domain ancients: 246 values, 0 differences, largest numeric deviation 0.00E+000", "domain announcements: 44 values, 0 differences, largest numeric deviation 0.00E+000", "domain boss: 1559 values, 0 differences, largest numeric deviation 0.00E+000", "domain combat: 676 values, 0 differences, largest numeric deviation 0.00E+000", "domain commands: 410 values, 0 differences, largest numeric deviation 0.00E+000", "domain events: 6937 values, 0 differences, largest numeric deviation 0.00E+000", "domain facing: 1140 values, 0 differences, largest numeric deviation 0.00E+000", "domain gold: 3584 values, 0 differences, largest numeric deviation 0.00E+000", "domain heroes: 1512 values, 0 differences, largest numeric deviation 0.00E+000", "domain hp: 3420 values, 0 differences, largest numeric deviation 0.00E+000", "domain other: 119 values, 0 differences, largest numeric deviation 0.00E+000", "domain positions: 3420 values, 0 differences, largest numeric deviation 0.00E+000", "domain purchases: 9311 values, 0 differences, largest numeric deviation 0.00E+000", "domain rounds: 119 values, 0 differences, largest numeric deviation 0.00E+000", "domain targets: 1140 values, 0 differences, largest numeric deviation 0.00E+000", "domain towers: 1994 values, 0 differences, largest numeric deviation 0.00E+000", "domain units: 14164 values, 0 differences, largest numeric deviation 0.00E+000", "domain waves: 731 values, 0 differences, largest numeric deviation 0.00E+000", "domain winner: 695 values, 0 differences, largest numeric deviation 0.00E+000"]},
{"suite": "determinism", "checks": 6, "failures": 0, "seconds": 1.55, "failed": [], "notes": []},
{"suite": "net", "checks": 43, "failures": 0, "seconds": 0.01, "failed": [], "notes": []},
{"suite": "net_rounds", "checks": 12, "failures": 0, "seconds": 0.07, "failed": [], "notes": []},
{"suite": "h1", "checks": 42, "failures": 0, "seconds": 1.29, "failed": [], "notes": ["sylvara-bot match seed 12: 15/1"]},
{"suite": "s1", "checks": 31, "failures": 0, "seconds": 0.43, "failed": [], "notes": ["extended seed 17: 10/0, income bonus 24,0,24,0,0,15, blessing 0/0"]},
{"suite": "s2", "checks": 34, "failures": 0, "seconds": 2.12, "failed": [], "notes": ["12 extended matches: expeditions 12, Mondsegen 4, recipe heroes 0, glyphs 19, Ancient levels 34; seed 1 10/0"]},
{"suite": "s3", "checks": 31, "failures": 0, "seconds": 0.61, "failed": [], "notes": []},
{"suite": "h2", "checks": 22, "failures": 0, "seconds": 0.00, "failed": [], "notes": []}
],
"runtime": ".NET 8.0.27",
"label": ".NET 8.0.27, Release",
"os": "Darwin 27.0.0 Darwin Kernel Version 27.0.0: Tue Aug 11 21:02:59 PDT 2026; root:xnu-13432.1.9~1/RELEASE_ARM64_T8142 Arm64"
}

View file

@ -0,0 +1,371 @@
<?xml version="1.0" encoding="utf-8"?>
<test-run id="2" testcasecount="34" result="Passed" total="34" passed="34" failed="0" inconclusive="0" skipped="0" asserts="0" engine-version="3.5.0.0" clr-version="4.0.30319.42000" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:59:03Z" duration="99.1737822">
<test-suite type="TestSuite" id="1000" name="luneraria-unity" fullname="luneraria-unity" runstate="Runnable" testcasecount="34" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:59:03Z" duration="99.173782" total="34" passed="34" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="platform" value="EditMode" />
</properties>
<test-suite type="Assembly" id="1017" name="Luneraria.Core.Tests.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.Core.Tests.dll" runstate="Runnable" testcasecount="14" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:58:39Z" duration="75.882744" total="14" passed="14" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="32049" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1018" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="14" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:58:39Z" duration="75.882499" total="14" passed="14" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1019" name="Core" fullname="Luneraria.Core" runstate="Runnable" testcasecount="14" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:58:39Z" duration="75.882261" total="14" passed="14" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1020" name="Tests" fullname="Luneraria.Core.Tests" runstate="Runnable" testcasecount="14" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:58:39Z" duration="75.882035" total="14" passed="14" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1001" name="CoreIntegrationTests" fullname="Luneraria.Core.Tests.CoreIntegrationTests" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:57:24Z" duration="0.068032" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1003" name="CoreFloatArithmeticMatchesGodot" fullname="Luneraria.Core.Tests.CoreIntegrationTests.CoreFloatArithmeticMatchesGodot" methodname="CoreFloatArithmeticMatchesGodot" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" seed="571652855" result="Passed" start-time="2026-10-11 14:57:23Z" end-time="2026-10-11 14:57:24Z" duration="0.063577" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[float probe: length 4000/4000, length_squared 4000/4000, distance_to 4000/4000, distance_squared_to 4000/4000, dot 4000/4000, normalized 4000/4000, lerp 4000/4000, limit_length 4000/4000, multiply 4000/4000, divide 4000/4000, sub_normalized 4000/4000, atan2 4000/4000
]]></output>
</test-case>
<test-case id="1002" name="CoreHasNoEngineReferences" fullname="Luneraria.Core.Tests.CoreIntegrationTests.CoreHasNoEngineReferences" methodname="CoreHasNoEngineReferences" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" seed="991403339" result="Passed" start-time="2026-10-11 14:57:24Z" end-time="2026-10-11 14:57:24Z" duration="0.000282" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1004" name="CoreSuiteTests" fullname="Luneraria.Core.Tests.CoreSuiteTests" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:57:24Z" end-time="2026-10-11 14:58:39Z" duration="75.813563" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1005" name="Content" fullname="Luneraria.Core.Tests.CoreSuiteTests.Content" methodname="Content" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="625688550" result="Passed" start-time="2026-10-11 14:57:24Z" end-time="2026-10-11 14:57:24Z" duration="0.013331" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[content: map geometry: largest deviation lanes 0.00E+000 m, buildings 0.00E+000 m
LUNE_U1_PASS content: 77 checks
]]></output>
</test-case>
<test-case id="1006" name="CoreRules" fullname="Luneraria.Core.Tests.CoreSuiteTests.CoreRules" methodname="CoreRules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1123911954" result="Passed" start-time="2026-10-11 14:57:24Z" end-time="2026-10-11 14:57:29Z" duration="5.330970" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[core: full match seed 2 -> Rot after 9 rounds
LUNE_U1_PASS core: 91 checks
]]></output>
</test-case>
<test-case id="1009" name="Determinism" fullname="Luneraria.Core.Tests.CoreSuiteTests.Determinism" methodname="Determinism" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="830612951" result="Passed" start-time="2026-10-11 14:57:29Z" end-time="2026-10-11 14:57:42Z" duration="13.546562" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS determinism: 6 checks
]]></output>
</test-case>
<test-case id="1008" name="GoldenReplays" fullname="Luneraria.Core.Tests.CoreSuiteTests.GoldenReplays" methodname="GoldenReplays" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="977967922" result="Passed" start-time="2026-10-11 14:57:42Z" end-time="2026-10-11 14:57:56Z" duration="13.521733" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[golden: golden values compared: 51221
golden: largest deviation angle: 0.00E+000 over 1140 values (tolerance 1E-004)
golden: largest deviation effect: 0.00E+000 over 264 values (tolerance 1E-006)
golden: largest deviation hp: 0.00E+000 over 5679 values (tolerance 1E-002)
golden: largest deviation other: 0.00E+000 over 34 values (tolerance 1E-006)
golden: largest deviation position: 0.00E+000 over 3420 values (tolerance 1E-003)
golden: largest deviation time: 0.00E+000 over 780 values (tolerance 1E-006)
golden: domain ancients: 246 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain announcements: 44 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain boss: 1559 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain combat: 676 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain commands: 410 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain events: 6937 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain facing: 1140 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain gold: 3584 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain heroes: 1512 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain hp: 3420 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain other: 119 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain positions: 3420 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain purchases: 9311 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain rounds: 119 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain targets: 1140 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain towers: 1994 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain units: 14164 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain waves: 731 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain winner: 695 values, 0 differences, largest numeric deviation 0.00E+000
LUNE_U1_PASS golden: 157 checks
]]></output>
</test-case>
<test-case id="1012" name="H1Heroes" fullname="Luneraria.Core.Tests.CoreSuiteTests.H1Heroes" methodname="H1Heroes" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1865512660" result="Passed" start-time="2026-10-11 14:57:56Z" end-time="2026-10-11 14:58:08Z" duration="11.545062" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[h1: sylvara-bot match seed 12: 15/1
LUNE_U1_PASS h1: 42 checks
]]></output>
</test-case>
<test-case id="1016" name="H2Heroes" fullname="Luneraria.Core.Tests.CoreSuiteTests.H2Heroes" methodname="H2Heroes" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1523687017" result="Passed" start-time="2026-10-11 14:58:08Z" end-time="2026-10-11 14:58:08Z" duration="0.014013" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS h2: 22 checks
]]></output>
</test-case>
<test-case id="1007" name="M2Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.M2Rules" methodname="M2Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1972937494" result="Passed" start-time="2026-10-11 14:58:08Z" end-time="2026-10-11 14:58:11Z" duration="3.368497" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS m2: 73 checks
]]></output>
</test-case>
<test-case id="1010" name="NetProtocol" fullname="Luneraria.Core.Tests.CoreSuiteTests.NetProtocol" methodname="NetProtocol" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="873191396" result="Passed" start-time="2026-10-11 14:58:11Z" end-time="2026-10-11 14:58:11Z" duration="0.065667" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS net: 43 checks
]]></output>
</test-case>
<test-case id="1011" name="NetRounds" fullname="Luneraria.Core.Tests.CoreSuiteTests.NetRounds" methodname="NetRounds" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1373345239" result="Passed" start-time="2026-10-11 14:58:11Z" end-time="2026-10-11 14:58:12Z" duration="0.568910" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS net_rounds: 12 checks
]]></output>
</test-case>
<test-case id="1013" name="S1Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S1Rules" methodname="S1Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1229423845" result="Passed" start-time="2026-10-11 14:58:12Z" end-time="2026-10-11 14:58:15Z" duration="3.826071" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[s1: extended seed 17: 10/0, income bonus 24,0,24,0,0,15, blessing 0/0
LUNE_U1_PASS s1: 31 checks
]]></output>
</test-case>
<test-case id="1014" name="S2Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S2Rules" methodname="S2Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1833994956" result="Passed" start-time="2026-10-11 14:58:15Z" end-time="2026-10-11 14:58:34Z" duration="18.719652" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[s2: 12 extended matches: expeditions 12, Mondsegen 4, recipe heroes 0, glyphs 19, Ancient levels 34; seed 1 10/0
LUNE_U1_PASS s2: 34 checks
]]></output>
</test-case>
<test-case id="1015" name="S3Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S3Rules" methodname="S3Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="103978093" result="Passed" start-time="2026-10-11 14:58:34Z" end-time="2026-10-11 14:58:39Z" duration="5.290612" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS s3: 31 checks
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1026" name="Luneraria.Net.Tests.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.Net.Tests.dll" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.032320" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="32049" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1027" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.007844" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1028" name="Net" fullname="Luneraria.Net" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.007564" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1029" name="Tests" fullname="Luneraria.Net.Tests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.007374" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1021" name="LuneWireTests" fullname="Luneraria.Net.Tests.LuneWireTests" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.007202" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1022" name="CommandRoundTrips" fullname="Luneraria.Net.Tests.LuneWireTests.CommandRoundTrips" methodname="CommandRoundTrips" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="1324813035" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.001662" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1025" name="LobbyAndOptionsRoundTrip" fullname="Luneraria.Net.Tests.LuneWireTests.LobbyAndOptionsRoundTrip" methodname="LobbyAndOptionsRoundTrip" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="1337807739" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.000686" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1023" name="StateRoundTrips" fullname="Luneraria.Net.Tests.LuneWireTests.StateRoundTrips" methodname="StateRoundTrips" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="1980035298" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.002674" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1024" name="UnitsAndFrameRoundTrip" fullname="Luneraria.Net.Tests.LuneWireTests.UnitsAndFrameRoundTrip" methodname="UnitsAndFrameRoundTrip" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="1599248383" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.001510" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1043" name="Luneraria.UI.Tests.EditMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.UI.Tests.EditMode.dll" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.208445" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="32049" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1044" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.208172" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1045" name="UI" fullname="Luneraria.UI" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.207987" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1046" name="Tests" fullname="Luneraria.UI.Tests" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.207759" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1030" name="HudModelTests" fullname="Luneraria.UI.Tests.HudModelTests" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.207484" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1035" name="AnnouncedDangersRaiseTheThreat" fullname="Luneraria.UI.Tests.HudModelTests.AnnouncedDangersRaiseTheThreat" methodname="AnnouncedDangersRaiseTheThreat" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="21792033" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.003704" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1036" name="BattlefieldCountsTheLaneUnits" fullname="Luneraria.UI.Tests.HudModelTests.BattlefieldCountsTheLaneUnits" methodname="BattlefieldCountsTheLaneUnits" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1116785096" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.029662" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1033" name="BossLaneChoiceIsPrivateToTheChooser" fullname="Luneraria.UI.Tests.HudModelTests.BossLaneChoiceIsPrivateToTheChooser" methodname="BossLaneChoiceIsPrivateToTheChooser" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="924751101" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.002437" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1037" name="BossStatesFromPublicState" fullname="Luneraria.UI.Tests.HudModelTests.BossStatesFromPublicState" methodname="BossStatesFromPublicState" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="205962074" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.000659" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1042" name="BotMatchStillStartsByItself" fullname="Luneraria.UI.Tests.HudModelTests.BotMatchStillStartsByItself" methodname="BotMatchStillStartsByItself" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1012985768" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.001684" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1031" name="EverySeatSeesTheSamePublicPicture" fullname="Luneraria.UI.Tests.HudModelTests.EverySeatSeesTheSamePublicPicture" methodname="EverySeatSeesTheSamePublicPicture" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1683370762" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:39Z" duration="0.040698" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1041" name="HumanSeatPlanningWaitsForReady" fullname="Luneraria.UI.Tests.HudModelTests.HumanSeatPlanningWaitsForReady" methodname="HumanSeatPlanningWaitsForReady" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="445174070" result="Passed" start-time="2026-10-11 14:58:39Z" end-time="2026-10-11 14:58:40Z" duration="0.058503" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1034" name="LaneThreatFollowsTowerHealth" fullname="Luneraria.UI.Tests.HudModelTests.LaneThreatFollowsTowerHealth" methodname="LaneThreatFollowsTowerHealth" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="312152121" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.000870" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1038" name="NextWaveIsTheRulesWave" fullname="Luneraria.UI.Tests.HudModelTests.NextWaveIsTheRulesWave" methodname="NextWaveIsTheRulesWave" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1416604886" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.001335" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1040" name="NumbersAreFormattedAsInGodot" fullname="Luneraria.UI.Tests.HudModelTests.NumbersAreFormattedAsInGodot" methodname="NumbersAreFormattedAsInGodot" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1450916974" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.000469" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1032" name="OtherSeatsPlansStayPrivateUntilCombat" fullname="Luneraria.UI.Tests.HudModelTests.OtherSeatsPlansStayPrivateUntilCombat" methodname="OtherSeatsPlansStayPrivateUntilCombat" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="93685332" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.065544" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1039" name="ReadyLocksThePlan" fullname="Luneraria.UI.Tests.HudModelTests.ReadyLocksThePlan" methodname="ReadyLocksThePlan" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="383403632" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.000795" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1052" name="Luneraria.View.Tests.EditMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.View.Tests.EditMode.dll" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:59:03Z" duration="23.047660" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="32049" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1053" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:59:03Z" duration="23.047364" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1054" name="View" fullname="Luneraria.View" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:59:03Z" duration="23.047250" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1055" name="Tests" fullname="Luneraria.View.Tests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:59:03Z" duration="23.047117" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1047" name="FrameRateIndependenceTests" fullname="Luneraria.View.Tests.FrameRateIndependenceTests" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:59:03Z" duration="23.046959" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1051" name="ClockRunsWholeStepsOnly" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.ClockRunsWholeStepsOnly" methodname="ClockRunsWholeStepsOnly" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="1754690768" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:40Z" duration="0.000560" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1048" name="FullBotMatchSeed2IsTheSameAtEveryFrameRate" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.FullBotMatchSeed2IsTheSameAtEveryFrameRate" methodname="FullBotMatchSeed2IsTheSameAtEveryFrameRate" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="1274536394" result="Passed" start-time="2026-10-11 14:58:40Z" end-time="2026-10-11 14:58:49Z" duration="8.963841" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 2 30 fps: 19315 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 60 fps: 38597 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 120 fps: 77169 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 unlimited (0.4-3.9 ms jitter): 569627 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 stutter (stalls up to 0.4 s): 26845 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
]]></output>
</test-case>
<test-case id="1049" name="HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" methodname="HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="83536547" result="Passed" start-time="2026-10-11 14:58:49Z" end-time="2026-10-11 14:58:54Z" duration="5.096916" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 9 30 fps: 6342 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 60 fps: 12678 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 120 fps: 25352 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 unlimited (0.4-3.9 ms jitter): 99090 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 stutter (stalls up to 0.4 s): 8796 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
]]></output>
</test-case>
<test-case id="1050" name="MatchSpeedDoesNotChangeTheMatch" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.MatchSpeedDoesNotChangeTheMatch" methodname="MatchSpeedDoesNotChangeTheMatch" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="1828720424" result="Passed" start-time="2026-10-11 14:58:54Z" end-time="2026-10-11 14:59:03Z" duration="8.984654" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 2 30 fps: 2418 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 60 fps: 4831 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 120 fps: 9658 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 unlimited (0.4-3.9 ms jitter): 37713 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 stutter (stalls up to 0.4 s): 3428 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
Saving results to: /Users/martin/Library/Application Support/DefaultCompany/luneraria-unity/TestResults.xml
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-run>

View file

@ -0,0 +1,6 @@
{"endpoint": "v1/image-to-image", "task": "01a12b6c-9eda-7382-92f6-f2b88931aabf", "status": "SUCCEEDED", "credits": 12, "error": null, "time": "2026-10-11T16:45:45"}
{"endpoint": "v1/image-to-image", "task": "01a12b6d-980a-774c-bd36-d96f37cca91d", "status": "SUCCEEDED", "credits": 12, "error": null, "time": "2026-10-11T16:46:49"}
{"endpoint": "v1/image-to-3d", "task": "01a12b6e-4bae-74a4-a924-7323c7ff73c4", "status": "SUCCEEDED", "credits": 30, "error": null, "time": "2026-10-11T16:50:03"}
{"endpoint": "v1/image-to-3d", "task": "01a12b6e-5198-7244-9d84-acdc34ab0dd1", "status": "SUCCEEDED", "credits": 30, "error": null, "time": "2026-10-11T16:50:03"}
{"endpoint": "v1/rigging", "task": "01a12b71-c38f-7621-9467-1c49136e3b47", "status": "SUCCEEDED", "credits": 5, "error": null, "time": "2026-10-11T16:51:03"}
{"endpoint": "v1/animations", "task": "01a12b72-4071-75e7-8e0c-30017dec9391", "status": "SUCCEEDED", "credits": 24, "error": null, "time": "2026-10-11T16:51:42"}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2764, "fps": 138.1, "frame_ms_avg": 7.24, "frame_ms_median": 3.11, "frame_ms_p95": 22.31, "frame_ms_p99": 28.81, "frame_ms_max": 43.12, "frames_over_16_7_ms": 365, "of_them_with_simulation_step": 30, "gc_collections": 20, "simulation_ms_per_frame": 0.069, "views_ms_per_frame": 0.227, "ui_ms_per_frame": 0.070, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.62 / median 2.50 / p95 3.59 ms, render thread avg 1.82 / median 1.80 / p95 2.16 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.61 / median 0.15 / p95 19.58 ms
{"view": "mid lane close (zoom 22)", "frames": 1535, "fps": 153.3, "frame_ms_avg": 6.52, "frame_ms_median": 2.84, "frame_ms_p95": 21.72, "frame_ms_p99": 30.41, "frame_ms_max": 37.00, "frames_over_16_7_ms": 161, "of_them_with_simulation_step": 9, "gc_collections": 7, "simulation_ms_per_frame": 0.040, "views_ms_per_frame": 0.191, "ui_ms_per_frame": 0.048, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 2.02 / median 1.97 / p95 2.79 ms, render thread avg 1.37 / median 1.36 / p95 1.59 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.50 / median 0.26 / p95 19.83 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2861, "fps": 142.9, "frame_ms_avg": 7.00, "frame_ms_median": 3.01, "frame_ms_p95": 22.01, "frame_ms_p99": 28.11, "frame_ms_max": 41.10, "frames_over_16_7_ms": 339, "of_them_with_simulation_step": 32, "gc_collections": 20, "simulation_ms_per_frame": 0.064, "views_ms_per_frame": 0.215, "ui_ms_per_frame": 0.065, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.48 / median 2.38 / p95 3.40 ms, render thread avg 1.72 / median 1.72 / p95 1.99 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.51 / median 0.18 / p95 19.43 ms
{"view": "mid lane close (zoom 22)", "frames": 1573, "fps": 157.1, "frame_ms_avg": 6.37, "frame_ms_median": 2.62, "frame_ms_p95": 21.61, "frame_ms_p99": 30.11, "frame_ms_max": 35.81, "frames_over_16_7_ms": 152, "of_them_with_simulation_step": 16, "gc_collections": 7, "simulation_ms_per_frame": 0.037, "views_ms_per_frame": 0.187, "ui_ms_per_frame": 0.046, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 1.95 / median 1.90 / p95 2.60 ms, render thread avg 1.34 / median 1.33 / p95 1.56 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.41 / median 0.21 / p95 19.40 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2867, "fps": 143.3, "frame_ms_avg": 6.98, "frame_ms_median": 3.01, "frame_ms_p95": 22.07, "frame_ms_p99": 28.10, "frame_ms_max": 40.11, "frames_over_16_7_ms": 320, "of_them_with_simulation_step": 32, "gc_collections": 20, "simulation_ms_per_frame": 0.064, "views_ms_per_frame": 0.209, "ui_ms_per_frame": 0.063, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.44 / median 2.34 / p95 3.30 ms, render thread avg 1.71 / median 1.71 / p95 1.99 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.54 / median 0.19 / p95 19.58 ms
{"view": "mid lane close (zoom 22)", "frames": 1579, "fps": 157.8, "frame_ms_avg": 6.34, "frame_ms_median": 2.80, "frame_ms_p95": 21.80, "frame_ms_p99": 29.50, "frame_ms_max": 38.08, "frames_over_16_7_ms": 157, "of_them_with_simulation_step": 13, "gc_collections": 8, "simulation_ms_per_frame": 0.038, "views_ms_per_frame": 0.182, "ui_ms_per_frame": 0.044, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 1.92 / median 1.88 / p95 2.64 ms, render thread avg 1.35 / median 1.34 / p95 1.57 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.41 / median 0.24 / p95 19.85 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_sylvara x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, w02 7, sylvara 5, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2859, "fps": 142.9, "frame_ms_avg": 7.00, "frame_ms_median": 2.99, "frame_ms_p95": 22.54, "frame_ms_p99": 28.12, "frame_ms_max": 51.06, "frames_over_16_7_ms": 334, "of_them_with_simulation_step": 48, "gc_collections": 20, "simulation_ms_per_frame": 0.063, "views_ms_per_frame": 0.218, "ui_ms_per_frame": 0.059, "units_alive_max": 77},
// timings overview (zoom 64): main thread avg 2.51 / median 2.43 / p95 3.30 ms, render thread avg 1.74 / median 1.73 / p95 2.03 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.48 / median 0.16 / p95 19.90 ms
{"view": "mid lane close (zoom 22)", "frames": 1618, "fps": 161.8, "frame_ms_avg": 6.18, "frame_ms_median": 2.82, "frame_ms_p95": 21.20, "frame_ms_p99": 29.81, "frame_ms_max": 37.19, "frames_over_16_7_ms": 148, "of_them_with_simulation_step": 26, "gc_collections": 8, "simulation_ms_per_frame": 0.037, "views_ms_per_frame": 0.188, "ui_ms_per_frame": 0.044, "units_alive_max": 37}
// timings mid lane close (zoom 22): main thread avg 1.98 / median 1.92 / p95 2.71 ms, render thread avg 1.36 / median 1.35 / p95 1.57 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.19 / median 0.42 / p95 19.05 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_sylvara x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, w02 7, sylvara 5, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2834, "fps": 141.7, "frame_ms_avg": 7.06, "frame_ms_median": 3.00, "frame_ms_p95": 21.99, "frame_ms_p99": 27.70, "frame_ms_max": 51.77, "frames_over_16_7_ms": 333, "of_them_with_simulation_step": 22, "gc_collections": 20, "simulation_ms_per_frame": 0.064, "views_ms_per_frame": 0.214, "ui_ms_per_frame": 0.060, "units_alive_max": 77},
// timings overview (zoom 64): main thread avg 2.51 / median 2.41 / p95 3.33 ms, render thread avg 1.73 / median 1.73 / p95 2.02 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.55 / median 0.14 / p95 19.33 ms
{"view": "mid lane close (zoom 22)", "frames": 1627, "fps": 162.5, "frame_ms_avg": 6.15, "frame_ms_median": 2.90, "frame_ms_p95": 21.11, "frame_ms_p99": 27.98, "frame_ms_max": 34.60, "frames_over_16_7_ms": 150, "of_them_with_simulation_step": 14, "gc_collections": 8, "simulation_ms_per_frame": 0.038, "views_ms_per_frame": 0.184, "ui_ms_per_frame": 0.044, "units_alive_max": 37}
// timings mid lane close (zoom 22): main thread avg 1.96 / median 1.91 / p95 2.70 ms, render thread avg 1.34 / median 1.33 / p95 1.56 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.16 / median 0.74 / p95 18.70 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_sylvara x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, w02 7, sylvara 5, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2825, "fps": 141.2, "frame_ms_avg": 7.08, "frame_ms_median": 3.10, "frame_ms_p95": 22.09, "frame_ms_p99": 28.00, "frame_ms_max": 41.50, "frames_over_16_7_ms": 354, "of_them_with_simulation_step": 64, "gc_collections": 20, "simulation_ms_per_frame": 0.065, "views_ms_per_frame": 0.225, "ui_ms_per_frame": 0.060, "units_alive_max": 77},
// timings overview (zoom 64): main thread avg 2.60 / median 2.48 / p95 3.70 ms, render thread avg 1.74 / median 1.73 / p95 2.07 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.49 / median 0.14 / p95 19.29 ms
{"view": "mid lane close (zoom 22)", "frames": 1635, "fps": 163.2, "frame_ms_avg": 6.13, "frame_ms_median": 2.91, "frame_ms_p95": 20.43, "frame_ms_p99": 27.40, "frame_ms_max": 33.80, "frames_over_16_7_ms": 137, "of_them_with_simulation_step": 25, "gc_collections": 8, "simulation_ms_per_frame": 0.034, "views_ms_per_frame": 0.189, "ui_ms_per_frame": 0.044, "units_alive_max": 37}
// timings mid lane close (zoom 22): main thread avg 1.96 / median 1.90 / p95 2.78 ms, render thread avg 1.34 / median 1.33 / p95 1.56 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.14 / median 0.68 / p95 18.22 ms
]
}

View file

@ -0,0 +1,11 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"seconds": 11.6,
"passed": ["Startbildschirm sichtbar", "Partie wartet: Spielcontroller und Treiber aus", "vor dem Start kein HUD", "„Allein spielen“ bedienbar", "Offline: Startbildschirm verborgen", "Offline: Spielcontroller und Treiber laufen", "Offline: HUD sichtbar", "Offline: neue Partie, Sitz 1 (Mid)", "Offline: Planung", "Offline: lokale Sitzung", "„Startaufstellung“ bedienbar", "Startaufstellung gekauft (3 Einheiten)", "„Bereit“ bedienbar", "Bereit: Kampf beginnt", "Kampf: Figuren im Feld", "„Menü“ bedienbar", "Verlassen-Dialog mit „Zum Menü“", "Zurück: Startbildschirm sichtbar", "Zurück: HUD verborgen", "Zurück: Spielcontroller und Treiber aus", "Zurück: Sitzung beendet", "Zurück: keine Figuren im Feld", "Zurück: Kamera ruht", "Zurück: „Allein spielen“ bedienbar", "Zweite Partie: Startbildschirm verborgen, HUD sichtbar", "Zweite Partie: neue Partie in der Planung", "SSAO folgt der Einstellung", "Option „Umgebungsverdeckung“ sichtbar", "Option schaltet SSAO um", "Option stellt SSAO zurück"],
"failed": [],
"photos": ["00-startbildschirm.jpg", "01-planung.jpg", "02-kampf.jpg", "03-verlassen.jpg", "04-zurueck-im-startbildschirm.jpg", "05-zweite-partie.jpg", "06-optionen.jpg"],
"result": "PASS"
}

View file

@ -0,0 +1,450 @@
<?xml version="1.0" encoding="utf-8"?>
<test-run id="2" testcasecount="31" result="Passed" total="31" passed="19" failed="0" inconclusive="0" skipped="12" asserts="0" engine-version="3.5.0.0" clr-version="4.0.30319.42000" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:13:23Z" duration="312.6098309">
<test-suite type="TestSuite" id="1058" name="luneraria-unity" fullname="luneraria-unity" runstate="Runnable" testcasecount="31" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:13:23Z" duration="312.609831" total="31" passed="19" failed="0" inconclusive="0" skipped="12" asserts="0">
<properties>
<property name="platform" value="PlayMode" />
</properties>
<test-suite type="Assembly" id="1043" name="Luneraria.UI.Tests.PlayMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.UI.Tests.PlayMode.dll" runstate="Runnable" testcasecount="29" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:40Z" duration="29.448289" total="29" passed="17" failed="0" inconclusive="0" skipped="12" asserts="0">
<properties>
<property name="_PID" value="33438" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="PlayMode" />
<property name="EditorOnly" value="False" />
</properties>
<test-suite type="TestSuite" id="1044" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="29" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:40Z" duration="29.447877" total="29" passed="17" failed="0" inconclusive="0" skipped="12" asserts="0">
<properties />
<test-suite type="TestSuite" id="1045" name="UI" fullname="Luneraria.UI" runstate="Runnable" testcasecount="29" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:40Z" duration="29.447676" total="29" passed="17" failed="0" inconclusive="0" skipped="12" asserts="0">
<properties />
<test-suite type="TestSuite" id="1046" name="Tests" fullname="Luneraria.UI.Tests" runstate="Runnable" testcasecount="29" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:40Z" duration="29.447261" total="29" passed="17" failed="0" inconclusive="0" skipped="12" asserts="0">
<properties />
<test-suite type="TestFixture" id="1001" name="ArmyViewsTests" fullname="Luneraria.UI.Tests.ArmyViewsTests" classname="Luneraria.UI.Tests.ArmyViewsTests" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:10Z" duration="0.002637" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1002" name="Glutpakt" fullname="Luneraria.UI.Tests.ArmyViewsTests.Glutpakt" methodname="Glutpakt" classname="Luneraria.UI.Tests.ArmyViewsTests" runstate="Runnable" seed="484685372" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1003" name="FigureViewsTests" fullname="Luneraria.UI.Tests.FigureViewsTests" classname="Luneraria.UI.Tests.FigureViewsTests" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:10Z" duration="0.000068" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1004" name="Kohlenbeisser" fullname="Luneraria.UI.Tests.FigureViewsTests.Kohlenbeisser" methodname="Kohlenbeisser" classname="Luneraria.UI.Tests.FigureViewsTests" runstate="Runnable" seed="1247754021" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1005" name="H1HeroViewsTests" fullname="Luneraria.UI.Tests.H1HeroViewsTests" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:12Z" duration="2.024046" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1007" name="SylvaraBilder" fullname="Luneraria.UI.Tests.H1HeroViewsTests.SylvaraBilder" methodname="SylvaraBilder" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Explicit" seed="469215423" result="Skipped" label="Explicit" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:10Z" duration="0.000151" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1006" name="SylvaraHud" fullname="Luneraria.UI.Tests.H1HeroViewsTests.SylvaraHud" methodname="SylvaraHud" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Runnable" seed="1188505406" result="Passed" start-time="2026-10-11 15:08:10Z" end-time="2026-10-11 15:08:12Z" duration="2.021571" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1008" name="H2HeroViewsTests" fullname="Luneraria.UI.Tests.H2HeroViewsTests" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:12Z" end-time="2026-10-11 15:08:13Z" duration="0.499744" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1010" name="BrunhildBilder" fullname="Luneraria.UI.Tests.H2HeroViewsTests.BrunhildBilder" methodname="BrunhildBilder" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Explicit" seed="1423703170" result="Skipped" label="Explicit" start-time="2026-10-11 15:08:12Z" end-time="2026-10-11 15:08:12Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1009" name="BrunhildHud" fullname="Luneraria.UI.Tests.H2HeroViewsTests.BrunhildHud" methodname="BrunhildHud" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Runnable" seed="1071759425" result="Passed" start-time="2026-10-11 15:08:12Z" end-time="2026-10-11 15:08:13Z" duration="0.495401" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1011" name="HudCaptureTests" fullname="Luneraria.UI.Tests.HudCaptureTests" classname="Luneraria.UI.Tests.HudCaptureTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:08:13Z" end-time="2026-10-11 15:08:13Z" duration="0.420027" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1012" name="PlanningHudOverTheScene" fullname="Luneraria.UI.Tests.HudCaptureTests.PlanningHudOverTheScene" methodname="PlanningHudOverTheScene" classname="Luneraria.UI.Tests.HudCaptureTests" runstate="Runnable" seed="1885282074" result="Passed" start-time="2026-10-11 15:08:13Z" end-time="2026-10-11 15:08:13Z" duration="0.416059" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_HUD syncs 1 sync ms 0.177 portraits 15 scale 1 size (1706.67, 960.00)
LUNE_HUD region top (x:425.78, y:12.44, width:855.11, height:83.56)
LUNE_HUD region system (x:1559.11, y:12.44, width:136.00, height:35.56)
LUNE_HUD region left (x:12.44, y:12.44, width:312.00, height:466.67)
LUNE_HUD region right (x:1372.44, y:56.00, width:322.67, height:248.00)
LUNE_HUD region bottom (x:12.44, y:761.78, width:1432.00, height:186.67)
LUNE_HUD region ready (x:1455.11, y:616.00, width:240.00, height:84.44)
LUNE_HUD region minimap (x:1455.11, y:708.44, width:240.00, height:240.00)
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1013" name="HudPlaytest" fullname="Luneraria.UI.Tests.HudPlaytest" classname="Luneraria.UI.Tests.HudPlaytest" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:08:13Z" end-time="2026-10-11 15:08:13Z" duration="0.000105" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Spieltest: wartet auf Befehlsdateien" />
</properties>
<reason>
<message><![CDATA[Spieltest: wartet auf Befehlsdateien]]></message>
</reason>
<test-case id="1014" name="Play" fullname="Luneraria.UI.Tests.HudPlaytest.Play" methodname="Play" classname="Luneraria.UI.Tests.HudPlaytest" runstate="Runnable" seed="443027061" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="2147483647" />
</properties>
<reason>
<message><![CDATA[Spieltest: wartet auf Befehlsdateien]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1015" name="HudVerifyTests" fullname="Luneraria.UI.Tests.HudVerifyTests" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" testcasecount="9" result="Passed" start-time="2026-10-11 15:08:13Z" end-time="2026-10-11 15:08:25Z" duration="12.156553" total="9" passed="9" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1016" name="A_Layout" fullname="Luneraria.UI.Tests.HudVerifyTests.A_Layout" methodname="A_Layout" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1041325043" result="Passed" start-time="2026-10-11 15:08:13Z" end-time="2026-10-11 15:08:18Z" duration="4.607664" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY A: 585 checks, 0 failed
]]></output>
</test-case>
<test-case id="1017" name="B_Status" fullname="Luneraria.UI.Tests.HudVerifyTests.B_Status" methodname="B_Status" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="2030120030" result="Passed" start-time="2026-10-11 15:08:18Z" end-time="2026-10-11 15:08:18Z" duration="0.406023" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY B: 21 checks, 0 failed
]]></output>
</test-case>
<test-case id="1018" name="C_HeroItemsUnits" fullname="Luneraria.UI.Tests.HudVerifyTests.C_HeroItemsUnits" methodname="C_HeroItemsUnits" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1005551008" result="Passed" start-time="2026-10-11 15:08:18Z" end-time="2026-10-11 15:08:19Z" duration="0.768884" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY C: 23 checks, 0 failed
]]></output>
</test-case>
<test-case id="1019" name="D_ChampionsAndBoss" fullname="Luneraria.UI.Tests.HudVerifyTests.D_ChampionsAndBoss" methodname="D_ChampionsAndBoss" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="240803134" result="Passed" start-time="2026-10-11 15:08:19Z" end-time="2026-10-11 15:08:19Z" duration="0.539322" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY D: 16 checks, 0 failed
]]></output>
</test-case>
<test-case id="1020" name="E_ReadyBotsPrivacy" fullname="Luneraria.UI.Tests.HudVerifyTests.E_ReadyBotsPrivacy" methodname="E_ReadyBotsPrivacy" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="803562058" result="Passed" start-time="2026-10-11 15:08:19Z" end-time="2026-10-11 15:08:21Z" duration="1.414110" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY E: 17 checks, 0 failed
]]></output>
</test-case>
<test-case id="1021" name="F_Input" fullname="Luneraria.UI.Tests.HudVerifyTests.F_Input" methodname="F_Input" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1108008334" result="Passed" start-time="2026-10-11 15:08:21Z" end-time="2026-10-11 15:08:24Z" duration="3.434122" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY F: 18 checks, 0 failed
]]></output>
</test-case>
<test-case id="1022" name="G_EventsAndMotion" fullname="Luneraria.UI.Tests.HudVerifyTests.G_EventsAndMotion" methodname="G_EventsAndMotion" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="130660984" result="Passed" start-time="2026-10-11 15:08:24Z" end-time="2026-10-11 15:08:25Z" duration="0.465534" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY G: 14 checks, 0 failed
]]></output>
</test-case>
<test-case id="1023" name="H_RatesAndPortraits" fullname="Luneraria.UI.Tests.HudVerifyTests.H_RatesAndPortraits" methodname="H_RatesAndPortraits" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1156458073" result="Passed" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:25Z" duration="0.210705" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY rates planning 18/2s combat 10/2s sync 0.223 ms portraits 16
LUNE_VERIFY H: 5 checks, 0 failed
]]></output>
</test-case>
<test-case id="1024" name="I_Field" fullname="Luneraria.UI.Tests.HudVerifyTests.I_Field" methodname="I_Field" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="348733467" result="Passed" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:25Z" duration="0.306232" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY I: 19 checks, 0 failed
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1025" name="HudViewsTests" fullname="Luneraria.UI.Tests.HudViewsTests" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Explicit" testcasecount="4" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:25Z" duration="0.000241" total="4" passed="0" failed="0" inconclusive="0" skipped="4" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1028" name="Motifs_1280x720" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_1280x720" methodname="Motifs_1280x720" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="2076851718" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1026" name="Motifs_1920x1080" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_1920x1080" methodname="Motifs_1920x1080" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="1154065971" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1029" name="Motifs_2560x1080" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_2560x1080" methodname="Motifs_2560x1080" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="1482049301" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1027" name="Motifs_2560x1440" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_2560x1440" methodname="Motifs_2560x1440" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="318062725" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1030" name="S1RulesViewsTests" fullname="Luneraria.UI.Tests.S1RulesViewsTests" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:27Z" duration="1.626924" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1032" name="S1Bilder" fullname="Luneraria.UI.Tests.S1RulesViewsTests.S1Bilder" methodname="S1Bilder" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Explicit" seed="766748513" result="Skipped" label="Explicit" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:25Z" duration="0.000002" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1031" name="S1Hud" fullname="Luneraria.UI.Tests.S1RulesViewsTests.S1Hud" methodname="S1Hud" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Runnable" seed="65905269" result="Passed" start-time="2026-10-11 15:08:25Z" end-time="2026-10-11 15:08:27Z" duration="1.624760" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1033" name="S2RulesViewsTests" fullname="Luneraria.UI.Tests.S2RulesViewsTests" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:27Z" duration="0.321169" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1035" name="S2Bilder" fullname="Luneraria.UI.Tests.S2RulesViewsTests.S2Bilder" methodname="S2Bilder" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Explicit" seed="1706347263" result="Skipped" label="Explicit" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:27Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1034" name="S2Hud" fullname="Luneraria.UI.Tests.S2RulesViewsTests.S2Hud" methodname="S2Hud" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Runnable" seed="1522956290" result="Passed" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:27Z" duration="0.317689" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1036" name="S3RulesViewsTests" fullname="Luneraria.UI.Tests.S3RulesViewsTests" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:29Z" duration="1.541816" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1038" name="S3Bilder" fullname="Luneraria.UI.Tests.S3RulesViewsTests.S3Bilder" methodname="S3Bilder" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Explicit" seed="1027170100" result="Skipped" label="Explicit" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:27Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1037" name="S3Hud" fullname="Luneraria.UI.Tests.S3RulesViewsTests.S3Hud" methodname="S3Hud" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Runnable" seed="1749301029" result="Passed" start-time="2026-10-11 15:08:27Z" end-time="2026-10-11 15:08:29Z" duration="1.539165" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1039" name="StartScreenTests" fullname="Luneraria.UI.Tests.StartScreenTests" classname="Luneraria.UI.Tests.StartScreenTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:08:29Z" end-time="2026-10-11 15:08:39Z" duration="10.733619" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1040" name="StartScreenLeadsIntoTheMatchAndBack" fullname="Luneraria.UI.Tests.StartScreenTests.StartScreenLeadsIntoTheMatchAndBack" methodname="StartScreenLeadsIntoTheMatchAndBack" classname="Luneraria.UI.Tests.StartScreenTests" runstate="Runnable" seed="1557917727" result="Passed" start-time="2026-10-11 15:08:29Z" end-time="2026-10-11 15:08:39Z" duration="10.730807" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="300000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SMOKE ok Startbildschirm sichtbar
LUNE_SMOKE ok Partie wartet: Spielcontroller und Treiber aus
LUNE_SMOKE ok vor dem Start kein HUD
LUNE_SMOKE ok „Allein spielen“ bedienbar
LUNE_SMOKE ok Offline: Startbildschirm verborgen
LUNE_SMOKE ok Offline: Spielcontroller und Treiber laufen
LUNE_SMOKE ok Offline: HUD sichtbar
LUNE_SMOKE ok Offline: neue Partie, Sitz 1 (Mid)
LUNE_SMOKE ok Offline: Planung
LUNE_SMOKE ok Offline: lokale Sitzung
LUNE_SMOKE ok „Startaufstellung“ bedienbar
LUNE_SMOKE ok Startaufstellung gekauft (3 Einheiten)
LUNE_SMOKE ok „Bereit“ bedienbar
LUNE_SMOKE ok Bereit: Kampf beginnt
LUNE_SMOKE ok Kampf: Figuren im Feld
LUNE_SMOKE ok „Menü“ bedienbar
LUNE_SMOKE ok Verlassen-Dialog mit „Zum Menü“
LUNE_SMOKE ok Zurück: Startbildschirm sichtbar
LUNE_SMOKE ok Zurück: HUD verborgen
LUNE_SMOKE ok Zurück: Spielcontroller und Treiber aus
LUNE_SMOKE ok Zurück: Sitzung beendet
LUNE_SMOKE ok Zurück: keine Figuren im Feld
LUNE_SMOKE ok Zurück: Kamera ruht
LUNE_SMOKE ok Zurück: „Allein spielen“ bedienbar
LUNE_SMOKE ok Zweite Partie: Startbildschirm verborgen, HUD sichtbar
LUNE_SMOKE ok Zweite Partie: neue Partie in der Planung
LUNE_SMOKE_PASS 26 ok, 0 Fehler
LUNE_START_SCREEN 26 checks passed
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1041" name="UiToolkitProbeTests" fullname="Luneraria.UI.Tests.UiToolkitProbeTests" classname="Luneraria.UI.Tests.UiToolkitProbeTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:08:39Z" end-time="2026-10-11 15:08:40Z" duration="0.119090" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1042" name="PanelRendersIntoTexture" fullname="Luneraria.UI.Tests.UiToolkitProbeTests.PanelRendersIntoTexture" methodname="PanelRendersIntoTexture" classname="Luneraria.UI.Tests.UiToolkitProbeTests" runstate="Runnable" seed="1992924022" result="Passed" start-time="2026-10-11 15:08:39Z" end-time="2026-10-11 15:08:40Z" duration="0.118672" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SPIKE corner RGBA(0.565, 0.635, 0.506, 1.000) panel RGBA(0.196, 0.227, 0.204, 1.000) layout (x:12.44, y:12.44, width:760.00, height:530.67)
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1051" name="Luneraria.View.Tests.PlayMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.View.Tests.PlayMode.dll" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:13:23Z" duration="283.158390" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="33438" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="PlayMode" />
<property name="EditorOnly" value="False" />
</properties>
<test-suite type="TestSuite" id="1052" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:13:23Z" duration="283.156447" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1053" name="View" fullname="Luneraria.View" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:13:23Z" duration="283.154829" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1054" name="Tests" fullname="Luneraria.View.Tests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:13:23Z" duration="283.154156" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1047" name="SceneFrameRateTests" fullname="Luneraria.View.Tests.SceneFrameRateTests" classname="Luneraria.View.Tests.SceneFrameRateTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:10:30Z" duration="110.535256" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1048" name="SceneMatchIsTheSameAtRealFrameRates" fullname="Luneraria.View.Tests.SceneFrameRateTests.SceneMatchIsTheSameAtRealFrameRates" methodname="SceneMatchIsTheSameAtRealFrameRates" classname="Luneraria.View.Tests.SceneFrameRateTests" runstate="Runnable" seed="636271957" result="Passed" start-time="2026-10-11 15:08:40Z" end-time="2026-10-11 15:10:30Z" duration="110.533471" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SCENE_FPS 30 fps: 815 frames in 27.1 s = 30.0 fps, up to 21 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS 60 fps: 1627 frames in 27.1 s = 60.0 fps, up to 10 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS 120 fps: 3222 frames in 26.9 s = 119.8 fps, up to 8 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS unlimited: 82796 frames in 26.9 s = 3082.0 fps, up to 9 steps per frame, hash DCE95C96556F3A1A, same=True
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1049" name="VerticalFunctionTests" fullname="Luneraria.View.Tests.VerticalFunctionTests" classname="Luneraria.View.Tests.VerticalFunctionTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:10:30Z" end-time="2026-10-11 15:13:23Z" duration="172.618257" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1050" name="BotMatchesRunVisiblyAndMatchTheCore" fullname="Luneraria.View.Tests.VerticalFunctionTests.BotMatchesRunVisiblyAndMatchTheCore" methodname="BotMatchesRunVisiblyAndMatchTheCore" classname="Luneraria.View.Tests.VerticalFunctionTests" runstate="Runnable" seed="2051854219" result="Passed" start-time="2026-10-11 15:10:30Z" end-time="2026-10-11 15:13:23Z" duration="172.612144" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="3600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U2D shot 01-runde1-aufmarsch round 1 Combat
LUNE_U2D shot 02-runde1-mid-kampf round 1 Combat
LUNE_U2D shot 03-turm-faellt round 7 Combat
LUNE_U2D shot 04-turm-ruine round 7 Combat
LUNE_U2D shot 05-grotte-bosskampf round 8 Combat
LUNE_U2D shot 06-held-kaempft round 9 Combat
LUNE_U2D shot 07-boss-auf-der-lane round 9 Combat
LUNE_U2D shot 08-ancient-faellt round 9 Over
LUNE_U2D shot 09-ancient-ruine round 9 Over
LUNE_U2D shot 10-ende-uebersicht round 9 Over
LUNE_U2D shot 11-welle21-uebersicht round 21 Combat
LUNE_U2D shot 12-welle21-kampf round 21 Combat
LUNE_U2D shot 13-ancient-rot-faellt round 22 Over
LUNE_U2D shot 14-welle-ende round 22 Over
Saving results to: /Users/martin/Library/Application Support/DefaultCompany/luneraria-unity/TestResults.xml
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-run>

View file

@ -0,0 +1,11 @@
{
"match": "seed 2, bots, speed 24x",
"core_hash": "DCE95C96556F3A1A",
"core_steps": 12690,
"runs": [
{"target": "30 fps", "frames": 815, "seconds": 27.146, "measured_fps": 30.023, "max_steps_per_frame": 21, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "60 fps", "frames": 1627, "seconds": 27.101, "measured_fps": 60.034, "max_steps_per_frame": 10, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "120 fps", "frames": 3222, "seconds": 26.901, "measured_fps": 119.773, "max_steps_per_frame": 8, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "unlimited", "frames": 82796, "seconds": 26.865, "measured_fps": 3081.963, "max_steps_per_frame": 9, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true}
]
}

View file

@ -0,0 +1,16 @@
{
"runs": [
{"label": "match-seed2", "seed": 2, "start_round": 1, "extra_gold": 0, "speed": 6, "winner": 1, "end_note": "Ancient von Blau zerstört.", "steps": 12690, "hash": "DCE95C96556F3A1A", "core_hash": "DCE95C96556F3A1A", "same_as_core": true,
"units_alive_max": 84, "heroes_alive_max": 4, "boss_log": ["round 8: won team 1 ", "round 9: deployed team 1 bot"],
"rounds": [{"round": 1, "combat_seconds": 44.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 2, "combat_seconds": 57.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 3, "combat_seconds": 54.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 4, "combat_seconds": 62.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 5, "combat_seconds": 60.7, "lost": [], "boss": "none", "end": "cleared"}, {"round": 6, "combat_seconds": 62.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 7, "combat_seconds": 66.5, "lost": ["blau_bot_outer"], "boss": "none", "end": "cleared"}, {"round": 8, "combat_seconds": 89.65, "lost": ["rot_top_outer", "rot_top_inner"], "boss": "won", "end": "cleared"}, {"round": 9, "combat_seconds": 136.55, "lost": ["blau_bot_inner", "blau_base_2", "blau_base_1", "blau_ancient"], "boss": "deployed", "end": "core"}],
"events": ["round 7: blau_bot_outer destroyed", "round 8: rot_top_outer destroyed", "round 8: rot_top_inner destroyed", "round 8: grotto boss won", "round 9: blau_bot_inner destroyed", "round 9: blau_base_2 destroyed", "round 9: blau_base_1 destroyed", "round 9: blau_ancient destroyed", "round 9: grotto boss deployed"],
"shots": ["01-runde1-aufmarsch", "02-runde1-mid-kampf", "03-turm-faellt", "04-turm-ruine", "05-grotte-bosskampf", "06-held-kaempft", "07-boss-auf-der-lane", "08-ancient-faellt", "09-ancient-ruine", "10-ende-uebersicht"],
"performance": null},
{"label": "match-seed9-round21", "seed": 9, "start_round": 21, "extra_gold": 4000, "speed": 6, "winner": 0, "end_note": "Ancient von Rot zerstört.", "steps": 4195, "hash": "7B8E43AEFC0D60C5", "core_hash": "7B8E43AEFC0D60C5", "same_as_core": true,
"units_alive_max": 125, "heroes_alive_max": 6, "boss_log": [],
"rounds": [{"round": 21, "combat_seconds": 121.8, "lost": ["rot_mid_outer", "rot_top_outer", "rot_mid_inner"], "boss": "none", "end": "cleared"}, {"round": 22, "combat_seconds": 87.95, "lost": ["rot_top_inner", "rot_base_1", "blau_bot_outer", "rot_base_2", "rot_ancient"], "boss": "none", "end": "core"}],
"events": ["round 21: rot_mid_outer destroyed", "round 21: rot_top_outer destroyed", "round 21: rot_mid_inner destroyed", "round 22: rot_top_inner destroyed", "round 22: rot_base_1 destroyed", "round 22: blau_bot_outer destroyed", "round 22: rot_base_2 destroyed", "round 22: rot_ancient destroyed"],
"shots": ["11-welle21-uebersicht", "12-welle21-kampf", "13-ancient-rot-faellt", "14-welle-ende"],
"performance": {"window": "20 s real time at 1x speed, unlimited frame rate, round 21", "frames": 48435, "fps": 2421.738, "frame_ms_avg": 0.413, "frame_ms_p95": 0.424, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.14, "units_alive_max": 116}}
]
}

View file

@ -0,0 +1,20 @@
{
"suites": [
{"suite": "content", "checks": 77, "failures": 0, "seconds": 0.02, "failed": [], "notes": ["map geometry: largest deviation lanes 0.00E+000 m, buildings 0.00E+000 m"]},
{"suite": "core", "checks": 91, "failures": 0, "seconds": 1.69, "failed": [], "notes": ["full match seed 2 -> Rot after 9 rounds"]},
{"suite": "m2", "checks": 73, "failures": 0, "seconds": 0.39, "failed": [], "notes": []},
{"suite": "golden", "checks": 157, "failures": 0, "seconds": 1.55, "failed": [], "notes": ["golden values compared: 51221", "largest deviation angle: 0.00E+000 over 1140 values (tolerance 1E-004)", "largest deviation effect: 0.00E+000 over 264 values (tolerance 1E-006)", "largest deviation hp: 0.00E+000 over 5679 values (tolerance 1E-002)", "largest deviation other: 0.00E+000 over 34 values (tolerance 1E-006)", "largest deviation position: 0.00E+000 over 3420 values (tolerance 1E-003)", "largest deviation time: 0.00E+000 over 780 values (tolerance 1E-006)", "domain ancients: 246 values, 0 differences, largest numeric deviation 0.00E+000", "domain announcements: 44 values, 0 differences, largest numeric deviation 0.00E+000", "domain boss: 1559 values, 0 differences, largest numeric deviation 0.00E+000", "domain combat: 676 values, 0 differences, largest numeric deviation 0.00E+000", "domain commands: 410 values, 0 differences, largest numeric deviation 0.00E+000", "domain events: 6937 values, 0 differences, largest numeric deviation 0.00E+000", "domain facing: 1140 values, 0 differences, largest numeric deviation 0.00E+000", "domain gold: 3584 values, 0 differences, largest numeric deviation 0.00E+000", "domain heroes: 1512 values, 0 differences, largest numeric deviation 0.00E+000", "domain hp: 3420 values, 0 differences, largest numeric deviation 0.00E+000", "domain other: 119 values, 0 differences, largest numeric deviation 0.00E+000", "domain positions: 3420 values, 0 differences, largest numeric deviation 0.00E+000", "domain purchases: 9311 values, 0 differences, largest numeric deviation 0.00E+000", "domain rounds: 119 values, 0 differences, largest numeric deviation 0.00E+000", "domain targets: 1140 values, 0 differences, largest numeric deviation 0.00E+000", "domain towers: 1994 values, 0 differences, largest numeric deviation 0.00E+000", "domain units: 14164 values, 0 differences, largest numeric deviation 0.00E+000", "domain waves: 731 values, 0 differences, largest numeric deviation 0.00E+000", "domain winner: 695 values, 0 differences, largest numeric deviation 0.00E+000"]},
{"suite": "determinism", "checks": 6, "failures": 0, "seconds": 1.52, "failed": [], "notes": []},
{"suite": "net", "checks": 43, "failures": 0, "seconds": 0.01, "failed": [], "notes": []},
{"suite": "net_rounds", "checks": 12, "failures": 0, "seconds": 0.07, "failed": [], "notes": []},
{"suite": "h1", "checks": 42, "failures": 0, "seconds": 1.27, "failed": [], "notes": ["sylvara-bot match seed 12: 15/1"]},
{"suite": "s1", "checks": 31, "failures": 0, "seconds": 0.43, "failed": [], "notes": ["extended seed 17: 10/0, income bonus 24,0,24,0,0,15, blessing 0/0"]},
{"suite": "s2", "checks": 34, "failures": 0, "seconds": 2.10, "failed": [], "notes": ["12 extended matches: expeditions 12, Mondsegen 4, recipe heroes 0, glyphs 19, Ancient levels 34; seed 1 10/0"]},
{"suite": "s3", "checks": 31, "failures": 0, "seconds": 0.61, "failed": [], "notes": []},
{"suite": "h2", "checks": 22, "failures": 0, "seconds": 0.00, "failed": [], "notes": []},
{"suite": "s4", "checks": 8, "failures": 0, "seconds": 0.00, "failed": [], "notes": []}
],
"runtime": ".NET 8.0.27",
"label": ".NET 8.0.27, Release",
"os": "Darwin 27.0.0 Darwin Kernel Version 27.0.0: Tue Aug 11 21:02:59 PDT 2026; root:xnu-13432.1.9~1/RELEASE_ARM64_T8142 Arm64"
}

View file

@ -0,0 +1,379 @@
<?xml version="1.0" encoding="utf-8"?>
<test-run id="2" testcasecount="35" result="Passed" total="35" passed="35" failed="0" inconclusive="0" skipped="0" asserts="0" engine-version="3.5.0.0" clr-version="4.0.30319.42000" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:46:18Z" duration="103.3902789">
<test-suite type="TestSuite" id="1000" name="luneraria-unity" fullname="luneraria-unity" runstate="Runnable" testcasecount="35" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:46:18Z" duration="103.390279" total="35" passed="35" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="platform" value="EditMode" />
</properties>
<test-suite type="Assembly" id="1018" name="Luneraria.Core.Tests.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.Core.Tests.dll" runstate="Runnable" testcasecount="15" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:45:53Z" duration="78.283975" total="15" passed="15" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="37834" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1019" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="15" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:45:53Z" duration="78.283704" total="15" passed="15" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1020" name="Core" fullname="Luneraria.Core" runstate="Runnable" testcasecount="15" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:45:53Z" duration="78.283495" total="15" passed="15" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1021" name="Tests" fullname="Luneraria.Core.Tests" runstate="Runnable" testcasecount="15" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:45:53Z" duration="78.283229" total="15" passed="15" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1001" name="CoreIntegrationTests" fullname="Luneraria.Core.Tests.CoreIntegrationTests" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:44:34Z" duration="0.071599" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1003" name="CoreFloatArithmeticMatchesGodot" fullname="Luneraria.Core.Tests.CoreIntegrationTests.CoreFloatArithmeticMatchesGodot" methodname="CoreFloatArithmeticMatchesGodot" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" seed="107261932" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:44:34Z" duration="0.066655" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[float probe: length 4000/4000, length_squared 4000/4000, distance_to 4000/4000, distance_squared_to 4000/4000, dot 4000/4000, normalized 4000/4000, lerp 4000/4000, limit_length 4000/4000, multiply 4000/4000, divide 4000/4000, sub_normalized 4000/4000, atan2 4000/4000
]]></output>
</test-case>
<test-case id="1002" name="CoreHasNoEngineReferences" fullname="Luneraria.Core.Tests.CoreIntegrationTests.CoreHasNoEngineReferences" methodname="CoreHasNoEngineReferences" classname="Luneraria.Core.Tests.CoreIntegrationTests" runstate="Runnable" seed="903255537" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:44:34Z" duration="0.000311" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1004" name="CoreSuiteTests" fullname="Luneraria.Core.Tests.CoreSuiteTests" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" testcasecount="13" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:45:53Z" duration="78.210803" total="13" passed="13" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1005" name="Content" fullname="Luneraria.Core.Tests.CoreSuiteTests.Content" methodname="Content" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="930309601" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:44:34Z" duration="0.013726" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[content: map geometry: largest deviation lanes 0.00E+000 m, buildings 0.00E+000 m
LUNE_U1_PASS content: 77 checks
]]></output>
</test-case>
<test-case id="1006" name="CoreRules" fullname="Luneraria.Core.Tests.CoreSuiteTests.CoreRules" methodname="CoreRules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1436593523" result="Passed" start-time="2026-10-11 15:44:34Z" end-time="2026-10-11 15:44:40Z" duration="5.321400" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[core: full match seed 2 -> Rot after 9 rounds
LUNE_U1_PASS core: 91 checks
]]></output>
</test-case>
<test-case id="1009" name="Determinism" fullname="Luneraria.Core.Tests.CoreSuiteTests.Determinism" methodname="Determinism" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="2053697287" result="Passed" start-time="2026-10-11 15:44:40Z" end-time="2026-10-11 15:44:53Z" duration="13.730174" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS determinism: 6 checks
]]></output>
</test-case>
<test-case id="1008" name="GoldenReplays" fullname="Luneraria.Core.Tests.CoreSuiteTests.GoldenReplays" methodname="GoldenReplays" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1627200637" result="Passed" start-time="2026-10-11 15:44:53Z" end-time="2026-10-11 15:45:07Z" duration="13.868623" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[golden: golden values compared: 51221
golden: largest deviation angle: 0.00E+000 over 1140 values (tolerance 1E-004)
golden: largest deviation effect: 0.00E+000 over 264 values (tolerance 1E-006)
golden: largest deviation hp: 0.00E+000 over 5679 values (tolerance 1E-002)
golden: largest deviation other: 0.00E+000 over 34 values (tolerance 1E-006)
golden: largest deviation position: 0.00E+000 over 3420 values (tolerance 1E-003)
golden: largest deviation time: 0.00E+000 over 780 values (tolerance 1E-006)
golden: domain ancients: 246 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain announcements: 44 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain boss: 1559 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain combat: 676 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain commands: 410 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain events: 6937 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain facing: 1140 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain gold: 3584 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain heroes: 1512 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain hp: 3420 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain other: 119 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain positions: 3420 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain purchases: 9311 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain rounds: 119 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain targets: 1140 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain towers: 1994 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain units: 14164 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain waves: 731 values, 0 differences, largest numeric deviation 0.00E+000
golden: domain winner: 695 values, 0 differences, largest numeric deviation 0.00E+000
LUNE_U1_PASS golden: 157 checks
]]></output>
</test-case>
<test-case id="1012" name="H1Heroes" fullname="Luneraria.Core.Tests.CoreSuiteTests.H1Heroes" methodname="H1Heroes" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="408816745" result="Passed" start-time="2026-10-11 15:45:07Z" end-time="2026-10-11 15:45:19Z" duration="11.554235" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[h1: sylvara-bot match seed 12: 15/1
LUNE_U1_PASS h1: 42 checks
]]></output>
</test-case>
<test-case id="1016" name="H2Heroes" fullname="Luneraria.Core.Tests.CoreSuiteTests.H2Heroes" methodname="H2Heroes" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="375337043" result="Passed" start-time="2026-10-11 15:45:19Z" end-time="2026-10-11 15:45:19Z" duration="0.014546" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS h2: 22 checks
]]></output>
</test-case>
<test-case id="1007" name="M2Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.M2Rules" methodname="M2Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="415400525" result="Passed" start-time="2026-10-11 15:45:19Z" end-time="2026-10-11 15:45:22Z" duration="3.399756" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS m2: 73 checks
]]></output>
</test-case>
<test-case id="1010" name="NetProtocol" fullname="Luneraria.Core.Tests.CoreSuiteTests.NetProtocol" methodname="NetProtocol" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1971154753" result="Passed" start-time="2026-10-11 15:45:22Z" end-time="2026-10-11 15:45:22Z" duration="0.068419" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS net: 43 checks
]]></output>
</test-case>
<test-case id="1011" name="NetRounds" fullname="Luneraria.Core.Tests.CoreSuiteTests.NetRounds" methodname="NetRounds" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1317151176" result="Passed" start-time="2026-10-11 15:45:22Z" end-time="2026-10-11 15:45:23Z" duration="0.581983" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS net_rounds: 12 checks
]]></output>
</test-case>
<test-case id="1013" name="S1Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S1Rules" methodname="S1Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1057465390" result="Passed" start-time="2026-10-11 15:45:23Z" end-time="2026-10-11 15:45:27Z" duration="3.850179" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[s1: extended seed 17: 10/0, income bonus 24,0,24,0,0,15, blessing 0/0
LUNE_U1_PASS s1: 31 checks
]]></output>
</test-case>
<test-case id="1014" name="S2Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S2Rules" methodname="S2Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="137525762" result="Passed" start-time="2026-10-11 15:45:27Z" end-time="2026-10-11 15:45:47Z" duration="19.941361" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[s2: 12 extended matches: expeditions 12, Mondsegen 4, recipe heroes 0, glyphs 19, Ancient levels 34; seed 1 10/0
LUNE_U1_PASS s2: 34 checks
]]></output>
</test-case>
<test-case id="1015" name="S3Rules" fullname="Luneraria.Core.Tests.CoreSuiteTests.S3Rules" methodname="S3Rules" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1328749086" result="Passed" start-time="2026-10-11 15:45:47Z" end-time="2026-10-11 15:45:53Z" duration="5.853746" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS s3: 31 checks
]]></output>
</test-case>
<test-case id="1017" name="S4Net" fullname="Luneraria.Core.Tests.CoreSuiteTests.S4Net" methodname="S4Net" classname="Luneraria.Core.Tests.CoreSuiteTests" runstate="Runnable" seed="1242366733" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.004941" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U1_PASS s4: 8 checks
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1027" name="Luneraria.Net.Tests.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.Net.Tests.dll" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.127653" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="37834" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1028" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.029621" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1029" name="Net" fullname="Luneraria.Net" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.028425" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1030" name="Tests" fullname="Luneraria.Net.Tests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.028061" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1022" name="LuneWireTests" fullname="Luneraria.Net.Tests.LuneWireTests" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.027878" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1023" name="CommandRoundTrips" fullname="Luneraria.Net.Tests.LuneWireTests.CommandRoundTrips" methodname="CommandRoundTrips" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="1394399232" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.013068" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1026" name="LobbyAndOptionsRoundTrip" fullname="Luneraria.Net.Tests.LuneWireTests.LobbyAndOptionsRoundTrip" methodname="LobbyAndOptionsRoundTrip" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="914420489" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.001439" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1024" name="StateRoundTrips" fullname="Luneraria.Net.Tests.LuneWireTests.StateRoundTrips" methodname="StateRoundTrips" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="382721647" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.006154" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1025" name="UnitsAndFrameRoundTrip" fullname="Luneraria.Net.Tests.LuneWireTests.UnitsAndFrameRoundTrip" methodname="UnitsAndFrameRoundTrip" classname="Luneraria.Net.Tests.LuneWireTests" runstate="Runnable" seed="993999595" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.005527" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1044" name="Luneraria.UI.Tests.EditMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.UI.Tests.EditMode.dll" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.249808" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="37834" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1045" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.249371" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1046" name="UI" fullname="Luneraria.UI" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.249141" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1047" name="Tests" fullname="Luneraria.UI.Tests" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.248918" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1031" name="HudModelTests" fullname="Luneraria.UI.Tests.HudModelTests" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" testcasecount="12" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.248454" total="12" passed="12" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1036" name="AnnouncedDangersRaiseTheThreat" fullname="Luneraria.UI.Tests.HudModelTests.AnnouncedDangersRaiseTheThreat" methodname="AnnouncedDangersRaiseTheThreat" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="935837599" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.012518" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1037" name="BattlefieldCountsTheLaneUnits" fullname="Luneraria.UI.Tests.HudModelTests.BattlefieldCountsTheLaneUnits" methodname="BattlefieldCountsTheLaneUnits" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="9670403" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.047628" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1034" name="BossLaneChoiceIsPrivateToTheChooser" fullname="Luneraria.UI.Tests.HudModelTests.BossLaneChoiceIsPrivateToTheChooser" methodname="BossLaneChoiceIsPrivateToTheChooser" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1339201813" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.004828" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1038" name="BossStatesFromPublicState" fullname="Luneraria.UI.Tests.HudModelTests.BossStatesFromPublicState" methodname="BossStatesFromPublicState" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="950009974" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.000792" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1043" name="BotMatchStillStartsByItself" fullname="Luneraria.UI.Tests.HudModelTests.BotMatchStillStartsByItself" methodname="BotMatchStillStartsByItself" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1059707782" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.001952" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1032" name="EverySeatSeesTheSamePublicPicture" fullname="Luneraria.UI.Tests.HudModelTests.EverySeatSeesTheSamePublicPicture" methodname="EverySeatSeesTheSamePublicPicture" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1032970802" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.046867" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1042" name="HumanSeatPlanningWaitsForReady" fullname="Luneraria.UI.Tests.HudModelTests.HumanSeatPlanningWaitsForReady" methodname="HumanSeatPlanningWaitsForReady" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1176788613" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.062748" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1035" name="LaneThreatFollowsTowerHealth" fullname="Luneraria.UI.Tests.HudModelTests.LaneThreatFollowsTowerHealth" methodname="LaneThreatFollowsTowerHealth" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="2070107633" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.001146" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1039" name="NextWaveIsTheRulesWave" fullname="Luneraria.UI.Tests.HudModelTests.NextWaveIsTheRulesWave" methodname="NextWaveIsTheRulesWave" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="251806882" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.001697" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1041" name="NumbersAreFormattedAsInGodot" fullname="Luneraria.UI.Tests.HudModelTests.NumbersAreFormattedAsInGodot" methodname="NumbersAreFormattedAsInGodot" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1315738708" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.000560" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1033" name="OtherSeatsPlansStayPrivateUntilCombat" fullname="Luneraria.UI.Tests.HudModelTests.OtherSeatsPlansStayPrivateUntilCombat" methodname="OtherSeatsPlansStayPrivateUntilCombat" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1277302636" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.064264" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1040" name="ReadyLocksThePlan" fullname="Luneraria.UI.Tests.HudModelTests.ReadyLocksThePlan" methodname="ReadyLocksThePlan" classname="Luneraria.UI.Tests.HudModelTests" runstate="Runnable" seed="1134601554" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.000917" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1053" name="Luneraria.View.Tests.EditMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.View.Tests.EditMode.dll" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:18Z" duration="24.725799" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="37834" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="EditMode" />
<property name="EditorOnly" value="True" />
</properties>
<test-suite type="TestSuite" id="1054" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:18Z" duration="24.712838" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1055" name="View" fullname="Luneraria.View" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:18Z" duration="24.712619" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1056" name="Tests" fullname="Luneraria.View.Tests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:18Z" duration="24.712403" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1048" name="FrameRateIndependenceTests" fullname="Luneraria.View.Tests.FrameRateIndependenceTests" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" testcasecount="4" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:18Z" duration="24.712227" total="4" passed="4" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1052" name="ClockRunsWholeStepsOnly" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.ClockRunsWholeStepsOnly" methodname="ClockRunsWholeStepsOnly" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="1388069764" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:45:53Z" duration="0.000929" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
<test-case id="1049" name="FullBotMatchSeed2IsTheSameAtEveryFrameRate" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.FullBotMatchSeed2IsTheSameAtEveryFrameRate" methodname="FullBotMatchSeed2IsTheSameAtEveryFrameRate" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="1268957414" result="Passed" start-time="2026-10-11 15:45:53Z" end-time="2026-10-11 15:46:03Z" duration="9.669904" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 2 30 fps: 19315 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 60 fps: 38597 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 120 fps: 77169 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 unlimited (0.4-3.9 ms jitter): 569627 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 stutter (stalls up to 0.4 s): 26845 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
]]></output>
</test-case>
<test-case id="1050" name="HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" methodname="HighWaveMatchFromRound21IsTheSameAtEveryFrameRate" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="517063560" result="Passed" start-time="2026-10-11 15:46:03Z" end-time="2026-10-11 15:46:08Z" duration="5.480644" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 9 30 fps: 6342 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 60 fps: 12678 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 120 fps: 25352 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 unlimited (0.4-3.9 ms jitter): 99090 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
LUNE_FPS seed 9 stutter (stalls up to 0.4 s): 8796 frames, 4195 steps, hash 7B8E43AEFC0D60C5 (core 7B8E43AEFC0D60C5)
]]></output>
</test-case>
<test-case id="1051" name="MatchSpeedDoesNotChangeTheMatch" fullname="Luneraria.View.Tests.FrameRateIndependenceTests.MatchSpeedDoesNotChangeTheMatch" methodname="MatchSpeedDoesNotChangeTheMatch" classname="Luneraria.View.Tests.FrameRateIndependenceTests" runstate="Runnable" seed="926040479" result="Passed" start-time="2026-10-11 15:46:08Z" end-time="2026-10-11 15:46:18Z" duration="9.557888" asserts="0">
<properties>
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_FPS seed 2 30 fps: 2418 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 60 fps: 4831 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 120 fps: 9658 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 unlimited (0.4-3.9 ms jitter): 37713 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
LUNE_FPS seed 2 stutter (stalls up to 0.4 s): 3428 frames, 12690 steps, hash DCE95C96556F3A1A (core DCE95C96556F3A1A)
Saving results to: /Users/martin/Library/Application Support/DefaultCompany/luneraria-unity/TestResults.xml
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-run>

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 3030, "fps": 151.5, "frame_ms_avg": 6.60, "frame_ms_median": 2.91, "frame_ms_p95": 22.00, "frame_ms_p99": 28.61, "frame_ms_max": 52.39, "frames_over_16_7_ms": 307, "of_them_with_simulation_step": 24, "gc_collections": 20, "simulation_ms_per_frame": 0.059, "views_ms_per_frame": 0.219, "ui_ms_per_frame": 0.058, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.26 / median 2.14 / p95 3.10 ms, render thread avg 1.66 / median 1.65 / p95 1.96 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.33 / median 0.27 / p95 19.63 ms
{"view": "mid lane close (zoom 22)", "frames": 1652, "fps": 165.0, "frame_ms_avg": 6.06, "frame_ms_median": 2.91, "frame_ms_p95": 21.41, "frame_ms_p99": 28.50, "frame_ms_max": 37.30, "frames_over_16_7_ms": 154, "of_them_with_simulation_step": 13, "gc_collections": 8, "simulation_ms_per_frame": 0.037, "views_ms_per_frame": 0.190, "ui_ms_per_frame": 0.043, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 1.82 / median 1.71 / p95 2.68 ms, render thread avg 1.32 / median 1.31 / p95 1.56 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.26 / median 0.99 / p95 19.39 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2974, "fps": 148.6, "frame_ms_avg": 6.73, "frame_ms_median": 2.90, "frame_ms_p95": 21.52, "frame_ms_p99": 27.56, "frame_ms_max": 37.02, "frames_over_16_7_ms": 328, "of_them_with_simulation_step": 23, "gc_collections": 20, "simulation_ms_per_frame": 0.062, "views_ms_per_frame": 0.222, "ui_ms_per_frame": 0.059, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.30 / median 2.21 / p95 3.11 ms, render thread avg 1.71 / median 1.70 / p95 1.99 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.42 / median 0.25 / p95 19.22 ms
{"view": "mid lane close (zoom 22)", "frames": 1635, "fps": 163.4, "frame_ms_avg": 6.12, "frame_ms_median": 2.70, "frame_ms_p95": 21.19, "frame_ms_p99": 29.10, "frame_ms_max": 32.90, "frames_over_16_7_ms": 164, "of_them_with_simulation_step": 27, "gc_collections": 8, "simulation_ms_per_frame": 0.037, "views_ms_per_frame": 0.187, "ui_ms_per_frame": 0.042, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 1.78 / median 1.70 / p95 2.49 ms, render thread avg 1.33 / median 1.32 / p95 1.56 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.36 / median 0.46 / p95 19.07 ms
]
}

View file

@ -0,0 +1,15 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"vsync": 0,
"match": "seed 9 from round 2, army held_brunhild x6, speed 1x, measured after 10 s of combat",
// moving units at the start of the first window: w04 11, w06 11, g04 10, g02 9, g06 9, e01 7, w02 7, brunhild 6, g08 4, g10 4, w08 4, w10 3
"windows": [
{"view": "overview (zoom 64)", "frames": 2990, "fps": 149.4, "frame_ms_avg": 6.69, "frame_ms_median": 2.90, "frame_ms_p95": 22.31, "frame_ms_p99": 28.33, "frame_ms_max": 47.03, "frames_over_16_7_ms": 333, "of_them_with_simulation_step": 33, "gc_collections": 20, "simulation_ms_per_frame": 0.061, "views_ms_per_frame": 0.220, "ui_ms_per_frame": 0.058, "units_alive_max": 85},
// timings overview (zoom 64): main thread avg 2.28 / median 2.18 / p95 3.10 ms, render thread avg 1.68 / median 1.67 / p95 1.97 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.40 / median 0.26 / p95 19.90 ms
{"view": "mid lane close (zoom 22)", "frames": 1673, "fps": 167.3, "frame_ms_avg": 5.98, "frame_ms_median": 2.69, "frame_ms_p95": 20.81, "frame_ms_p99": 31.71, "frame_ms_max": 38.50, "frames_over_16_7_ms": 152, "of_them_with_simulation_step": 16, "gc_collections": 8, "simulation_ms_per_frame": 0.036, "views_ms_per_frame": 0.186, "ui_ms_per_frame": 0.039, "units_alive_max": 38}
// timings mid lane close (zoom 22): main thread avg 1.73 / median 1.67 / p95 2.39 ms, render thread avg 1.32 / median 1.31 / p95 1.54 ms, gpu avg 0.00 / median 0.00 / p95 0.00 ms, present wait avg 4.26 / median 0.91 / p95 19.17 ms
]
}

View file

@ -0,0 +1,11 @@
{
"build": "OSXPlayer player, 6000.3.20f1, release",
"device": "Mac17,2; Apple M5; Apple M5",
"graphics_api": "Metal",
"resolution": "1920x1080",
"seconds": 11.6,
"passed": ["Startbildschirm sichtbar", "Partie wartet: Spielcontroller und Treiber aus", "vor dem Start kein HUD", "„Allein spielen“ bedienbar", "Offline: Startbildschirm verborgen", "Offline: Spielcontroller und Treiber laufen", "Offline: HUD sichtbar", "Offline: neue Partie, Sitz 1 (Mid)", "Offline: Planung", "Offline: lokale Sitzung", "„Startaufstellung“ bedienbar", "Startaufstellung gekauft (3 Einheiten)", "„Bereit“ bedienbar", "Bereit: Kampf beginnt", "Kampf: Figuren im Feld", "„Menü“ bedienbar", "Verlassen-Dialog mit „Zum Menü“", "Zurück: Startbildschirm sichtbar", "Zurück: HUD verborgen", "Zurück: Spielcontroller und Treiber aus", "Zurück: Sitzung beendet", "Zurück: keine Figuren im Feld", "Zurück: Kamera ruht", "Zurück: „Allein spielen“ bedienbar", "Zweite Partie: Startbildschirm verborgen, HUD sichtbar", "Zweite Partie: neue Partie in der Planung", "SSAO folgt der Einstellung", "Option „Umgebungsverdeckung“ sichtbar", "Option schaltet SSAO um", "Option stellt SSAO zurück"],
"failed": [],
"photos": ["00-startbildschirm.jpg", "01-planung.jpg", "02-kampf.jpg", "03-verlassen.jpg", "04-zurueck-im-startbildschirm.jpg", "05-zweite-partie.jpg", "06-optionen.jpg"],
"result": "PASS"
}

View file

@ -0,0 +1,471 @@
<?xml version="1.0" encoding="utf-8"?>
<test-run id="2" testcasecount="33" result="Passed" total="33" passed="20" failed="0" inconclusive="0" skipped="13" asserts="0" engine-version="3.5.0.0" clr-version="4.0.30319.42000" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:51:50Z" duration="313.7388335">
<test-suite type="TestSuite" id="1061" name="luneraria-unity" fullname="luneraria-unity" runstate="Runnable" testcasecount="33" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:51:50Z" duration="313.738834" total="33" passed="20" failed="0" inconclusive="0" skipped="13" asserts="0">
<properties>
<property name="platform" value="PlayMode" />
</properties>
<test-suite type="Assembly" id="1046" name="Luneraria.UI.Tests.PlayMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.UI.Tests.PlayMode.dll" runstate="Runnable" testcasecount="31" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:47:07Z" duration="30.547717" total="31" passed="18" failed="0" inconclusive="0" skipped="13" asserts="0">
<properties>
<property name="_PID" value="38117" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="PlayMode" />
<property name="EditorOnly" value="False" />
</properties>
<test-suite type="TestSuite" id="1047" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="31" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:47:07Z" duration="30.547432" total="31" passed="18" failed="0" inconclusive="0" skipped="13" asserts="0">
<properties />
<test-suite type="TestSuite" id="1048" name="UI" fullname="Luneraria.UI" runstate="Runnable" testcasecount="31" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:47:07Z" duration="30.547212" total="31" passed="18" failed="0" inconclusive="0" skipped="13" asserts="0">
<properties />
<test-suite type="TestSuite" id="1049" name="Tests" fullname="Luneraria.UI.Tests" runstate="Runnable" testcasecount="31" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:47:07Z" duration="30.546809" total="31" passed="18" failed="0" inconclusive="0" skipped="13" asserts="0">
<properties />
<test-suite type="TestFixture" id="1001" name="ArmyViewsTests" fullname="Luneraria.UI.Tests.ArmyViewsTests" classname="Luneraria.UI.Tests.ArmyViewsTests" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:46:36Z" duration="0.002862" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1002" name="Glutpakt" fullname="Luneraria.UI.Tests.ArmyViewsTests.Glutpakt" methodname="Glutpakt" classname="Luneraria.UI.Tests.ArmyViewsTests" runstate="Runnable" seed="1410751918" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1003" name="FigureViewsTests" fullname="Luneraria.UI.Tests.FigureViewsTests" classname="Luneraria.UI.Tests.FigureViewsTests" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:46:36Z" duration="0.000074" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1004" name="Kohlenbeisser" fullname="Luneraria.UI.Tests.FigureViewsTests.Kohlenbeisser" methodname="Kohlenbeisser" classname="Luneraria.UI.Tests.FigureViewsTests" runstate="Runnable" seed="1327504255" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1005" name="H1HeroViewsTests" fullname="Luneraria.UI.Tests.H1HeroViewsTests" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:46:39Z" duration="2.687648" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1007" name="SylvaraBilder" fullname="Luneraria.UI.Tests.H1HeroViewsTests.SylvaraBilder" methodname="SylvaraBilder" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Explicit" seed="1513690794" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:46:36Z" duration="0.000180" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1006" name="SylvaraHud" fullname="Luneraria.UI.Tests.H1HeroViewsTests.SylvaraHud" methodname="SylvaraHud" classname="Luneraria.UI.Tests.H1HeroViewsTests" runstate="Runnable" seed="1076625979" result="Passed" start-time="2026-10-11 15:46:36Z" end-time="2026-10-11 15:46:39Z" duration="2.685073" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1008" name="H2HeroViewsTests" fullname="Luneraria.UI.Tests.H2HeroViewsTests" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:39Z" end-time="2026-10-11 15:46:39Z" duration="0.465161" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1010" name="BrunhildBilder" fullname="Luneraria.UI.Tests.H2HeroViewsTests.BrunhildBilder" methodname="BrunhildBilder" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Explicit" seed="1843788356" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:39Z" end-time="2026-10-11 15:46:39Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1009" name="BrunhildHud" fullname="Luneraria.UI.Tests.H2HeroViewsTests.BrunhildHud" methodname="BrunhildHud" classname="Luneraria.UI.Tests.H2HeroViewsTests" runstate="Runnable" seed="500166216" result="Passed" start-time="2026-10-11 15:46:39Z" end-time="2026-10-11 15:46:39Z" duration="0.461230" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1011" name="HudCaptureTests" fullname="Luneraria.UI.Tests.HudCaptureTests" classname="Luneraria.UI.Tests.HudCaptureTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:46:39Z" end-time="2026-10-11 15:46:40Z" duration="0.395429" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1012" name="PlanningHudOverTheScene" fullname="Luneraria.UI.Tests.HudCaptureTests.PlanningHudOverTheScene" methodname="PlanningHudOverTheScene" classname="Luneraria.UI.Tests.HudCaptureTests" runstate="Runnable" seed="156569232" result="Passed" start-time="2026-10-11 15:46:39Z" end-time="2026-10-11 15:46:40Z" duration="0.391472" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_HUD syncs 1 sync ms 0.167 portraits 15 scale 1 size (1706.67, 960.00)
LUNE_HUD region top (x:425.78, y:12.44, width:855.11, height:83.56)
LUNE_HUD region system (x:1559.11, y:12.44, width:136.00, height:35.56)
LUNE_HUD region left (x:12.44, y:12.44, width:312.00, height:466.67)
LUNE_HUD region right (x:1372.44, y:56.00, width:322.67, height:248.00)
LUNE_HUD region bottom (x:12.44, y:761.78, width:1432.00, height:186.67)
LUNE_HUD region ready (x:1455.11, y:616.00, width:240.00, height:84.44)
LUNE_HUD region minimap (x:1455.11, y:708.44, width:240.00, height:240.00)
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1013" name="HudPlaytest" fullname="Luneraria.UI.Tests.HudPlaytest" classname="Luneraria.UI.Tests.HudPlaytest" runstate="Explicit" testcasecount="1" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:46:40Z" end-time="2026-10-11 15:46:40Z" duration="0.000086" total="1" passed="0" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties>
<property name="_SKIPREASON" value="Spieltest: wartet auf Befehlsdateien" />
</properties>
<reason>
<message><![CDATA[Spieltest: wartet auf Befehlsdateien]]></message>
</reason>
<test-case id="1014" name="Play" fullname="Luneraria.UI.Tests.HudPlaytest.Play" methodname="Play" classname="Luneraria.UI.Tests.HudPlaytest" runstate="Runnable" seed="1750787280" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="2147483647" />
</properties>
<reason>
<message><![CDATA[Spieltest: wartet auf Befehlsdateien]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1015" name="HudVerifyTests" fullname="Luneraria.UI.Tests.HudVerifyTests" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" testcasecount="9" result="Passed" start-time="2026-10-11 15:46:40Z" end-time="2026-10-11 15:46:52Z" duration="12.116958" total="9" passed="9" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1016" name="A_Layout" fullname="Luneraria.UI.Tests.HudVerifyTests.A_Layout" methodname="A_Layout" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1474983886" result="Passed" start-time="2026-10-11 15:46:40Z" end-time="2026-10-11 15:46:44Z" duration="4.502641" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY A: 585 checks, 0 failed
]]></output>
</test-case>
<test-case id="1017" name="B_Status" fullname="Luneraria.UI.Tests.HudVerifyTests.B_Status" methodname="B_Status" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="615242257" result="Passed" start-time="2026-10-11 15:46:44Z" end-time="2026-10-11 15:46:44Z" duration="0.417089" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY B: 21 checks, 0 failed
]]></output>
</test-case>
<test-case id="1018" name="C_HeroItemsUnits" fullname="Luneraria.UI.Tests.HudVerifyTests.C_HeroItemsUnits" methodname="C_HeroItemsUnits" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="2115775" result="Passed" start-time="2026-10-11 15:46:44Z" end-time="2026-10-11 15:46:45Z" duration="0.756387" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY C: 23 checks, 0 failed
]]></output>
</test-case>
<test-case id="1019" name="D_ChampionsAndBoss" fullname="Luneraria.UI.Tests.HudVerifyTests.D_ChampionsAndBoss" methodname="D_ChampionsAndBoss" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1226437700" result="Passed" start-time="2026-10-11 15:46:45Z" end-time="2026-10-11 15:46:46Z" duration="0.558635" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY D: 16 checks, 0 failed
]]></output>
</test-case>
<test-case id="1020" name="E_ReadyBotsPrivacy" fullname="Luneraria.UI.Tests.HudVerifyTests.E_ReadyBotsPrivacy" methodname="E_ReadyBotsPrivacy" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1073391563" result="Passed" start-time="2026-10-11 15:46:46Z" end-time="2026-10-11 15:46:47Z" duration="1.411138" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY E: 17 checks, 0 failed
]]></output>
</test-case>
<test-case id="1021" name="F_Input" fullname="Luneraria.UI.Tests.HudVerifyTests.F_Input" methodname="F_Input" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="19796220" result="Passed" start-time="2026-10-11 15:46:47Z" end-time="2026-10-11 15:46:51Z" duration="3.426542" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY F: 18 checks, 0 failed
]]></output>
</test-case>
<test-case id="1022" name="G_EventsAndMotion" fullname="Luneraria.UI.Tests.HudVerifyTests.G_EventsAndMotion" methodname="G_EventsAndMotion" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="2106235626" result="Passed" start-time="2026-10-11 15:46:51Z" end-time="2026-10-11 15:46:51Z" duration="0.537718" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY G: 14 checks, 0 failed
]]></output>
</test-case>
<test-case id="1023" name="H_RatesAndPortraits" fullname="Luneraria.UI.Tests.HudVerifyTests.H_RatesAndPortraits" methodname="H_RatesAndPortraits" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1076750353" result="Passed" start-time="2026-10-11 15:46:51Z" end-time="2026-10-11 15:46:51Z" duration="0.202539" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY rates planning 18/2s combat 10/2s sync 0.221 ms portraits 16
LUNE_VERIFY H: 5 checks, 0 failed
]]></output>
</test-case>
<test-case id="1024" name="I_Field" fullname="Luneraria.UI.Tests.HudVerifyTests.I_Field" methodname="I_Field" classname="Luneraria.UI.Tests.HudVerifyTests" runstate="Runnable" seed="1119995107" result="Passed" start-time="2026-10-11 15:46:51Z" end-time="2026-10-11 15:46:52Z" duration="0.300928" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="900000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_VERIFY I: 19 checks, 0 failed
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1025" name="HudViewsTests" fullname="Luneraria.UI.Tests.HudViewsTests" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Explicit" testcasecount="4" result="Skipped" label="Explicit" site="SetUp" start-time="2026-10-11 15:46:52Z" end-time="2026-10-11 15:46:52Z" duration="0.000216" total="4" passed="0" failed="0" inconclusive="0" skipped="4" asserts="0">
<properties>
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
<test-case id="1028" name="Motifs_1280x720" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_1280x720" methodname="Motifs_1280x720" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="481465809" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1026" name="Motifs_1920x1080" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_1920x1080" methodname="Motifs_1920x1080" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="712636040" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1029" name="Motifs_2560x1080" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_2560x1080" methodname="Motifs_2560x1080" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="1149282381" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1027" name="Motifs_2560x1440" fullname="Luneraria.UI.Tests.HudViewsTests.Motifs_2560x1440" methodname="Motifs_2560x1440" classname="Luneraria.UI.Tests.HudViewsTests" runstate="Runnable" seed="1710397216" result="Skipped" label="Explicit" site="Parent" start-time="0001-01-01 00:00:00Z" end-time="0001-01-01 00:00:00Z" duration="0.000000" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="1800000" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1030" name="S1RulesViewsTests" fullname="Luneraria.UI.Tests.S1RulesViewsTests" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:52Z" end-time="2026-10-11 15:46:53Z" duration="1.665708" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1032" name="S1Bilder" fullname="Luneraria.UI.Tests.S1RulesViewsTests.S1Bilder" methodname="S1Bilder" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Explicit" seed="1307412873" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:52Z" end-time="2026-10-11 15:46:52Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1031" name="S1Hud" fullname="Luneraria.UI.Tests.S1RulesViewsTests.S1Hud" methodname="S1Hud" classname="Luneraria.UI.Tests.S1RulesViewsTests" runstate="Runnable" seed="1524292985" result="Passed" start-time="2026-10-11 15:46:52Z" end-time="2026-10-11 15:46:53Z" duration="1.663693" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1033" name="S2RulesViewsTests" fullname="Luneraria.UI.Tests.S2RulesViewsTests" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:53Z" end-time="2026-10-11 15:46:54Z" duration="0.321237" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1035" name="S2Bilder" fullname="Luneraria.UI.Tests.S2RulesViewsTests.S2Bilder" methodname="S2Bilder" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Explicit" seed="1661918112" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:53Z" end-time="2026-10-11 15:46:53Z" duration="0.000003" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1034" name="S2Hud" fullname="Luneraria.UI.Tests.S2RulesViewsTests.S2Hud" methodname="S2Hud" classname="Luneraria.UI.Tests.S2RulesViewsTests" runstate="Runnable" seed="803820144" result="Passed" start-time="2026-10-11 15:46:53Z" end-time="2026-10-11 15:46:54Z" duration="0.317082" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1036" name="S3RulesViewsTests" fullname="Luneraria.UI.Tests.S3RulesViewsTests" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:54Z" end-time="2026-10-11 15:46:55Z" duration="1.552592" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1038" name="S3Bilder" fullname="Luneraria.UI.Tests.S3RulesViewsTests.S3Bilder" methodname="S3Bilder" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Explicit" seed="958100196" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:54Z" end-time="2026-10-11 15:46:54Z" duration="0.000001" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1037" name="S3Hud" fullname="Luneraria.UI.Tests.S3RulesViewsTests.S3Hud" methodname="S3Hud" classname="Luneraria.UI.Tests.S3RulesViewsTests" runstate="Runnable" seed="910466762" result="Passed" start-time="2026-10-11 15:46:54Z" end-time="2026-10-11 15:46:55Z" duration="1.548971" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1039" name="S4PolishViewsTests" fullname="Luneraria.UI.Tests.S4PolishViewsTests" classname="Luneraria.UI.Tests.S4PolishViewsTests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:46:55Z" end-time="2026-10-11 15:46:56Z" duration="0.558907" total="2" passed="1" failed="0" inconclusive="0" skipped="1" asserts="0">
<properties />
<test-case id="1041" name="S4Bilder" fullname="Luneraria.UI.Tests.S4PolishViewsTests.S4Bilder" methodname="S4Bilder" classname="Luneraria.UI.Tests.S4PolishViewsTests" runstate="Explicit" seed="927200824" result="Skipped" label="Explicit" start-time="2026-10-11 15:46:55Z" end-time="2026-10-11 15:46:55Z" duration="0.000002" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="_SKIPREASON" value="Bildwerkzeug: nur gezielt per -testFilter" />
</properties>
<reason>
<message><![CDATA[Bildwerkzeug: nur gezielt per -testFilter]]></message>
</reason>
</test-case>
<test-case id="1040" name="S4Views" fullname="Luneraria.UI.Tests.S4PolishViewsTests.S4Views" methodname="S4Views" classname="Luneraria.UI.Tests.S4PolishViewsTests" runstate="Runnable" seed="349829057" result="Passed" start-time="2026-10-11 15:46:55Z" end-time="2026-10-11 15:46:56Z" duration="0.557132" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1042" name="StartScreenTests" fullname="Luneraria.UI.Tests.StartScreenTests" classname="Luneraria.UI.Tests.StartScreenTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:46:56Z" end-time="2026-10-11 15:47:06Z" duration="10.705268" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1043" name="StartScreenLeadsIntoTheMatchAndBack" fullname="Luneraria.UI.Tests.StartScreenTests.StartScreenLeadsIntoTheMatchAndBack" methodname="StartScreenLeadsIntoTheMatchAndBack" classname="Luneraria.UI.Tests.StartScreenTests" runstate="Runnable" seed="1636570169" result="Passed" start-time="2026-10-11 15:46:56Z" end-time="2026-10-11 15:47:06Z" duration="10.703321" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="300000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SMOKE ok Startbildschirm sichtbar
LUNE_SMOKE ok Partie wartet: Spielcontroller und Treiber aus
LUNE_SMOKE ok vor dem Start kein HUD
LUNE_SMOKE ok „Allein spielen“ bedienbar
LUNE_SMOKE ok Offline: Startbildschirm verborgen
LUNE_SMOKE ok Offline: Spielcontroller und Treiber laufen
LUNE_SMOKE ok Offline: HUD sichtbar
LUNE_SMOKE ok Offline: neue Partie, Sitz 1 (Mid)
LUNE_SMOKE ok Offline: Planung
LUNE_SMOKE ok Offline: lokale Sitzung
LUNE_SMOKE ok „Startaufstellung“ bedienbar
LUNE_SMOKE ok Startaufstellung gekauft (3 Einheiten)
LUNE_SMOKE ok „Bereit“ bedienbar
LUNE_SMOKE ok Bereit: Kampf beginnt
LUNE_SMOKE ok Kampf: Figuren im Feld
LUNE_SMOKE ok „Menü“ bedienbar
LUNE_SMOKE ok Verlassen-Dialog mit „Zum Menü“
LUNE_SMOKE ok Zurück: Startbildschirm sichtbar
LUNE_SMOKE ok Zurück: HUD verborgen
LUNE_SMOKE ok Zurück: Spielcontroller und Treiber aus
LUNE_SMOKE ok Zurück: Sitzung beendet
LUNE_SMOKE ok Zurück: keine Figuren im Feld
LUNE_SMOKE ok Zurück: Kamera ruht
LUNE_SMOKE ok Zurück: „Allein spielen“ bedienbar
LUNE_SMOKE ok Zweite Partie: Startbildschirm verborgen, HUD sichtbar
LUNE_SMOKE ok Zweite Partie: neue Partie in der Planung
LUNE_SMOKE_PASS 26 ok, 0 Fehler
LUNE_START_SCREEN 26 checks passed
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1044" name="UiToolkitProbeTests" fullname="Luneraria.UI.Tests.UiToolkitProbeTests" classname="Luneraria.UI.Tests.UiToolkitProbeTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:47:06Z" end-time="2026-10-11 15:47:07Z" duration="0.073319" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1045" name="PanelRendersIntoTexture" fullname="Luneraria.UI.Tests.UiToolkitProbeTests.PanelRendersIntoTexture" methodname="PanelRendersIntoTexture" classname="Luneraria.UI.Tests.UiToolkitProbeTests" runstate="Runnable" seed="1446584506" result="Passed" start-time="2026-10-11 15:47:06Z" end-time="2026-10-11 15:47:07Z" duration="0.072836" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SPIKE corner RGBA(0.565, 0.635, 0.506, 1.000) panel RGBA(0.196, 0.227, 0.204, 1.000) layout (x:12.44, y:12.44, width:760.00, height:530.67)
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
<test-suite type="Assembly" id="1054" name="Luneraria.View.Tests.PlayMode.dll" fullname="/private/tmp/lune-konzept/Library/ScriptAssemblies/Luneraria.View.Tests.PlayMode.dll" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:51:50Z" duration="283.187951" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties>
<property name="_PID" value="38117" />
<property name="_APPDOMAIN" value="Unity Child Domain" />
<property name="platform" value="PlayMode" />
<property name="EditorOnly" value="False" />
</properties>
<test-suite type="TestSuite" id="1055" name="Luneraria" fullname="Luneraria" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:51:50Z" duration="283.187234" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1056" name="View" fullname="Luneraria.View" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:51:50Z" duration="283.187042" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestSuite" id="1057" name="Tests" fullname="Luneraria.View.Tests" runstate="Runnable" testcasecount="2" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:51:50Z" duration="283.186772" total="2" passed="2" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-suite type="TestFixture" id="1050" name="SceneFrameRateTests" fullname="Luneraria.View.Tests.SceneFrameRateTests" classname="Luneraria.View.Tests.SceneFrameRateTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:48:57Z" duration="110.620354" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1051" name="SceneMatchIsTheSameAtRealFrameRates" fullname="Luneraria.View.Tests.SceneFrameRateTests.SceneMatchIsTheSameAtRealFrameRates" methodname="SceneMatchIsTheSameAtRealFrameRates" classname="Luneraria.View.Tests.SceneFrameRateTests" runstate="Runnable" seed="1733368402" result="Passed" start-time="2026-10-11 15:47:07Z" end-time="2026-10-11 15:48:57Z" duration="110.618331" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_SCENE_FPS 30 fps: 815 frames in 27.1 s = 30.0 fps, up to 19 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS 60 fps: 1626 frames in 27.1 s = 60.0 fps, up to 11 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS 120 fps: 3222 frames in 26.9 s = 119.7 fps, up to 10 steps per frame, hash DCE95C96556F3A1A, same=True
LUNE_SCENE_FPS unlimited: 84176 frames in 26.8 s = 3138.1 fps, up to 8 steps per frame, hash DCE95C96556F3A1A, same=True
]]></output>
</test-case>
</test-suite>
<test-suite type="TestFixture" id="1052" name="VerticalFunctionTests" fullname="Luneraria.View.Tests.VerticalFunctionTests" classname="Luneraria.View.Tests.VerticalFunctionTests" runstate="Runnable" testcasecount="1" result="Passed" start-time="2026-10-11 15:48:57Z" end-time="2026-10-11 15:51:50Z" duration="172.566075" total="1" passed="1" failed="0" inconclusive="0" skipped="0" asserts="0">
<properties />
<test-case id="1053" name="BotMatchesRunVisiblyAndMatchTheCore" fullname="Luneraria.View.Tests.VerticalFunctionTests.BotMatchesRunVisiblyAndMatchTheCore" methodname="BotMatchesRunVisiblyAndMatchTheCore" classname="Luneraria.View.Tests.VerticalFunctionTests" runstate="Runnable" seed="748549110" result="Passed" start-time="2026-10-11 15:48:57Z" end-time="2026-10-11 15:51:50Z" duration="172.561288" asserts="0">
<properties>
<property name="_JOINTYPE" value="UnityCombinatorial" />
<property name="Timeout" value="3600000" />
<property name="retryIteration" value="0" />
<property name="repeatIteration" value="0" />
</properties>
<output><![CDATA[LUNE_U2D shot 01-runde1-aufmarsch round 1 Combat
LUNE_U2D shot 02-runde1-mid-kampf round 1 Combat
LUNE_U2D shot 03-turm-faellt round 7 Combat
LUNE_U2D shot 04-turm-ruine round 7 Combat
LUNE_U2D shot 05-grotte-bosskampf round 8 Combat
LUNE_U2D shot 06-held-kaempft round 9 Combat
LUNE_U2D shot 07-boss-auf-der-lane round 9 Combat
LUNE_U2D shot 08-ancient-faellt round 9 Over
LUNE_U2D shot 09-ancient-ruine round 9 Over
LUNE_U2D shot 10-ende-uebersicht round 9 Over
LUNE_U2D shot 11-welle21-uebersicht round 21 Combat
LUNE_U2D shot 12-welle21-kampf round 21 Combat
LUNE_U2D shot 13-ancient-rot-faellt round 22 Over
LUNE_U2D shot 14-welle-ende round 22 Over
Saving results to: /Users/martin/Library/Application Support/DefaultCompany/luneraria-unity/TestResults.xml
]]></output>
</test-case>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-suite>
</test-run>

View file

@ -0,0 +1,11 @@
{
"match": "seed 2, bots, speed 24x",
"core_hash": "DCE95C96556F3A1A",
"core_steps": 12690,
"runs": [
{"target": "30 fps", "frames": 815, "seconds": 27.142, "measured_fps": 30.027, "max_steps_per_frame": 19, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "60 fps", "frames": 1626, "seconds": 27.12, "measured_fps": 59.956, "max_steps_per_frame": 11, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "120 fps", "frames": 3222, "seconds": 26.91, "measured_fps": 119.733, "max_steps_per_frame": 10, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
{"target": "unlimited", "frames": 84176, "seconds": 26.824, "measured_fps": 3138.057, "max_steps_per_frame": 8, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true}
]
}

View file

@ -0,0 +1,16 @@
{
"runs": [
{"label": "match-seed2", "seed": 2, "start_round": 1, "extra_gold": 0, "speed": 6, "winner": 1, "end_note": "Ancient von Blau zerstört.", "steps": 12690, "hash": "DCE95C96556F3A1A", "core_hash": "DCE95C96556F3A1A", "same_as_core": true,
"units_alive_max": 84, "heroes_alive_max": 4, "boss_log": ["round 8: won team 1 ", "round 9: deployed team 1 bot"],
"rounds": [{"round": 1, "combat_seconds": 44.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 2, "combat_seconds": 57.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 3, "combat_seconds": 54.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 4, "combat_seconds": 62.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 5, "combat_seconds": 60.7, "lost": [], "boss": "none", "end": "cleared"}, {"round": 6, "combat_seconds": 62.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 7, "combat_seconds": 66.5, "lost": ["blau_bot_outer"], "boss": "none", "end": "cleared"}, {"round": 8, "combat_seconds": 89.65, "lost": ["rot_top_outer", "rot_top_inner"], "boss": "won", "end": "cleared"}, {"round": 9, "combat_seconds": 136.55, "lost": ["blau_bot_inner", "blau_base_2", "blau_base_1", "blau_ancient"], "boss": "deployed", "end": "core"}],
"events": ["round 7: blau_bot_outer destroyed", "round 8: rot_top_outer destroyed", "round 8: rot_top_inner destroyed", "round 8: grotto boss won", "round 9: blau_bot_inner destroyed", "round 9: blau_base_2 destroyed", "round 9: blau_base_1 destroyed", "round 9: blau_ancient destroyed", "round 9: grotto boss deployed"],
"shots": ["01-runde1-aufmarsch", "02-runde1-mid-kampf", "03-turm-faellt", "04-turm-ruine", "05-grotte-bosskampf", "06-held-kaempft", "07-boss-auf-der-lane", "08-ancient-faellt", "09-ancient-ruine", "10-ende-uebersicht"],
"performance": null},
{"label": "match-seed9-round21", "seed": 9, "start_round": 21, "extra_gold": 4000, "speed": 6, "winner": 0, "end_note": "Ancient von Rot zerstört.", "steps": 4195, "hash": "7B8E43AEFC0D60C5", "core_hash": "7B8E43AEFC0D60C5", "same_as_core": true,
"units_alive_max": 125, "heroes_alive_max": 6, "boss_log": [],
"rounds": [{"round": 21, "combat_seconds": 121.8, "lost": ["rot_mid_outer", "rot_top_outer", "rot_mid_inner"], "boss": "none", "end": "cleared"}, {"round": 22, "combat_seconds": 87.95, "lost": ["rot_top_inner", "rot_base_1", "blau_bot_outer", "rot_base_2", "rot_ancient"], "boss": "none", "end": "core"}],
"events": ["round 21: rot_mid_outer destroyed", "round 21: rot_top_outer destroyed", "round 21: rot_mid_inner destroyed", "round 22: rot_top_inner destroyed", "round 22: rot_base_1 destroyed", "round 22: blau_bot_outer destroyed", "round 22: rot_base_2 destroyed", "round 22: rot_ancient destroyed"],
"shots": ["11-welle21-uebersicht", "12-welle21-kampf", "13-ancient-rot-faellt", "14-welle-ende"],
"performance": {"window": "20 s real time at 1x speed, unlimited frame rate, round 21", "frames": 48567, "fps": 2428.338, "frame_ms_avg": 0.412, "frame_ms_p95": 0.414, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.147, "units_alive_max": 116}}
]
}

View file

@ -1296,6 +1296,199 @@
] ]
} }
}, },
{
"id": "brunhild",
"kind": "skinned",
"ok": true,
"checks": [
{
"check": "blender_checks_passed",
"ok": true,
"detail": ""
},
{
"check": "imported",
"ok": true,
"detail": "\"Assets/Luneraria/Art/Characters/brunhild.fbx\""
},
{
"check": "import_rules_applied",
"ok": true,
"detail": ""
},
{
"check": "root_transform_identity",
"ok": true,
"detail": "\"brunhild pos (0.0000, 0.0000, 0.0000) rot (0.00, 0.00, 0.00) scale (1.0000, 1.0000, 1.0000)\""
},
{
"check": "node_transforms_axis_clean",
"ok": true,
"detail": "[]"
},
{
"check": "mesh_names",
"ok": true,
"detail": "[]"
},
{
"check": "triangles",
"ok": true,
"detail": "\"28706 unity / 28706 blender \""
},
{
"check": "material_slots",
"ok": true,
"detail": "[]"
},
{
"check": "normals_unit_length",
"ok": true,
"detail": "[]"
},
{
"check": "tangents_where_uv",
"ok": true,
"detail": "[]"
},
{
"check": "uvs_where_blender_has_uv",
"ok": true,
"detail": "[]"
},
{
"check": "vertex_colors",
"ok": true,
"detail": "[]"
},
{
"check": "bounds_axes_scale",
"ok": true,
"detail": "\"largest difference 0.00005 m; unity (-0.448, 0.000, -0.638) (0.509, 1.801, 1.293)\""
},
{
"check": "skinned_mesh",
"ok": true,
"detail": "4"
},
{
"check": "bone_names BrunhildBody_LOD0",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone BrunhildBody_LOD0",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names BrunhildBody_LOD1",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone BrunhildBody_LOD1",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names BrunhildSpeer_LOD0",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone BrunhildSpeer_LOD0",
"ok": true,
"detail": "\"Root\""
},
{
"check": "bone_names BrunhildSpeer_LOD1",
"ok": true,
"detail": "[]"
},
{
"check": "root_bone BrunhildSpeer_LOD1",
"ok": true,
"detail": "\"Root\""
},
{
"check": "generic_avatar",
"ok": true,
"detail": "\"brunhildAvatar\""
},
{
"check": "clips",
"ok": true,
"detail": "[]"
}
],
"facts": {
"triangles": 28706,
"renderers": 4,
"meshes_without_uv_and_tangents": 0,
"degenerate_triangles_dropped": 0,
"bounds_min": [
-0.447806716,
2.66768126E-07,
-0.637885153
],
"bounds_max": [
0.5085536,
1.80075514,
1.29309094
],
"clips": [
{
"name": "ability",
"length": 1.0,
"loop": false,
"events": 1
},
{
"name": "attack_a",
"length": 0.9583333,
"loop": false,
"events": 1
},
{
"name": "attack_b",
"length": 1.0,
"loop": false,
"events": 1
},
{
"name": "death",
"length": 2.41666675,
"loop": false,
"events": 0
},
{
"name": "hit",
"length": 0.5,
"loop": false,
"events": 0
},
{
"name": "idle",
"length": 4.0,
"loop": true,
"events": 0
},
{
"name": "ultimate",
"length": 1.29166663,
"loop": false,
"events": 1
},
{
"name": "walk",
"length": 1.29166663,
"loop": true,
"events": 0
}
]
}
},
{ {
"id": "funkenlanze", "id": "funkenlanze",
"kind": "skinned", "kind": "skinned",

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

Some files were not shown because too many files have changed in this diff Show more