Compare commits

..

No commits in common. "main" and "luneraria/h1-sylvara" have entirely different histories.

451 changed files with 62052 additions and 77493 deletions

View file

@ -265,11 +265,11 @@
"props": [] "props": []
}, },
"inputs_sha256": { "inputs_sha256": {
"tools/meshy/g07/figure.json": "b33bf1f6580bc1d683354f04956442869727699e01c7456cfc8fdcfc879a9f42", "tools/meshy/g07/figure.json": "6d7066a42c7c4b71ad6f7bb7569311cc7210156fde9a7fadc0eddc5bd6a00c7f",
"assets-source/meshy/g07/aschenwerfer-skelett.glb": "d9b311fdc33d18df89dcdd3a88be879079ac40d48f9e14d8ded90ed4c532be7f", "assets-source/meshy/g07/aschenwerfer-skelett.glb": "d9b311fdc33d18df89dcdd3a88be879079ac40d48f9e14d8ded90ed4c532be7f",
"assets-source/meshy/g07/aschenwerfer-animationen.glb": "6211206d4df5bfc3dee511cca1a92f31a8a19a23986265d30f169339589f7e11" "assets-source/meshy/g07/aschenwerfer-animationen.glb": "6211206d4df5bfc3dee511cca1a92f31a8a19a23986265d30f169339589f7e11"
}, },
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3", "source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
"removed_modifiers": 0, "removed_modifiers": 0,
"kind": "skinned", "kind": "skinned",
"fps": 24.0, "fps": 24.0,
@ -486,6 +486,6 @@
"meshes_without_uv": [], "meshes_without_uv": [],
"triangles": 25282, "triangles": 25282,
"fbx": "Assets/Luneraria/Art/Characters/aschenwerfer.fbx", "fbx": "Assets/Luneraria/Art/Characters/aschenwerfer.fbx",
"fbx_bytes": 3232540, "fbx_bytes": 3234540,
"ok": true "ok": true
} }

View file

@ -1,491 +0,0 @@
{
"id": "basaltbastion_meshy",
"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": "['Basaltbastion_meshyBody_LOD0', 'Basaltbastion_meshyBody_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": "25178 fbx / 25178 godot"
},
{
"check": "one_armature",
"ok": true,
"detail": "['Basaltbastion_meshyRig']"
},
{
"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": "25178 / 25178"
},
{
"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', 'walk']"
}
],
"generator": {
"clips": {
"idle": {
"source": "Idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
"walk": {
"source": "Slow_Orc_Walk",
"frames": [
0.0,
132.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
},
"attack_a": {
"source": "Right_Hand_Sword_Slash",
"frames": [
0,
36
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
"attack_b": {
"source": "Punch_Forward_with_Both_Fists",
"frames": [
18,
56
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.4737
},
"hit": {
"source": "Hit_Reaction",
"frames": [
0,
12
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
"ability": {
"source": "Charged_Ground_Slam",
"frames": [
6,
64
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.7292
},
"death": {
"source": "dying_backwards",
"frames": [
0.0,
52.80000305175781
],
"seconds": 2.2083,
"loop": false,
"contact_seconds": -1.0
}
},
"textures": {
"glow_share": 0.0099,
"palette_gains": {
"rock": [
0.7852,
0.8903,
1.0126
],
"metal": [
1.8682,
1.5742,
0.7485
]
},
"size": [
2048,
2048
]
},
"unit": 0.009999999776482582,
"lod": {
"lod0_triangles": 20185,
"lod1_triangles": 4993,
"lod1_vertices": 2485,
"welded_triangles": 20185,
"lod0_screen": 0.2
},
"props": []
},
"inputs_sha256": {
"tools/meshy/g04/figure.json": "892798e08fced79757056488cf500ddf03f64582987a3e1e64addb9e2c90abbf",
"assets-source/meshy/g04/basaltbastion-skelett.glb": "b11b840bfae8bd157c1155945d4964ca31f7c36fc3043c2442c28e8ffc1f4807",
"assets-source/meshy/g04/basaltbastion-animationen.glb": "5e3dc878f1ac1de23f25cedf5e694f4f60a10929bebec6b0e38f6b86f8c79cfa"
},
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
"removed_modifiers": 0,
"kind": "skinned",
"fps": 24.0,
"objects": 3,
"meshes": {
"Basaltbastion_meshyBody_LOD0": {
"mesh": "Basaltbastion_meshyBody_LOD0",
"triangles": 20185,
"vertices": 28837,
"ngons": 0,
"materials": [
"AI_Basaltbastion"
],
"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": [
-1.003,
0.0,
-0.4388
],
"max": [
1.003,
1.764,
0.4388
]
}
},
"Basaltbastion_meshyBody_LOD1": {
"mesh": "Basaltbastion_meshyBody_LOD1",
"triangles": 4993,
"vertices": 2485,
"ngons": 0,
"materials": [
"AI_Basaltbastion"
],
"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": [
-1.0001,
-0.0,
-0.4387
],
"max": [
1.0016,
1.7637,
0.4402
]
}
}
},
"armatures": {
"Basaltbastion_meshyRig": {
"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": [
-1.003,
-0.0,
-0.4388
],
"max": [
1.003,
1.764,
0.4402
]
},
"clips": [
{
"name": "ability",
"frames": [
0.0,
29.0
],
"seconds": 1.2083,
"loop": false,
"contact_seconds": 0.7292
},
{
"name": "attack_a",
"frames": [
0.0,
25.0
],
"seconds": 1.0417,
"loop": false,
"contact_seconds": 0.4051
},
{
"name": "attack_b",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.4737
},
{
"name": "death",
"frames": [
0.0,
53.0
],
"seconds": 2.2083,
"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": "walk",
"frames": [
0.0,
67.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
}
],
"expected_from_godot": {
"triangles": 25178,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
},
"meshes_with_ngons": {},
"meshes_without_uv": [],
"triangles": 25178,
"fbx": "Assets/Luneraria/Art/Characters/basaltbastion_meshy.fbx",
"fbx_bytes": 3435820,
"ok": true
}

View file

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

View file

@ -1,337 +0,0 @@
fileFormatVersion: 2
guid: aa5734da897ea44808385f37d34070bf
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: Basaltbastion_meshyRig|ability
internalID: -5495293919160781032
firstFrame: 0
lastFrame: 29
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.6034925
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: Basaltbastion_meshyRig|attack_a
internalID: 1565449223295100875
firstFrame: 0
lastFrame: 25
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.38888356
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: Basaltbastion_meshyRig|attack_b
internalID: 3972096498202774343
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.4737
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: Basaltbastion_meshyRig|death
internalID: -4724392375424077161
firstFrame: 0
lastFrame: 53
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: Basaltbastion_meshyRig|hit
internalID: -4714297317412057206
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: Basaltbastion_meshyRig|idle
internalID: 9093657477581702130
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: walk
takeName: Basaltbastion_meshyRig|walk
internalID: -1455650782467671261
firstFrame: 0
lastFrame: 67
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

@ -1,596 +0,0 @@
{
"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

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

View file

@ -1,373 +0,0 @@
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

@ -169,32 +169,32 @@
"height": 1.3865, "height": 1.3865,
"leg_x": 0.4311, "leg_x": 0.4311,
"weapon_z": 1.1316, "weapon_z": 1.1316,
"tip_y": -0.9734, "tip_y": -1.2943,
"back_y": 0.9266, "back_y": 1.232,
"bow_x": 0.9306, "bow_x": 0.9306,
"bow_y": 0.0685 "bow_y": 0.0911
}, },
"rig_scale": 0.9671, "rig_scale": 0.9671,
"weights": { "weights": {
"Pelvis": 4782, "Pelvis": 3922,
"Spine": 1616, "Spine": 1159,
"Weapon": 7790, "Weapon": 9305,
"Gear": 957, "Gear": 823,
"Draw": 0, "Draw": 0,
"Bolt": 0, "Bolt": 0,
"Quarrel": 227, "Quarrel": 284,
"Limb.L": 325, "Limb.L": 221,
"LimbTip.L": 387, "LimbTip.L": 397,
"Limb.R": 249, "Limb.R": 190,
"LimbTip.R": 417, "LimbTip.R": 428,
"Thigh.L": 2435, "Thigh.L": 2413,
"Shin.L": 1968, "Shin.L": 2104,
"Tarsus.L": 759, "Tarsus.L": 598,
"Foot.L": 588, "Foot.L": 647,
"Thigh.R": 2309, "Thigh.R": 2289,
"Shin.R": 1993, "Shin.R": 2128,
"Tarsus.R": 873, "Tarsus.R": 709,
"Foot.R": 591 "Foot.R": 649
}, },
"clips": { "clips": {
"ability": { "ability": {
@ -261,12 +261,12 @@
} }
}, },
"inputs_sha256": { "inputs_sha256": {
"tools/meshy/build_figure.py": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3", "tools/meshy/build_figure.py": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
"tools/meshy/g06/figure.json": "00719cd095645ea43c939560bd946d9ff688dfc7f6f2ac9de3b84e4c57736993", "tools/meshy/g06/figure.json": "157eeb4a1737ba23381fdf7665b73756b6a7427b02fe8074a1e15d206d15c81e",
"assets-source/meshy/g06/glasballiste-modell.glb": "1e7efc1943c3c622e122f68d9dc954c3ae262a13eed66fecf1c8b26d97bcbb5a", "assets-source/meshy/g06/glasballiste-modell.glb": "1e7efc1943c3c622e122f68d9dc954c3ae262a13eed66fecf1c8b26d97bcbb5a",
"assets-source/meshy/g06/glasballiste-rig-phase19.blend": "3fae885ac47e031fc6cadd6fb5010774405548eca9a5d96e7e1a4859e7f7d590" "assets-source/meshy/g06/glasballiste-rig-phase19.blend": "3fae885ac47e031fc6cadd6fb5010774405548eca9a5d96e7e1a4859e7f7d590"
}, },
"source_sha256": "ff14c7425b5099b580fbd66aedc4d983d6433679f495092006d358c30e9b6123", "source_sha256": "e67cdc167c162edddaa8e7d03f92e4574bf1c04ff0bbc60727ca49691e4d0b80",
"removed_modifiers": 0, "removed_modifiers": 0,
"kind": "skinned", "kind": "skinned",
"fps": 24.0, "fps": 24.0,
@ -300,12 +300,12 @@
"min": [ "min": [
-0.9194, -0.9194,
0.0, 0.0,
-0.9266 -1.232
], ],
"max": [ "max": [
0.9306, 0.9306,
1.3865, 1.3865,
0.9734 1.2943
] ]
} }
}, },
@ -335,14 +335,14 @@
], ],
"bounds_unity": { "bounds_unity": {
"min": [ "min": [
-0.9116, -0.9115,
-0.0002, -0.0,
-0.9272 -1.2321
], ],
"max": [ "max": [
0.92, 0.9199,
1.389, 1.389,
0.9769 1.2979
] ]
} }
} }
@ -380,13 +380,13 @@
"bounds_unity": { "bounds_unity": {
"min": [ "min": [
-0.9194, -0.9194,
-0.0002, -0.0,
-0.9272 -1.2321
], ],
"max": [ "max": [
0.9306, 0.9306,
1.389, 1.389,
0.9769 1.2979
] ]
}, },
"clips": [ "clips": [
@ -478,6 +478,6 @@
"meshes_without_uv": [], "meshes_without_uv": [],
"triangles": 25392, "triangles": 25392,
"fbx": "Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx", "fbx": "Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx",
"fbx_bytes": 2784988, "fbx_bytes": 2783260,
"ok": true "ok": true
} }

View file

@ -260,11 +260,11 @@
"props": [] "props": []
}, },
"inputs_sha256": { "inputs_sha256": {
"tools/meshy/g09/figure.json": "422b877a0bdea26ef5686a13501e79137bc54ed0769e1c05ccd1fc1e6f551c8e", "tools/meshy/g09/figure.json": "b8fbf09467fb1a5bb4d21f460e3fb461036b271ef572b2763f2f83de95ed00a4",
"assets-source/meshy/g09/herdhueter-skelett.glb": "713603b1de0beb153981506678d6715307b5b251e9354fbcda2658a86660c0c4", "assets-source/meshy/g09/herdhueter-skelett.glb": "713603b1de0beb153981506678d6715307b5b251e9354fbcda2658a86660c0c4",
"assets-source/meshy/g09/herdhueter-animationen.glb": "c7a5c7338c29a2eb316fe650ca3b708ea533c8d84c07f9fa9d865351eefcce6b" "assets-source/meshy/g09/herdhueter-animationen.glb": "c7a5c7338c29a2eb316fe650ca3b708ea533c8d84c07f9fa9d865351eefcce6b"
}, },
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3", "source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
"removed_modifiers": 0, "removed_modifiers": 0,
"kind": "skinned", "kind": "skinned",
"fps": 24.0, "fps": 24.0,
@ -481,6 +481,6 @@
"meshes_without_uv": [], "meshes_without_uv": [],
"triangles": 25139, "triangles": 25139,
"fbx": "Assets/Luneraria/Art/Characters/herdhueter.fbx", "fbx": "Assets/Luneraria/Art/Characters/herdhueter.fbx",
"fbx_bytes": 3166988, "fbx_bytes": 3170028,
"ok": true "ok": true
} }

View file

@ -265,11 +265,11 @@
"props": [] "props": []
}, },
"inputs_sha256": { "inputs_sha256": {
"tools/meshy/g08/figure.json": "fa9ab63b81d91063a41be5bfd06e8b3fbcef2fc38b06ff65eee5da6e495189f7", "tools/meshy/g08/figure.json": "dcc6a39adf61d5815555a7abc2f99e3da6b493a0e47c65e21bf1d2e8553b961b",
"assets-source/meshy/g08/kraterrufer-skelett.glb": "b2bd4f91696195b1afeb8a8d7b6fe777eb59785257100654f56fb71e4936923f", "assets-source/meshy/g08/kraterrufer-skelett.glb": "b2bd4f91696195b1afeb8a8d7b6fe777eb59785257100654f56fb71e4936923f",
"assets-source/meshy/g08/kraterrufer-animationen.glb": "cb303a4a5023804e81c28af464cbcb69bb22171ece826c3b5d84023452a085b8" "assets-source/meshy/g08/kraterrufer-animationen.glb": "cb303a4a5023804e81c28af464cbcb69bb22171ece826c3b5d84023452a085b8"
}, },
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3", "source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
"removed_modifiers": 0, "removed_modifiers": 0,
"kind": "skinned", "kind": "skinned",
"fps": 24.0, "fps": 24.0,
@ -486,6 +486,6 @@
"meshes_without_uv": [], "meshes_without_uv": [],
"triangles": 25500, "triangles": 25500,
"fbx": "Assets/Luneraria/Art/Characters/kraterrufer.fbx", "fbx": "Assets/Luneraria/Art/Characters/kraterrufer.fbx",
"fbx_bytes": 3337532, "fbx_bytes": 3339692,
"ok": true "ok": true
} }

View file

@ -261,15 +261,14 @@
"lod1_vertices": 2505, "lod1_vertices": 2505,
"welded_triangles": 20145, "welded_triangles": 20145,
"lod0_screen": 0.2 "lod0_screen": 0.2
}, }
"props": []
}, },
"inputs_sha256": { "inputs_sha256": {
"tools/meshy/g03/figure.json": "e42f13c9f70259afabc6cae4a4517b7ed5921b12639e3d52119136204de11a58", "tools/meshy/g03/figure.json": "6934efc31f06faeafa189ba5f399b66d1c6662871aa9fce0e6b6c44a1add9dd8",
"assets-source/meshy/g03/schlackenwacht-skelett.glb": "0c6477bdcb262c36b5df2d7de1580742ea2dc6f51aa7259ef4273c97f9bb7b29", "assets-source/meshy/g03/schlackenwacht-skelett.glb": "0c6477bdcb262c36b5df2d7de1580742ea2dc6f51aa7259ef4273c97f9bb7b29",
"assets-source/meshy/g03/schlackenwacht-animationen.glb": "fdde8ad1b5ef713d4df1beb2c307054e1c83eaf552c8ddd986b11698aa159ec4" "assets-source/meshy/g03/schlackenwacht-animationen.glb": "fdde8ad1b5ef713d4df1beb2c307054e1c83eaf552c8ddd986b11698aa159ec4"
}, },
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3", "source_sha256": "9eb17a4e3dc7029b7031f3be85f6676877c521788835137eb199c352c5b35aa4",
"removed_modifiers": 0, "removed_modifiers": 0,
"kind": "skinned", "kind": "skinned",
"fps": 24.0, "fps": 24.0,
@ -486,6 +485,6 @@
"meshes_without_uv": [], "meshes_without_uv": [],
"triangles": 25142, "triangles": 25142,
"fbx": "Assets/Luneraria/Art/Characters/schlackenwacht.fbx", "fbx": "Assets/Luneraria/Art/Characters/schlackenwacht.fbx",
"fbx_bytes": 3266956, "fbx_bytes": 3268972,
"ok": true "ok": true
} }

View file

@ -1,486 +0,0 @@
{
"id": "sonnenesse",
"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": "['SonnenesseBody_LOD0', 'SonnenesseBody_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": "25460 fbx / 25460 godot"
},
{
"check": "one_armature",
"ok": true,
"detail": "['SonnenesseRig']"
},
{
"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": "25460 / 25460"
},
{
"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', 'walk']"
}
],
"generator": {
"clips": {
"idle": {
"source": "Idle",
"frames": [
0.0,
96.0
],
"seconds": 4.0,
"loop": true,
"contact_seconds": -1.0
},
"walk": {
"source": "Slow_Orc_Walk",
"frames": [
0.0,
132.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
},
"attack_a": {
"source": "mage_soell_cast",
"frames": [
0.0,
54.400001525878906
],
"seconds": 1.0833,
"loop": false,
"contact_seconds": 0.3585
},
"attack_b": {
"source": "Over_Shoulder_Throw",
"frames": [
4,
30
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.6538
},
"hit": {
"source": "Hit_Reaction",
"frames": [
0,
12
],
"seconds": 0.5,
"loop": false,
"contact_seconds": -1.0
},
"ability": {
"source": "Charged_Spell_Cast",
"frames": [
0.0,
64.0
],
"seconds": 1.4167,
"loop": false,
"contact_seconds": 0.9961
},
"death": {
"source": "dying_backwards",
"frames": [
0.0,
52.80000305175781
],
"seconds": 2.2083,
"loop": false,
"contact_seconds": -1.0
}
},
"textures": {
"glow_share": 0.0355,
"palette_gains": {
"metal": [
1.6395,
1.5468,
0.8649
]
},
"size": [
2048,
2048
]
},
"unit": 0.009999999776482582,
"lod": {
"lod0_triangles": 20463,
"lod1_triangles": 4997,
"lod1_vertices": 2452,
"welded_triangles": 20463,
"lod0_screen": 0.2
},
"props": []
},
"inputs_sha256": {
"tools/meshy/g10/figure.json": "f0b3a72d68b713b168444c318abee3ad1400c902f304b1fb0a8f2c2a96f693ab",
"assets-source/meshy/g10/sonnenesse-skelett.glb": "103c4ef8eda9f180343938a69e2950a0dc554eed436ef5ebc1536b35fc1f887a",
"assets-source/meshy/g10/sonnenesse-animationen.glb": "9f9b4495a0edf06f59860c2df95ba247d112654cfefa6ec5c6340298c5ba46d6"
},
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
"removed_modifiers": 0,
"kind": "skinned",
"fps": 24.0,
"objects": 3,
"meshes": {
"SonnenesseBody_LOD0": {
"mesh": "SonnenesseBody_LOD0",
"triangles": 20463,
"vertices": 26659,
"ngons": 0,
"materials": [
"AI_Sonnenesse"
],
"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.8575,
0.0,
-0.4866
],
"max": [
0.8575,
1.6,
0.4866
]
}
},
"SonnenesseBody_LOD1": {
"mesh": "SonnenesseBody_LOD1",
"triangles": 4997,
"vertices": 2452,
"ngons": 0,
"materials": [
"AI_Sonnenesse"
],
"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.8579,
0.0,
-0.4875
],
"max": [
0.8576,
1.6021,
0.4878
]
}
}
},
"armatures": {
"SonnenesseRig": {
"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.8579,
0.0,
-0.4875
],
"max": [
0.8576,
1.6021,
0.4878
]
},
"clips": [
{
"name": "ability",
"frames": [
0.0,
34.0
],
"seconds": 1.4167,
"loop": false,
"contact_seconds": 0.9961
},
{
"name": "attack_a",
"frames": [
0.0,
26.0
],
"seconds": 1.0833,
"loop": false,
"contact_seconds": 0.3585
},
{
"name": "attack_b",
"frames": [
0.0,
24.0
],
"seconds": 1.0,
"loop": false,
"contact_seconds": 0.6538
},
{
"name": "death",
"frames": [
0.0,
53.0
],
"seconds": 2.2083,
"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": "walk",
"frames": [
0.0,
67.0
],
"seconds": 2.7917,
"loop": true,
"contact_seconds": -1.0
}
],
"expected_from_godot": {
"triangles": 25460,
"bones": 25,
"clips": [
"idle",
"walk",
"attack_a",
"attack_b",
"hit",
"ability",
"death"
]
},
"meshes_with_ngons": {},
"meshes_without_uv": [],
"triangles": 25460,
"fbx": "Assets/Luneraria/Art/Characters/sonnenesse.fbx",
"fbx_bytes": 3377708,
"ok": true
}

View file

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

View file

@ -1,337 +0,0 @@
fileFormatVersion: 2
guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f
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: SonnenesseRig|ability
internalID: -9146920348169335592
firstFrame: 0
lastFrame: 34
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.70311284
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: SonnenesseRig|attack_a
internalID: -3688867435692848977
firstFrame: 0
lastFrame: 26
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.33093327
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: SonnenesseRig|attack_b
internalID: -137194745704746687
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.6538
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: SonnenesseRig|death
internalID: -6426894262445047678
firstFrame: 0
lastFrame: 53
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: SonnenesseRig|hit
internalID: -21289445226624713
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: SonnenesseRig|idle
internalID: -7105414130795900942
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: walk
takeName: SonnenesseRig|walk
internalID: -6137465070068673883
firstFrame: 0
lastFrame: 67
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

@ -1,246 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-6811216099093985071
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: -2709338179651766100}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 1735361140140776544}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: -4370220345468990606}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: 3813406096338511602}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: 9082682921124757256}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: 1782638191720012098}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: 2921820919237067307}
m_Position: {x: 410, y: 390, 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: -2709338179651766100}
--- !u!1102 &-4370220345468990606
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: 1565449223295100875, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-2709338179651766100
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: 9093657477581702130, guid: aa5734da897ea44808385f37d34070bf, 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: basaltbastion_meshy
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -6811216099093985071}
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 &1735361140140776544
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: -5495293919160781032, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &1782638191720012098
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: -4714297317412057206, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &2921820919237067307
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: -1455650782467671261, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &3813406096338511602
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: 3972096498202774343, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &9082682921124757256
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: -4724392375424077161, guid: aa5734da897ea44808385f37d34070bf, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View file

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

View file

@ -1,275 +0,0 @@
%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

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

View file

@ -1,246 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1107 &-6058062776808327719
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: 4809146559760871790}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 4217487180802081924}
m_Position: {x: 235, y: 65, z: 0}
- serializedVersion: 1
m_State: {fileID: 169161326647216058}
m_Position: {x: 270, y: 130, z: 0}
- serializedVersion: 1
m_State: {fileID: -3355519416394762264}
m_Position: {x: 305, y: 195, z: 0}
- serializedVersion: 1
m_State: {fileID: 5171706077710693211}
m_Position: {x: 340, y: 260, z: 0}
- serializedVersion: 1
m_State: {fileID: -5424410042088221771}
m_Position: {x: 375, y: 325, z: 0}
- serializedVersion: 1
m_State: {fileID: 8472560047695422486}
m_Position: {x: 410, y: 390, 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: 4809146559760871790}
--- !u!1102 &-5424410042088221771
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: -21289445226624713, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &-3355519416394762264
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: -137194745704746687, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, 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: sonnenesse
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: -6058062776808327719}
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 &169161326647216058
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: -3688867435692848977, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &4217487180802081924
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: -9146920348169335592, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &4809146559760871790
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: -7105414130795900942, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &5171706077710693211
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: -6426894262445047678, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1102 &8472560047695422486
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: -6137465070068673883, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: 0d36246861f5e495c9a37eebff823d05
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.

Before

Width:  |  Height:  |  Size: 6.3 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: fb23cd5309e9a4cc280eaf1093b8e477
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.

Before

Width:  |  Height:  |  Size: 4.1 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: ced81c900c77948e38af00218f6fe9b5
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.

Before

Width:  |  Height:  |  Size: 6.5 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 6.1 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 3.3 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 6.8 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 5.2 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 5 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 2.4 MiB

View file

@ -1,117 +0,0 @@
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.

Before

Width:  |  Height:  |  Size: 5.6 MiB

View file

@ -1,117 +0,0 @@
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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: a8d89482b31b946289ecd7628b8840a8
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.

Before

Width:  |  Height:  |  Size: 6.3 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: 9c1740c7144b44bb8a0008a61f4e21e5
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.

Before

Width:  |  Height:  |  Size: 3.8 MiB

View file

@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: 29aa5535e9c7246318d8345583175348
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:

View file

@ -60,13 +60,7 @@ 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>
@ -97,11 +91,6 @@ 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.") }
} } } }
}; };
@ -113,7 +102,6 @@ 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>
@ -130,13 +118,6 @@ 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,17 +126,9 @@ namespace Luneraria.Core
new ItemSpec { Id = "rankenmantel", Name = "Rankenmantel", Cost = 200, Text = "+10 % Schadensminderung", Reduction = 0.1 }, new ItemSpec { Id = "rankenmantel", Name = "Rankenmantel", Cost = 200, Text = "+10 % Schadensminderung", Reduction = 0.1 },
new ItemSpec { Id = "funkenfokus", Name = "Funkenfokus", Cost = 200, Text = "+15 % Angriffstempo", AttackSpeed = 0.15 }, new ItemSpec { Id = "funkenfokus", Name = "Funkenfokus", Cost = 200, Text = "+15 % Angriffstempo", AttackSpeed = 0.15 },
new ItemSpec { Id = "quellamulett", Name = "Quellamulett", Cost = 220, Text = "Regeneriert 1,5 % der Lebenspunkte pro Sekunde", Regen = 0.015 }, new ItemSpec { Id = "quellamulett", Name = "Quellamulett", Cost = 220, Text = "Regeneriert 1,5 % der Lebenspunkte pro Sekunde", Regen = 0.015 },
new ItemSpec { Id = "kristallsplitter", Name = "Kristallsplitter", Cost = 260, Text = "Jeder Treffer: 25 % an bis zu 2 Gegner in 1,5 m · ab Stufe 3", Splash = 0.25, MinLevel = 3 }, new ItemSpec { Id = "kristallsplitter", Name = "Kristallsplitter", Cost = 260, Text = "Jeder Treffer: 25 % an bis zu 2 Gegner in 1,5 m · ab Stufe 3", Splash = 0.25, MinLevel = 3 }
// S2 recipes (extended rules only; Dota 2 / League of Legends): two items plus a fee become one stronger item.
new ItemSpec { Id = "bollwerk", Name = "Bollwerk", Cost = 500, Text = "Rezept: Basaltschild + Rankenmantel + 120 · +600 Lebenspunkte, +15 % Schadensminderung", HpFlat = 600.0, Reduction = 0.15, Parts = new[] { "basaltschild", "rankenmantel" }, RecipeFee = 120 },
new ItemSpec { Id = "glutsturm", Name = "Glutsturm", Cost = 520, Text = "Rezept: Glutklinge + Funkenfokus + 140 · +25 % Schaden, +22 % Angriffstempo", Damage = 0.25, AttackSpeed = 0.22, Parts = new[] { "glutklinge", "funkenfokus" }, RecipeFee = 140 },
new ItemSpec { Id = "quellherz", Name = "Quellherz", Cost = 520, Text = "Rezept: Quellamulett + Basaltschild + 120 · +450 Lebenspunkte, regeneriert 2,2 % pro Sekunde", HpFlat = 450.0, Regen = 0.022, Parts = new[] { "quellamulett", "basaltschild" }, RecipeFee = 120 },
new ItemSpec { Id = "splitterkrone", Name = "Splitterkrone", Cost = 600, Text = "Rezept: Kristallsplitter + Glutklinge + 160 · +20 % Schaden; jeder Treffer 35 % an bis zu 2 Gegner in 1,5 m · ab Stufe 5", Damage = 0.20, Splash = 0.35, MinLevel = 5, Parts = new[] { "kristallsplitter", "glutklinge" }, RecipeFee = 160 }
); );
/// <summary>Items of the Godot reference; ContentTests compares exactly these, the S2 recipes follow them.</summary>
public static readonly string[] ReferenceItems = { "basaltschild", "glutklinge", "rankenmantel", "funkenfokus", "quellamulett", "kristallsplitter" };
public static readonly OrderedMap<string, ChampionSpec> Champions = Ordered( public static readonly OrderedMap<string, ChampionSpec> Champions = Ordered(
new ChampionSpec { Id = "ch_schutz", Name = "Rostschieber", RoleText = "Schutz", Model = "s02", Cost = 150, Base = "s02", Text = "Schildträger: startet mit Schild, gibt alle 6 s bis zu 4 Verbündeten in 4 m einen Schild von 120.", ViewScale = 1.25 }, new ChampionSpec { Id = "ch_schutz", Name = "Rostschieber", RoleText = "Schutz", Model = "s02", Cost = 150, Base = "s02", Text = "Schildträger: startet mit Schild, gibt alle 6 s bis zu 4 Verbündeten in 4 m einen Schild von 120.", ViewScale = 1.25 },
new ChampionSpec { Id = "ch_druck", Name = "Dunstsänger", RoleText = "Druck auf Unterstützer", Model = "s03", Cost = 150, Base = "s03", Text = "Sucht Unterstützer und Fernkämpfer und verlangsamt deren Angriffe.", ViewScale = 1.25, Priority = "support" }, new ChampionSpec { Id = "ch_druck", Name = "Dunstsänger", RoleText = "Druck auf Unterstützer", Model = "s03", Cost = 150, Base = "s03", Text = "Sucht Unterstützer und Fernkämpfer und verlangsamt deren Angriffe.", ViewScale = 1.25, Priority = "support" },
@ -164,7 +137,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", "held_brunhild", "melee"); public static readonly OrderedMap<string, string> HeroRoles = Pairs("held_ringborke", "front", "held_quellgeflecht", "support", "held_funkenlanze", "ranged", "held_sylvara", "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" };
@ -187,8 +160,7 @@ 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 = "ch_druck" }
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

@ -105,11 +105,6 @@ namespace Luneraria.Core
public double Regen; public double Regen;
public double Splash; public double Splash;
public int MinLevel = 1; public int MinLevel = 1;
/// <summary>S2 recipe items (extended rules): the two items it is made of and the fee on top; Cost is the sum.</summary>
public string[] Parts = new string[0];
public int RecipeFee;
public bool IsRecipe { get { return Parts.Length > 0; } }
} }
public sealed class ChampionSpec public sealed class ChampionSpec

View file

@ -60,59 +60,8 @@ namespace Luneraria.Core
public double OuterTowerFraction = 0.35; public double OuterTowerFraction = 0.35;
public double TowerSideOffset = 3.4; public double TowerSideOffset = 3.4;
// S1: extended rules (MatchOptions.Extended; the reference rules ignore all of these).
/// <summary>Legion TD 2: a booked attack champion raises the booker's income by cost / this, for good.</summary>
public int ChampionIncomeDivisor = 12;
/// <summary>S3: share of a champion's bounty the defenders get under the extended rules (Legion TD 2: less than the send costs).</summary>
public double ChampionBountyShare = 0.5;
/// <summary>Dota 2 barracks: waves of a team on a lane whose enemy inner tower fell get stronger.</summary>
public double BarracksBoost = 0.25;
public int BarracksExtraMonsters = 1;
/// <summary>Dota 2 buyback, adapted: a fallen hero starts the next combat exhausted, unless bought back.</summary>
public double ExhaustedHp = 0.6;
public int BuybackBase = 60;
public int BuybackPerLevel = 20;
/// <summary>League of Legends dragon souls: each grotto victory blesses the team, up to the soul.</summary>
public double BlessingStep = 0.04;
public int BlessingMax = 4;
/// <summary>Moon soul (all stacks): heroes regenerate this share of their health per second.</summary>
public double SoulRegen = 0.01;
// S2: extended rules.
/// <summary>Dota 2 glyph: a planned lane's towers turn invulnerable for this long once one falls below half health.</summary>
public double GlyphSeconds = 5.0;
public double GlyphThreshold = 0.5;
public int GlyphCooldown = 4;
/// <summary>Legion TD 2 king: Ancient levels bought by the team's players; price per level, attack and repair per level.</summary>
public int CoreLevelMax = 3;
public int CoreLevelPrice = 150;
public double[] CoreDamage = { 0.0, 45.0, 75.0, 110.0 };
public double CoreRange = 7.5;
public double CoreRepair = 1000.0;
// S3: neutral camps (League of Legends buff camps) under the extended rules.
/// <summary>A guardian stands at the middle of every lane in rounds divisible by this.</summary>
public int CampEvery = 3;
public double CampHp = 1500.0;
public double CampDamage = 30.0;
public double CampRange = 2.5;
/// <summary>Units within this distance decide which team takes a fallen guardian.</summary>
public double CampClaimRadius = 8.0;
/// <summary>Combats a lane buff lasts; Glutsegen damage, Mondschild shield share, Beute gold per player.</summary>
public int CampBuffRounds = 2;
public double CampDamageBuff = 0.10;
public double CampShieldBuff = 0.10;
public int CampLootGold = 50;
/// <summary>S3 wards (Dota 2): price and rounds a ward watches its lane.</summary>
public int WardCost = 40;
public int WardRounds = 3;
public static LuneBalance Default() { return new LuneBalance(); } public static LuneBalance Default() { return new LuneBalance(); }
public int CoreUpgradeCost(int level) { return CoreLevelPrice * (level + 1); }
public int BuybackCost(int level) { return BuybackBase + BuybackPerLevel * level; }
public int RoundIncome(int roundNumber) public int RoundIncome(int roundNumber)
{ {
return BaseIncome + GdMath.Min(IncomeGrowthCap, IncomePerRound * GdMath.Max(0, roundNumber - 1)); return BaseIncome + GdMath.Min(IncomeGrowthCap, IncomePerRound * GdMath.Max(0, roundNumber - 1));

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") || hero.Talents.Contains("rabenschwinge")) if (hero.Talents.Contains("glutsalve") || hero.Talents.Contains("neumond"))
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

@ -571,7 +571,6 @@ namespace Luneraria.Core
player.Gold = row.Gold; player.Gold = row.Gold;
player.Ready = row.Ready; player.Ready = row.Ready;
player.Earned = row.Earned; player.Earned = row.Earned;
player.IncomeBonus = row.IncomeBonus;
player.Spent = row.Spent; player.Spent = row.Spent;
player.NextSeq = row.NextSeq; player.NextSeq = row.NextSeq;
player.Roster = new List<RosterEntry>(); player.Roster = new List<RosterEntry>();
@ -622,16 +621,6 @@ namespace Luneraria.Core
MatchState.Boss.NextAvailableRound = source.NextAvailableRound; MatchState.Boss.NextAvailableRound = source.NextAvailableRound;
MatchState.Boss.SettledRound = source.SettledRound; MatchState.Boss.SettledRound = source.SettledRound;
MatchState.Boss.Claim = source.Claim != null ? source.Claim.Clone() : null; MatchState.Boss.Claim = source.Claim != null ? source.Claim.Clone() : null;
if (source.Blessing != null && source.Blessing.Length == 2)
MatchState.Boss.Blessing = (int[])source.Blessing.Clone();
if (source.GlyphReady != null && source.GlyphReady.Length == 2)
MatchState.Boss.GlyphReady = (int[])source.GlyphReady.Clone();
if (source.CoreLevel != null && source.CoreLevel.Length == 2)
MatchState.Boss.CoreLevel = (int[])source.CoreLevel.Clone();
if (source.CampBuff != null && source.CampBuff.Length == 6)
MatchState.Boss.CampBuff = (int[])source.CampBuff.Clone();
if (source.Wards != null && source.Wards.Length == 6)
MatchState.Boss.Wards = (int[])source.Wards.Clone();
} }
public void ApplyLobby(List<LobbyEntry> entries) public void ApplyLobby(List<LobbyEntry> entries)
@ -711,7 +700,6 @@ 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];
@ -732,13 +720,6 @@ 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;
}
} }
} }
@ -821,7 +802,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) | (unit.Stunned() ? 1 << 18 : 0); int flags = (unit.Alive ? 1 : 0) | (unit.InRange ? 2 : 0) | ((unit.LeapSerial & 0xFF) << 2) | ((unit.UltimateSerial & 0xFF) << 10);
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);
@ -842,19 +823,7 @@ namespace Luneraria.Core
public float[] BuildingHpArray() public float[] BuildingHpArray()
{ {
IReadOnlyList<BuildingDef> buildings = MatchState.Map.Buildings; IReadOnlyList<BuildingDef> buildings = MatchState.Map.Buildings;
// S4: four more values after the buildings carry the running glyph of each team (lane var data = new float[buildings.Count];
// 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;
@ -888,12 +857,7 @@ namespace Luneraria.Core
{ {
NextAvailableRound = MatchState.Boss.NextAvailableRound, NextAvailableRound = MatchState.Boss.NextAvailableRound,
SettledRound = MatchState.Boss.SettledRound, SettledRound = MatchState.Boss.SettledRound,
Claim = MatchState.Boss.Claim != null ? MatchState.Boss.Claim.Clone() : null, Claim = MatchState.Boss.Claim != null ? MatchState.Boss.Claim.Clone() : null
Blessing = (int[])MatchState.Boss.Blessing.Clone(),
GlyphReady = (int[])MatchState.Boss.GlyphReady.Clone(),
CoreLevel = (int[])MatchState.Boss.CoreLevel.Clone(),
CampBuff = (int[])MatchState.Boss.CampBuff.Clone(),
Wards = (int[])MatchState.Boss.Wards.Clone()
}; };
if (MatchState.Combat != null) if (MatchState.Combat != null)
state.DestroyedCores.AddRange(MatchState.Combat.DestroyedCores); state.DestroyedCores.AddRange(MatchState.Combat.DestroyedCores);
@ -908,7 +872,6 @@ namespace Luneraria.Core
Gold = player.Gold, Gold = player.Gold,
Ready = player.Ready, Ready = player.Ready,
Earned = player.Earned, Earned = player.Earned,
IncomeBonus = player.IncomeBonus,
Spent = player.Spent, Spent = player.Spent,
NextSeq = player.NextSeq, NextSeq = player.NextSeq,
Hero = player.Hero != null ? player.Hero.Clone() : null, Hero = player.Hero != null ? player.Hero.Clone() : null,
@ -967,7 +930,7 @@ namespace Luneraria.Core
MatchOptions PublicOptions() MatchOptions PublicOptions()
{ {
var options = new MatchOptions { Seed = MatchState != null ? MatchState.SeedValue : 1, HumanSlot = LocalSlot, Extended = MatchState != null && MatchState.Extended }; var options = new MatchOptions { Seed = MatchState != null ? MatchState.SeedValue : 1, HumanSlot = LocalSlot };
if (MatchState != null) if (MatchState != null)
{ {
foreach (Player player in MatchState.Players) foreach (Player player in MatchState.Players)

View file

@ -50,8 +50,6 @@ namespace Luneraria.Core
public Draft Draft; public Draft Draft;
/// <summary>Undo stack size of the receiving seat (0 for others).</summary> /// <summary>Undo stack size of the receiving seat (0 for others).</summary>
public int Undo; public int Undo;
/// <summary>S1: permanent champion income (public, like the champion bookings).</summary>
public int IncomeBonus;
} }
/// <summary>Public state of the match for one seat (rpc_state).</summary> /// <summary>Public state of the match for one seat (rpc_state).</summary>

View file

@ -18,16 +18,8 @@ namespace Luneraria.Core
// A match may fix the profile per slot (balance runs); otherwise a seed-based rotation. // A match may fix the profile per slot (balance runs); otherwise a seed-based rotation.
if (match.BotProfiles.Count == 6) if (match.BotProfiles.Count == 6)
return match.BotProfiles[slot]; return match.BotProfiles[slot];
// S1: with extended rules the rotation also holds the profiles of later heroes (Sylvara). IReadOnlyList<string> names = ContentData.BotProfiles.Keys;
if (!match.Extended) return names[(slot * 7 + match.SeedValue) % names.Count];
{
IReadOnlyList<string> reference = ContentData.BotProfiles.Keys;
return reference[(slot * 7 + match.SeedValue) % reference.Count];
}
var names = new List<string>(ContentData.BotProfiles.Keys);
names.AddRange(ContentData.ExtraBotProfiles.Keys);
// S3 fix: with seven profiles the reference step 7 gave every seat the same profile.
return names[(slot * 5 + match.SeedValue) % names.Count];
} }
public static void Plan(LuneMatch match, int slot, string profileName = "") public static void Plan(LuneMatch match, int slot, string profileName = "")
@ -45,17 +37,6 @@ namespace Luneraria.Core
// Items and champions are planned before the army so the roster cannot drain the reserve. // Items and champions are planned before the army so the roster cannot drain the reserve.
PlanItems(match, slot, profile, 110); PlanItems(match, slot, profile, 110);
PlanChampion(match, slot, profile); PlanChampion(match, slot, profile);
// S2 team actions come before the army too, so a threatened base gets its Ancient level.
if (match.Extended)
PlanTeam(match, slot);
// S3 (extended rules): from its hero round a bot saves for the hero instead of buying troops
// (the reference bots spend everything and recruit around round 11).
if (match.Extended && player.Draft.Hero == null && match.RoundNumber >= profile.HeroRound && player.Draft.Roster.Count >= 3)
{
PlanBoss(match, slot, profile);
match.SetReady(slot);
return;
}
for (int guard = 0; guard < 40; guard++) for (int guard = 0; guard < 40; guard++)
{ {
List<RosterEntry> roster = player.Draft.Roster; List<RosterEntry> roster = player.Draft.Roster;
@ -95,9 +76,6 @@ namespace Luneraria.Core
match.Submit(slot, Command.HeroBuy(profile.Hero)); match.Submit(slot, Command.HeroBuy(profile.Hero));
return; return;
} }
// S1: buy an exhausted hero back while the army keeps a reserve.
if (hero.Exhausted && match.Extended && player.Draft.Gold >= match.BuybackCost(hero) + 150)
match.Submit(slot, Command.Buyback());
int level = LuneContent.LevelFor(hero.Xp); int level = LuneContent.LevelFor(hero.Xp);
for (int tier = 0; tier < LuneContent.TalentLevels.Length; tier++) for (int tier = 0; tier < LuneContent.TalentLevels.Length; tier++)
{ {
@ -106,60 +84,9 @@ namespace Luneraria.Core
} }
} }
/// <summary>
/// S2 team actions (extended rules only): hold the glyph for the own lane when one of its
/// towers is below 60 %, and raise the Ancient once the base is under threat.
/// </summary>
static void PlanTeam(LuneMatch match, int slot)
{
Player player = match.Players[slot];
if (match.RoundNumber >= match.Boss.GlyphReady[player.Team])
{
foreach (BuildingDef definition in match.Map.Buildings)
{
if (definition.Team == player.Team && definition.Lane == player.Lane && definition.Tier != "core"
&& match.BuildingHp[definition.Id] > 0.0 && match.BuildingHp[definition.Id] < definition.MaxHp * 0.6)
{
match.Submit(slot, Command.Glyph(player.Lane));
break;
}
}
}
int level = match.Boss.CoreLevel[player.Team] + player.Draft.CoreInvest;
bool threatened = false;
foreach (BuildingDef definition in match.Map.Buildings)
{
if (definition.Team == player.Team && definition.Tier == "inner" && match.BuildingHp[definition.Id] <= 0.0)
threatened = true;
}
if (threatened && level < match.Balance.CoreLevelMax && player.Draft.Gold >= match.Balance.CoreUpgradeCost(level))
match.Submit(slot, Command.CoreUpgrade());
}
/// <summary>S2: both own towers of the player's lane stand above 70 % (an extra grotto hunter leaves only a safe lane).</summary>
static bool LaneSafe(LuneMatch match, Player player)
{
foreach (BuildingDef definition in match.Map.Buildings)
{
if (definition.Team == player.Team && definition.Lane == player.Lane && (definition.Tier == "outer" || definition.Tier == "inner")
&& match.BuildingHp[definition.Id] < definition.MaxHp * 0.7)
return false;
}
return true;
}
static void PlanItems(LuneMatch match, int slot, BotProfile profile, int reserve) static void PlanItems(LuneMatch match, int slot, BotProfile profile, int reserve)
{ {
HeroState hero = match.Players[slot].Draft.Hero; HeroState hero = match.Players[slot].Draft.Hero;
// S2 recipes: combine owned parts first (frees a slot), one per planning.
if (hero != null && match.Extended)
{
foreach (ItemSpec recipe in ContentData.Items.Values)
{
if (recipe.IsRecipe && match.Players[slot].Draft.Gold >= recipe.RecipeFee + reserve && match.Submit(slot, Command.ItemBuy(recipe.Id)).Ok)
break;
}
}
if (hero == null || hero.Items.Count >= LuneContent.ItemSlots) if (hero == null || hero.Items.Count >= LuneContent.ItemSlots)
return; return;
foreach (string itemId in profile.Items) foreach (string itemId in profile.Items)
@ -215,18 +142,14 @@ namespace Luneraria.Core
string lane = WeakestLane(match, 1 - player.Team); string lane = WeakestLane(match, 1 - player.Team);
match.Submit(slot, Command.BossLaneChoice(lane)); match.Submit(slot, Command.BossLaneChoice(lane));
} }
// S2 (extended rules): mid players also hunt the boss from round 8, so the Mondsegen of S1 really happens. if (!profile.HuntsBoss || match.RoundNumber < profile.BossFrom || !match.GrottoAvailable())
bool hunts = profile.HuntsBoss || (match.Extended && LuneMap.LaneIndex(player.Lane) == 1 && LaneSafe(match, player));
int from = profile.HuntsBoss ? profile.BossFrom : 8;
int troops = profile.HuntsBoss ? profile.BossTroops : 5;
if (!hunts || match.RoundNumber < from || !match.GrottoAvailable())
return; return;
List<RosterEntry> roster = player.Draft.Roster; List<RosterEntry> roster = player.Draft.Roster;
if (roster.Count < troops) if (roster.Count < profile.BossTroops)
return; return;
var picks = new List<RosterEntry>(roster); var picks = new List<RosterEntry>(roster);
GdMath.SortStable(picks, (a, b) => a.Invested == b.Invested ? a.Seq < b.Seq : a.Invested > b.Invested); GdMath.SortStable(picks, (a, b) => a.Invested == b.Invested ? a.Seq < b.Seq : a.Invested > b.Invested);
int keep = GdMath.Min(troops - 1, picks.Count); int keep = GdMath.Min(profile.BossTroops - 1, picks.Count);
picks.RemoveRange(keep, picks.Count - keep); picks.RemoveRange(keep, picks.Count - keep);
HeroState hero = player.Draft.Hero; HeroState hero = player.Draft.Hero;
// The boss formula is public. Lanchester estimate: total HP x total damage of the // The boss formula is public. Lanchester estimate: total HP x total damage of the

View file

@ -22,8 +22,6 @@ namespace Luneraria.Core
public string BuildingId = ""; public string BuildingId = "";
public int Xp; public int Xp;
public List<string> XpHeroes = new List<string>(); public List<string> XpHeroes = new List<string>();
/// <summary>S3 camp guardians: the team that takes the camp, -1 for none.</summary>
public int ClaimTeam = -1;
} }
/// <summary> /// <summary>
@ -58,10 +56,6 @@ namespace Luneraria.Core
public int GrottoActiveTeam = -1; public int GrottoActiveTeam = -1;
/// <summary>none, success or failed.</summary> /// <summary>none, success or failed.</summary>
public string GrottoOutcome = "none"; public string GrottoOutcome = "none";
/// <summary>S2 glyph per team: the held lane ("" none), when its towers stop being invulnerable, whether it fired.</summary>
public readonly string[] GlyphLane = { "", "" };
public readonly double[] GlyphUntil = { -1.0, -1.0 };
public readonly bool[] GlyphUsed = new bool[2];
int _nextId = 1; int _nextId = 1;
readonly int[] _teamCount = new int[3]; readonly int[] _teamCount = new int[3];
@ -297,7 +291,7 @@ namespace Luneraria.Core
} }
foreach (LuneUnit unit in living) foreach (LuneUnit unit in living)
{ {
if (unit.IsMobile() || unit.Kind == "tower" || (unit.Kind == "core" && unit.Def.Damage > 0.0)) if (unit.IsMobile() || unit.Kind == "tower")
{ {
bool keep = unit.Target != null && unit.Target.Alive; bool keep = unit.Target != null && unit.Target.Alive;
if (unit.LeapTarget != null) if (unit.LeapTarget != null)
@ -323,7 +317,7 @@ namespace Luneraria.Core
if (heading.LengthSquared() > 0.000001) if (heading.LengthSquared() > 0.000001)
unit.Facing = GdMath.Atan2(heading.X, heading.Y); unit.Facing = GdMath.Atan2(heading.X, heading.Y);
unit.LeapTarget = null; unit.LeapTarget = null;
if (unit.Zone == "lane" && unit.Kind != "camp") if (unit.Zone == "lane")
UpdateProgress(unit, plan.Value); UpdateProgress(unit, plan.Value);
} }
foreach (LuneUnit unit in living) foreach (LuneUnit unit in living)
@ -356,40 +350,10 @@ namespace Luneraria.Core
RecordDeath(unit); RecordDeath(unit);
} }
} }
TriggerGlyphs();
UpdateGrotto(); UpdateGrotto();
CheckEnd(); CheckEnd();
} }
/// <summary>S2: a tower of the glyph lane is invulnerable while its team's glyph runs.</summary>
public bool Glyphed(LuneUnit unit)
{
if (unit.Kind != "tower" || unit.Team > 1)
return false;
return GlyphLane[unit.Team].Length > 0 && unit.Lane == GlyphLane[unit.Team] && Elapsed < GlyphUntil[unit.Team] - 0.000001;
}
/// <summary>S2 (Dota 2 glyph): the first time a tower of the held lane is below the threshold, the glyph fires.</summary>
void TriggerGlyphs()
{
for (int team = 0; team < 2; team++)
{
if (GlyphLane[team].Length == 0 || GlyphUsed[team])
continue;
IReadOnlyList<LuneUnit> buildings = Buildings.Values;
for (int i = 0; i < buildings.Count; i++)
{
LuneUnit tower = buildings[i];
if (tower.Alive && tower.Kind == "tower" && tower.Team == team && tower.Lane == GlyphLane[team] && tower.Hp < tower.MaxHp * Balance.GlyphThreshold)
{
GlyphUsed[team] = true;
GlyphUntil[team] = Elapsed + Balance.GlyphSeconds;
break;
}
}
}
}
/// <summary>Expeditions fight each other first; the boss wakes when at most one team remains.</summary> /// <summary>Expeditions fight each other first; the boss wakes when at most one team remains.</summary>
void UpdateGrotto() void UpdateGrotto()
{ {
@ -430,8 +394,7 @@ namespace Luneraria.Core
bool mobileAlive = !GrottoResolved; bool mobileAlive = !GrottoResolved;
foreach (LuneUnit unit in Units) foreach (LuneUnit unit in Units)
{ {
// S3: a camp guardian alone does not hold the combat open. if (unit.Alive && unit.IsMobile() && unit.Zone == "lane")
if (unit.Alive && unit.IsMobile() && unit.Zone == "lane" && unit.Kind != "camp")
{ {
mobileAlive = true; mobileAlive = true;
break; break;
@ -470,7 +433,6 @@ namespace Luneraria.Core
switch (unit.Kind) switch (unit.Kind)
{ {
case "monster": xp = 12 + RoundNumber; break; case "monster": xp = 12 + RoundNumber; break;
case "camp": xp = 30 + 2 * RoundNumber; break;
case "champion": xp = 30 + 2 * RoundNumber; break; case "champion": xp = 30 + 2 * RoundNumber; break;
case "boss": xp = LuneContent.BossXp; break; case "boss": xp = LuneContent.BossXp; break;
case "troop": case "troop":
@ -485,35 +447,9 @@ namespace Luneraria.Core
ev.XpHeroes.Add(other.PersistentUid); ev.XpHeroes.Add(other.PersistentUid);
} }
ev.Xp = xp; ev.Xp = xp;
if (unit.Kind == "camp")
ev.ClaimTeam = CampClaim(unit);
Events.Add(ev); Events.Add(ev);
} }
/// <summary>
/// S3: the team with more living units near a fallen guardian takes the camp, on equal
/// numbers the one with more health there; an exact tie (mirrored armies) takes nothing.
/// Units dying in the same step do not count (health above zero), so order never decides.
/// </summary>
int CampClaim(LuneUnit camp)
{
var count = new int[2];
var health = new double[2];
foreach (LuneUnit other in Units)
{
if (other.Hp > 0.0 && other.Team < 2 && other.IsMobile() && other.Zone == camp.Zone && other.Position.DistanceTo(camp.Position) <= Balance.CampClaimRadius)
{
count[other.Team]++;
health[other.Team] += other.Hp;
}
}
if (count[0] != count[1])
return count[0] > count[1] ? 0 : 1;
if (Math.Abs(health[0] - health[1]) > 0.5)
return health[0] > health[1] ? 0 : 1;
return -1;
}
// ---------------------------------------------------------------- targeting and movement // ---------------------------------------------------------------- targeting and movement
static bool Hostile(LuneUnit unit, LuneUnit other) static bool Hostile(LuneUnit unit, LuneUnit other)
{ {
@ -527,11 +463,11 @@ namespace Luneraria.Core
{ {
if (!current.IsBuilding() || BuildingAttackable(current, gates)) if (!current.IsBuilding() || BuildingAttackable(current, gates))
{ {
if (!unit.IsStationary() || unit.Position.DistanceTo(current.Position) <= unit.AttackRange()) if (unit.Kind != "tower" || unit.Position.DistanceTo(current.Position) <= unit.AttackRange())
return current; return current;
} }
} }
double radius = unit.IsStationary() ? unit.AttackRange() : Balance.AggroRadius; double radius = unit.Kind == "tower" ? unit.AttackRange() : Balance.AggroRadius;
LuneUnit best = null; LuneUnit best = null;
double bestDistance = double.PositiveInfinity; double bestDistance = double.PositiveInfinity;
string priority = unit.Def.Priority; string priority = unit.Def.Priority;
@ -569,7 +505,7 @@ namespace Luneraria.Core
bestDistance = d; bestDistance = d;
} }
} }
if (best != null || unit.IsStationary()) if (best != null || unit.Kind == "tower")
return best; return best;
// Buildings: nearby attackable ones; at the end of a lane the whole base is in reach. // Buildings: nearby attackable ones; at the end of a lane the whole base is in reach.
for (int i = 0; i < buildings.Count; i++) for (int i = 0; i < buildings.Count; i++)
@ -612,8 +548,6 @@ namespace Luneraria.Core
{ {
if (unit.LeapTarget != null) if (unit.LeapTarget != null)
return new KeyValuePair<Vec2, double>(LeapLanding(unit, unit.LeapTarget), unit.Progress); return new KeyValuePair<Vec2, double>(LeapLanding(unit, unit.LeapTarget), unit.Progress);
if (unit.Kind == "camp")
return new KeyValuePair<Vec2, double>(unit.Position, unit.Progress);
double stepLength = unit.Speed() * Balance.MarchSpeedFactor * unit.MovementFactor() * dt; double stepLength = unit.Speed() * Balance.MarchSpeedFactor * unit.MovementFactor() * dt;
Vec2 goal = unit.Position; Vec2 goal = unit.Position;
double travel = 0.0; double travel = 0.0;
@ -713,7 +647,7 @@ namespace Luneraria.Core
{ {
unit.InRange = false; unit.InRange = false;
LuneUnit target = unit.Target; LuneUnit target = unit.Target;
if (target == null || !target.Alive || (unit.Kind == "core" && unit.Def.Damage <= 0.0)) if (target == null || !target.Alive || unit.Kind == "core")
{ {
unit.AttackProgress = 0.0; unit.AttackProgress = 0.0;
return; return;
@ -730,7 +664,7 @@ namespace Luneraria.Core
return; return;
} }
unit.InRange = true; unit.InRange = true;
double interval = unit.IsBuilding() ? Balance.TowerAttackInterval : 1.0; double interval = unit.Kind == "tower" ? Balance.TowerAttackInterval : 1.0;
unit.AttackProgress += dt * unit.AttackSpeedFactor() / interval; unit.AttackProgress += dt * unit.AttackSpeedFactor() / interval;
while (unit.AttackProgress >= 1.0 - 0.000001) while (unit.AttackProgress >= 1.0 - 0.000001)
{ {
@ -747,8 +681,6 @@ 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;
@ -772,8 +704,6 @@ namespace Luneraria.Core
// The building gate applies to every source: ranged, splash, DoT and abilities. // The building gate applies to every source: ranged, splash, DoT and abilities.
if (target.IsBuilding() && !BuildingAttackable(target, gates)) if (target.IsBuilding() && !BuildingAttackable(target, gates))
return; return;
if (Glyphed(target))
return;
double current; double current;
_pendingDamage.TryGetValue(target.Id, out current); _pendingDamage.TryGetValue(target.Id, out current);
_pendingDamage[target.Id] = current + amount; _pendingDamage[target.Id] = current + amount;
@ -813,9 +743,6 @@ namespace Luneraria.Core
case "sylvara": case "sylvara":
unit.AbilityReady = SylvaraFirstThrow; unit.AbilityReady = SylvaraFirstThrow;
break; break;
case "brunhild":
unit.AbilityReady = BrunhildFirstSpear;
break;
} }
} }
@ -868,8 +795,6 @@ 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);
@ -976,9 +901,6 @@ 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)
{ {
@ -1114,97 +1036,6 @@ 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

@ -1,163 +0,0 @@
using System.Collections.Generic;
namespace Luneraria.Core
{
/// <summary>
/// S3 fog of war (Dota 2 vision and wards, extended rules). It only decides what a viewer's
/// team sees; the simulation never reads it, so the rules and every replay stay the same.
/// In combat an enemy unit is visible within reach of an own living unit, an own living
/// building or one of the team's wards (a ward watches the middle of its lane). In planning,
/// enemy armies show only on scouted lanes: a ward there, or the enemy's outer tower of that
/// lane has fallen. Neutral units (camp guardians, the grotto boss) are always visible.
/// </summary>
public static class LuneFog
{
public const double UnitSight = 9.0;
public const double BuildingSight = 10.0;
public const double WardSight = 12.0;
struct Source
{
public Vec2 At;
public double Radius;
public string Zone;
}
/// <summary>The lane is scouted for the team in planning (ward, fallen enemy outer tower, or a ward in the own draft).</summary>
public static bool LaneScouted(LuneMatch match, int team, string lane, Draft ownDraft = null)
{
int index = LuneMap.LaneIndex(lane);
if (index < 0)
return false;
if (match.Boss.Wards[team * 3 + index] > 0)
return true;
if (ownDraft != null && ownDraft.WardLanes.Contains(lane))
return true;
foreach (BuildingDef definition in match.Map.Buildings)
{
if (definition.Team == 1 - team && definition.Lane == lane && definition.Tier == "outer")
return match.BuildingHp[definition.Id] <= 0.0;
}
return false;
}
/// <summary>
/// Planning (S3): the enemy's committed army on the lanes the team has scouted, as the
/// match will field it (troops and heroes, lane owner first). The planning preview shows
/// these; unscouted lanes show nothing of the enemy. Empty without the extended rules.
/// </summary>
public static List<LuneMatch.ArmyEntry> ScoutedEnemies(LuneMatch match, int team, Draft ownDraft = null)
{
var result = new List<LuneMatch.ArmyEntry>();
if (match == null || !match.Extended || team < 0 || team > 1)
return result;
int enemy = 1 - team;
foreach (string lane in LuneMap.Lanes)
{
if (!LaneScouted(match, team, lane, ownDraft))
continue;
for (int slot = enemy * 3; slot < enemy * 3 + 3; slot++)
{
foreach (LuneMatch.ArmyEntry entry in match.ArmyEntries(slot))
{
if (entry.Lane == lane)
result.Add(entry);
}
}
}
return result;
}
/// <summary>Middle of a lane, where a ward watches.</summary>
public static Vec2 WardPoint(LuneMatch match, string lane)
{
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>
/// 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.
/// </summary>
public static HashSet<int> Hidden(LuneMatch match, LuneCombat shown, int team, bool planning, Draft ownDraft = null)
{
var hidden = new HashSet<int>();
if (match == null || shown == null || !match.Extended || team < 0 || team > 1)
return hidden;
if (planning)
{
foreach (LuneUnit unit in shown.Units)
{
if (unit.Team == 1 - team && unit.IsMobile() && (unit.Zone != "lane" || !LaneScouted(match, team, unit.Lane, ownDraft)))
hidden.Add(unit.Id);
}
return hidden;
}
var sources = new List<Source>();
foreach (LuneUnit unit in shown.Units)
{
if (unit.Team != team || !unit.Alive)
continue;
if (unit.IsMobile())
sources.Add(new Source { At = unit.Position, Radius = UnitSight, Zone = unit.Zone });
else if (unit.IsBuilding())
sources.Add(new Source { At = unit.Position, Radius = BuildingSight, Zone = "lane" });
}
foreach (string lane in LuneMap.Lanes)
{
if (match.Boss.Wards[team * 3 + LuneMap.LaneIndex(lane)] > 0)
sources.Add(new Source { At = WardPoint(match, lane), Radius = WardSight, Zone = "lane" });
}
foreach (LuneUnit unit in shown.Units)
{
if (unit.Team != 1 - team || !unit.IsMobile())
continue;
bool seen = false;
foreach (Source source in sources)
{
if (source.Zone == unit.Zone && unit.Position.DistanceTo(source.At) <= source.Radius)
{
seen = true;
break;
}
}
if (!seen)
hidden.Add(unit.Id);
}
return hidden;
}
}
}

View file

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

View file

@ -21,8 +21,6 @@ namespace Luneraria.Core
public int RoundNumber = 1; public int RoundNumber = 1;
public Phase Phase = Phase.Planning; public Phase Phase = Phase.Planning;
public int Winner = Ongoing; public int Winner = Ongoing;
/// <summary>S1: extended rules (MatchOptions.Extended); false keeps the reference rules exactly.</summary>
public bool Extended;
public string EndNote = ""; public string EndNote = "";
public readonly List<Player> Players = new List<Player>(); public readonly List<Player> Players = new List<Player>();
/// <summary>Building HP between combats, in map order.</summary> /// <summary>Building HP between combats, in map order.</summary>
@ -48,12 +46,6 @@ namespace Luneraria.Core
{ {
options = options ?? new MatchOptions(); options = options ?? new MatchOptions();
SeedValue = options.Seed; SeedValue = options.Seed;
Extended = options.Extended;
Boss.Blessing = new int[2];
Boss.GlyphReady = new[] { 1, 1 };
Boss.CoreLevel = new int[2];
Boss.CampBuff = new int[6];
Boss.Wards = new int[6];
RoundNumber = 1; RoundNumber = 1;
Phase = Phase.Planning; Phase = Phase.Planning;
Winner = Ongoing; Winner = Ongoing;
@ -259,8 +251,6 @@ namespace Luneraria.Core
ItemSpec item; ItemSpec item;
if (!ContentData.Items.TryGetValue(itemId, out item)) if (!ContentData.Items.TryGetValue(itemId, out item))
return Result(false, "Unbekanntes Item."); return Result(false, "Unbekanntes Item.");
if (item.IsRecipe)
return Combine(hero, draft, item);
if (hero.Items.Contains(itemId)) if (hero.Items.Contains(itemId))
return Result(false, item.Name + " trägt dein Held bereits; Items sind einzigartig."); return Result(false, item.Name + " trägt dein Held bereits; Items sind einzigartig.");
if (hero.Items.Count >= LuneContent.ItemSlots) if (hero.Items.Count >= LuneContent.ItemSlots)
@ -326,61 +316,6 @@ namespace Luneraria.Core
hero.Skin = skin; hero.Skin = skin;
return Result(true, skin.Length == 0 ? "Standard-Aussehen gewählt." : "Skin gewählt."); return Result(true, skin.Length == 0 ? "Standard-Aussehen gewählt." : "Skin gewählt.");
} }
case "glyph":
{
if (!Extended)
return Result(false, "Die Glyphe gibt es nur mit erweiterten Regeln.");
string lane = command.Lane ?? "";
if (lane.Length > 0 && LuneMap.LaneIndex(lane) < 0)
return Result(false, "Unbekannte Lane.");
if (lane.Length > 0 && RoundNumber < Boss.GlyphReady[player.Team])
return Result(false, string.Format("Die Glyphe ist ab Runde {0} wieder bereit.", Boss.GlyphReady[player.Team]));
draft.GlyphLane = lane;
return Result(true, lane.Length == 0 ? "Glyphe zurückgenommen." : "Glyphe für " + LuneMap.LaneNames[lane] + " bereitgehalten.");
}
case "ward":
{
if (!Extended)
return Result(false, "Späher gibt es nur mit erweiterten Regeln.");
string lane = command.Lane ?? "";
int index = LuneMap.LaneIndex(lane);
if (index < 0)
return Result(false, "Unbekannte Lane.");
if (draft.WardLanes.Contains(lane))
return Result(false, "Auf dieser Lane steht schon dein Späher.");
if (draft.Gold < Balance.WardCost)
return Result(false, string.Format("Es fehlen {0} Gold.", Balance.WardCost - draft.Gold));
draft.Gold -= Balance.WardCost;
draft.WardLanes.Add(lane);
return Result(true, "Späher auf " + LuneMap.LaneNames[lane] + " gesetzt (" + Balance.WardRounds + " Runden).");
}
case "core_upgrade":
{
if (!Extended)
return Result(false, "Ancient-Stufen gibt es nur mit erweiterten Regeln.");
int level = Boss.CoreLevel[player.Team] + draft.CoreInvest;
if (level >= Balance.CoreLevelMax)
return Result(false, "Der Ancient hat die höchste Stufe.");
int cost = Balance.CoreUpgradeCost(level);
if (draft.Gold < cost)
return Result(false, string.Format("Es fehlen {0} Gold.", cost - draft.Gold));
draft.Gold -= cost;
draft.CoreInvest += 1;
return Result(true, string.Format("Ancient auf Stufe {0} gestärkt ({1} Gold).", level + 1, cost));
}
case "buyback":
{
if (!Extended)
return Result(false, "Rückkauf gibt es nur mit erweiterten Regeln.");
if (hero == null || !hero.Exhausted)
return Result(false, "Dein Held ist nicht erschöpft.");
int cost = BuybackCost(hero);
if (draft.Gold < cost)
return Result(false, string.Format("Es fehlen {0} Gold.", cost - draft.Gold));
draft.Gold -= cost;
hero.Exhausted = false;
return Result(true, string.Format("Held für {0} Gold zurückgekauft.", cost));
}
case "champion_book": case "champion_book":
{ {
string championId = command.ChampionId ?? ""; string championId = command.ChampionId ?? "";
@ -498,40 +433,19 @@ namespace Luneraria.Core
Booking committed = booking.Clone(); Booking committed = booking.Clone();
committed.DeployRound = RoundNumber + 1; committed.DeployRound = RoundNumber + 1;
player.Bookings.Add(committed); player.Bookings.Add(committed);
// S1 (Legion TD 2): sending raises the own income for good.
if (Extended)
player.IncomeBonus += ChampionIncome(booking.Cost);
} }
BossClaim claim = Boss.Claim; BossClaim claim = Boss.Claim;
if (claim != null && claim.ChooserSlot == player.Slot && draft.BossLane.Length > 0) if (claim != null && claim.ChooserSlot == player.Slot && draft.BossLane.Length > 0)
claim.Lane = draft.BossLane; claim.Lane = draft.BossLane;
player.Undo.Clear(); player.Undo.Clear();
} }
if (Extended)
CommitTeamActions();
Combat = new LuneCombat(Map, Balance, RoundNumber); Combat = new LuneCombat(Map, Balance, RoundNumber);
foreach (BuildingDef definition in Map.Buildings) foreach (BuildingDef definition in Map.Buildings)
{ {
if (BuildingHp[definition.Id] > 0.0) if (BuildingHp[definition.Id] > 0.0)
{ Combat.AddBuilding(definition, BuildingHp[definition.Id]);
LuneUnit building = Combat.AddBuilding(definition, BuildingHp[definition.Id]);
int level = Extended && definition.Tier == "core" ? Boss.CoreLevel[definition.Team] : 0;
if (level > 0)
{
// S2 (Legion TD 2 king): the Ancient shoots at attackers in its reach.
building.Def.Damage = Balance.CoreDamage[GdMath.Min(level, Balance.CoreDamage.Length - 1)];
building.Def.AttackRange = Balance.CoreRange;
}
}
}
if (Extended)
{
for (int team = 0; team < 2; team++)
Combat.GlyphLane[team] = _glyphLane[team];
} }
SpawnWaves(); SpawnWaves();
if (Extended)
SpawnCamps();
SpawnChampions(); SpawnChampions();
SpawnDeployedBoss(); SpawnDeployedBoss();
SpawnArmies(); SpawnArmies();
@ -585,226 +499,16 @@ namespace Luneraria.Core
{ {
foreach (string lane in LuneMap.Lanes) foreach (string lane in LuneMap.Lanes)
{ {
List<UnitDef> lineup = Extended && BarracksBroken(team, lane) ? Reinforced(wave) : wave; for (int index = 0; index < wave.Count; index++)
for (int index = 0; index < lineup.Count; index++)
{ {
int row = index / 3; int row = index / 3;
double lateral = ((double)(index % 3) - 1.0) * 1.3; double lateral = ((double)(index % 3) - 1.0) * 1.3;
Combat.Spawn("monster", team, lane, lineup[index].Clone(), 11.0 - (double)row * 1.4, lateral); Combat.Spawn("monster", team, lane, wave[index].Clone(), 11.0 - (double)row * 1.4, lateral);
} }
} }
} }
} }
// ---------------------------------------------------------------- S3 extended rules
public static readonly string[] CampNames = { "Glutwächter", "Mondwächter", "Goldwächter" };
public static readonly string[] CampBuffNames = { "Glutsegen", "Mondschild", "Beute" };
/// <summary>S3: a camp round (League of Legends buff camps) has a guardian in the middle of every lane.</summary>
public bool CampRound(int round) { return Extended && round > 0 && round % GdMath.Max(1, Balance.CampEvery) == 0; }
public int CampBuffLeft(int team, string lane) { return Boss.CampBuff[team * 3 + LuneMap.LaneIndex(lane)]; }
/// <summary>A neutral guardian scaled like the waves of the round; the model is the Bruchhirsch.</summary>
public UnitDef CampDefinition(string lane)
{
UnitDef definition = DataCatalog.GetEnemy("e07");
definition.DisplayName = CampNames[LuneMap.LaneIndex(lane)];
definition.MaxHp = Balance.CampHp * LuneWaves.Strength(Balance, RoundNumber, Balance.WaveHpGrowth);
definition.Damage = Balance.CampDamage * LuneWaves.Strength(Balance, RoundNumber, Balance.WaveDamageGrowth);
definition.AttackRange = Balance.CampRange;
definition.Speed = 0.0;
definition.Bounty = 0;
definition.IsBoss = false;
definition.ViewScale = 1.35;
definition.Ability = "";
return definition;
}
void SpawnCamps()
{
if (!CampRound(RoundNumber))
return;
foreach (string lane in LuneMap.Lanes)
{
double middle = Map.LanePaths[lane].Length * 0.5;
LuneUnit camp = Combat.Spawn("camp", LuneCombat.Neutral, lane, CampDefinition(lane), middle, 0.0);
camp.Position = Map.LanePoint(0, lane, middle, 0.0);
camp.PreviousPosition = camp.Position;
}
}
/// <summary>Camp buffs on the army: Glutsegen (top) raises damage; Mondschild (mid) is applied as a shield at spawn.</summary>
UnitDef Buffed(UnitDef definition, int team)
{
if (Boss.CampBuff[team * 3] > 0)
definition.Damage *= 1.0 + Balance.CampDamageBuff;
return definition;
}
void CampShield(LuneUnit unit)
{
if (Extended && unit.Team < 2 && Boss.CampBuff[unit.Team * 3 + 1] > 0)
unit.GrantShield(unit.MaxHp * Balance.CampShieldBuff);
}
/// <summary>
/// Settlement of the camps: running buffs lose a combat, then every claimed camp gives its
/// lane's buff to the team that took it (Beute pays at once).
/// </summary>
void SettleCamps(int[] gains)
{
for (int i = 0; i < Boss.CampBuff.Length; i++)
Boss.CampBuff[i] = GdMath.Max(0, Boss.CampBuff[i] - 1);
for (int i = 0; i < Boss.Wards.Length; i++)
Boss.Wards[i] = GdMath.Max(0, Boss.Wards[i] - 1);
foreach (CombatEvent ev in Combat.Events)
{
if (ev.Kind != "camp" || ev.ClaimTeam < 0)
continue;
int lane = LuneMap.LaneIndex(ev.Lane);
if (lane == 2)
{
for (int slot = ev.ClaimTeam * 3; slot < ev.ClaimTeam * 3 + 3; slot++)
gains[slot] += Balance.CampLootGold;
}
else
{
Boss.CampBuff[ev.ClaimTeam * 3 + lane] = Balance.CampBuffRounds;
}
}
}
// ---------------------------------------------------------------- S2 extended rules
readonly string[] _glyphLane = { "", "" };
/// <summary>
/// Team actions of the drafts (S2): the glyph lane of the first player in slot order who
/// holds one, and the Ancient levels all players of a team bought (capped; the excess is
/// refunded). Each level repairs the Ancient by CoreRepair.
/// </summary>
void CommitTeamActions()
{
for (int team = 0; team < 2; team++)
{
_glyphLane[team] = "";
for (int slot = team * 3; slot < team * 3 + 3; slot++)
{
Player player = Players[slot];
// S3 wards: a new ward watches its lane for WardRounds combats.
foreach (string lane in player.Draft.WardLanes)
{
int index = team * 3 + LuneMap.LaneIndex(lane);
Boss.Wards[index] = GdMath.Max(Boss.Wards[index], Balance.WardRounds);
}
if (_glyphLane[team].Length == 0 && player.Draft.GlyphLane.Length > 0 && RoundNumber >= Boss.GlyphReady[team])
_glyphLane[team] = player.Draft.GlyphLane;
for (int i = 0; i < player.Draft.CoreInvest; i++)
{
int level = Boss.CoreLevel[team];
if (level >= Balance.CoreLevelMax)
{
player.Gold += Balance.CoreUpgradeCost(level - 1);
continue;
}
Boss.CoreLevel[team] = level + 1;
foreach (BuildingDef definition in Map.Buildings)
{
if (definition.Team == team && definition.Tier == "core" && BuildingHp[definition.Id] > 0.0)
BuildingHp[definition.Id] = GdMath.Min(definition.MaxHp, BuildingHp[definition.Id] + Balance.CoreRepair);
}
}
}
}
}
/// <summary>S2 recipe (Dota 2 / League of Legends): both parts and the fee become the recipe item, freeing a slot.</summary>
CommandResult Combine(HeroState hero, Draft draft, ItemSpec item)
{
if (!Extended)
return Result(false, "Rezepte gibt es nur mit erweiterten Regeln.");
if (hero.Items.Contains(item.Id))
return Result(false, item.Name + " trägt dein Held bereits; Items sind einzigartig.");
foreach (string part in item.Parts)
{
if (!hero.Items.Contains(part))
return Result(false, item.Name + " braucht " + string.Join(" und ", Array.ConvertAll(item.Parts, p => ContentData.Items[p].Name)) + ".");
}
if (LuneContent.LevelFor(hero.Xp) < item.MinLevel)
return Result(false, string.Format("{0} erfordert Stufe {1}.", item.Name, item.MinLevel));
if (draft.Gold < item.RecipeFee)
return Result(false, string.Format("Es fehlen {0} Gold.", item.RecipeFee - draft.Gold));
draft.Gold -= item.RecipeFee;
int at = hero.Items.IndexOf(item.Parts[0]);
foreach (string part in item.Parts)
{
hero.Items.Remove(part);
hero.FreshItems.Remove(part);
}
hero.Items.Insert(GdMath.Min(at, hero.Items.Count), item.Id);
return Result(true, item.Name + " geschmiedet.");
}
// ---------------------------------------------------------------- S1 extended rules
/// <summary>Legion TD 2: income a booked champion adds for good.</summary>
public int ChampionIncome(int cost) { return cost / GdMath.Max(1, Balance.ChampionIncomeDivisor); }
/// <summary>S3: the defenders' bounty of a champion (halved under the extended rules).</summary>
public int ChampionBountyFor(int bounty) { return Extended ? (int)Math.Floor(bounty * Balance.ChampionBountyShare) : bounty; }
public int BuybackCost(HeroState hero) { return Balance.BuybackCost(LuneContent.LevelFor(hero.Xp)); }
/// <summary>Dota 2 barracks: the enemy inner tower of this lane has fallen, so this team's waves there are reinforced.</summary>
public bool BarracksBroken(int team, string lane)
{
foreach (BuildingDef definition in Map.Buildings)
{
if (definition.Team == 1 - team && definition.Lane == lane && definition.Tier == "inner")
return BuildingHp[definition.Id] <= 0.0;
}
return false;
}
/// <summary>The wave stronger by BarracksBoost and longer by extra copies of its first monster.</summary>
List<UnitDef> Reinforced(List<UnitDef> wave)
{
var result = new List<UnitDef>();
foreach (UnitDef monster in wave)
{
UnitDef strong = monster.Clone();
strong.MaxHp *= 1.0 + Balance.BarracksBoost;
strong.Damage *= 1.0 + Balance.BarracksBoost;
result.Add(strong);
}
for (int extra = 0; extra < Balance.BarracksExtraMonsters && result.Count > 0; extra++)
result.Insert(0, result[0].Clone());
return result;
}
/// <summary>League of Legends dragon souls: Mondsegen stacks raise health and damage; the soul adds hero regeneration.</summary>
UnitDef Blessed(UnitDef definition, int team, string kind)
{
int stacks = GdMath.Min(Boss.Blessing[team], Balance.BlessingMax);
if (stacks <= 0)
return definition;
double factor = 1.0 + Balance.BlessingStep * stacks;
definition.MaxHp *= factor;
definition.Damage *= factor;
if (stacks >= Balance.BlessingMax && kind == "hero")
definition.Regen += Balance.SoulRegen;
return definition;
}
/// <summary>S1: an exhausted hero starts its combat with ExhaustedHp of its health.</summary>
void Exhaust(LuneUnit unit)
{
if (!Extended || unit.Kind != "hero" || unit.OwnerSlot < 0)
return;
HeroState hero = Players[unit.OwnerSlot].Hero;
if (hero != null && hero.Exhausted && hero.Uid == unit.PersistentUid)
unit.Hp = unit.MaxHp * Balance.ExhaustedHp;
}
void SpawnChampions() void SpawnChampions()
{ {
for (int team = 0; team < 2; team++) for (int team = 0; team < 2; team++)
@ -819,8 +523,6 @@ namespace Luneraria.Core
if (booking.DeployRound == RoundNumber && booking.Lane == lane) if (booking.DeployRound == RoundNumber && booking.Lane == lane)
{ {
UnitDef definition = LuneContent.ChampionDefinition(booking.ChampionId, RoundNumber, Balance); UnitDef definition = LuneContent.ChampionDefinition(booking.ChampionId, RoundNumber, Balance);
if (Extended)
definition.Bounty = ChampionBountyFor(definition.Bounty);
Combat.Spawn("champion", team, lane, definition, 13.0, ((double)(index % 3) - 1.0) * 1.4, slot, booking.Uid); Combat.Spawn("champion", team, lane, definition, 13.0, ((double)(index % 3) - 1.0) * 1.4, slot, booking.Uid);
index += 1; index += 1;
} }
@ -922,10 +624,7 @@ namespace Luneraria.Core
ArmyEntry entry = ordered[index]; ArmyEntry entry = ordered[index];
int row = index / 4; int row = index / 4;
double lateral = ((double)(index % 4) - 1.5) * 1.2; double lateral = ((double)(index % 4) - 1.5) * 1.2;
LuneUnit spawned = Combat.Spawn(entry.Kind, team, lane, Extended ? Buffed(Blessed(entry.Definition, team, entry.Kind), team) : entry.Definition, Combat.Spawn(entry.Kind, team, lane, entry.Definition, GdMath.Max(0.4, 7.2 - (double)row * 1.5), lateral, entry.Slot, entry.Uid);
GdMath.Max(0.4, 7.2 - (double)row * 1.5), lateral, entry.Slot, entry.Uid);
Exhaust(spawned);
CampShield(spawned);
} }
} }
} }
@ -943,9 +642,7 @@ namespace Luneraria.Core
{ {
ArmyEntry entry = ordered[index]; ArmyEntry entry = ordered[index];
Vec2 at = entryPoint - inward * (double)(index / 3) * 1.2 + across * ((double)(index % 3) - 1.0) * 1.1; Vec2 at = entryPoint - inward * (double)(index / 3) * 1.2 + across * ((double)(index % 3) - 1.0) * 1.1;
LuneUnit spawned = Combat.SpawnAt(entry.Kind, team, Grotto, Extended ? Buffed(Blessed(entry.Definition, team, entry.Kind), team) : entry.Definition, at, entry.Slot, entry.Uid); Combat.SpawnAt(entry.Kind, team, Grotto, entry.Definition, at, entry.Slot, entry.Uid);
Exhaust(spawned);
CampShield(spawned);
expedition = true; expedition = true;
} }
} }
@ -1030,27 +727,10 @@ namespace Luneraria.Core
if (player.Hero != null && xpGain.TryGetValue(player.Hero.Uid, out gained)) if (player.Hero != null && xpGain.TryGetValue(player.Hero.Uid, out gained))
player.Hero.Xp += gained; player.Hero.Xp += gained;
} }
if (Extended)
{
// S2 (Dota 2 glyph): only a glyph that fired goes on cooldown.
for (int team = 0; team < 2; team++)
{
if (Combat.GlyphUsed[team])
Boss.GlyphReady[team] = RoundNumber + 1 + Balance.GlyphCooldown;
}
// S1 (Dota 2 buyback, adapted): a hero that fell is exhausted for the next combat.
foreach (LuneUnit unit in Combat.Units)
{
if (unit.Kind == "hero" && unit.OwnerSlot >= 0 && Players[unit.OwnerSlot].Hero != null && Players[unit.OwnerSlot].Hero.Uid == unit.PersistentUid)
Players[unit.OwnerSlot].Hero.Exhausted = !unit.Alive;
}
}
if (Extended)
SettleCamps(gains);
int income = Balance.RoundIncome(RoundNumber); int income = Balance.RoundIncome(RoundNumber);
foreach (Player player in Players) foreach (Player player in Players)
{ {
int total = gains[player.Slot] + (Combat.DestroyedCores.Count > 0 ? 0 : income + (Extended ? player.IncomeBonus : 0)); int total = gains[player.Slot] + (Combat.DestroyedCores.Count > 0 ? 0 : income);
player.Gold += total; player.Gold += total;
player.Earned += total; player.Earned += total;
// Deployed bookings are consumed; they never return as property. // Deployed bookings are consumed; they never return as property.
@ -1121,10 +801,6 @@ namespace Luneraria.Core
Boss.Claim = new BossClaim { Team = team, WonRound = fought, DeployRound = fought + 1, ChooserSlot = chooser, Lane = Players[chooser].Lane }; Boss.Claim = new BossClaim { Team = team, WonRound = fought, DeployRound = fought + 1, ChooserSlot = chooser, Lane = Players[chooser].Lane };
Boss.NextAvailableRound = fought + 1 + LuneContent.BossLockRounds; Boss.NextAvailableRound = fought + 1 + LuneContent.BossLockRounds;
BossLog.Add(new BossLogEntry { Round = fought, Event = "won", Team = team, Chooser = chooser }); BossLog.Add(new BossLogEntry { Round = fought, Event = "won", Team = team, Chooser = chooser });
// S1 (League of Legends dragon souls): each conquest blesses the team for good.
if (Extended)
Boss.Blessing[team] = GdMath.Min(Balance.BlessingMax, Boss.Blessing[team] + 1);
// (S2 glyph cooldowns are settled in Settle.)
result = "won"; result = "won";
} }
else if (Combat.GrottoOutcome == "failed") else if (Combat.GrottoOutcome == "failed")

View file

@ -30,7 +30,7 @@ namespace Luneraria.Core
{ {
/// <summary>Attack type (row) against armour type (column): Klinge, Durchschlag, Impuls.</summary> /// <summary>Attack type (row) against armour type (column): Klinge, Durchschlag, Impuls.</summary>
public static readonly double[,] DamageMatrix = { { 1.30, 0.75, 1.00 }, { 1.00, 1.30, 0.75 }, { 0.75, 1.00, 1.30 } }; public static readonly double[,] DamageMatrix = { { 1.30, 0.75, 1.00 }, { 1.00, 1.30, 0.75 }, { 0.75, 1.00, 1.30 } };
public static readonly string[] MobileKinds = { "troop", "hero", "monster", "champion", "boss", "camp" }; public static readonly string[] MobileKinds = { "troop", "hero", "monster", "champion", "boss" };
/// <summary>Sequential per combat, assigned in spawn order (deterministic).</summary> /// <summary>Sequential per combat, assigned in spawn order (deterministic).</summary>
public int Id; public int Id;
@ -79,20 +79,12 @@ 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;
public bool IsBuilding() { return Kind == "tower" || Kind == "core"; } public bool IsBuilding() { return Kind == "tower" || Kind == "core"; }
/// <summary>Buildings and S3 camp guardians stay where they are and only fight in reach.</summary>
public bool IsStationary() { return IsBuilding() || Kind == "camp"; }
public bool IsMobile() { return Array.IndexOf(MobileKinds, Kind) >= 0; } public bool IsMobile() { return Array.IndexOf(MobileKinds, Kind) >= 0; }
public double AttackRange() { return Def.AttackRange; } public double AttackRange() { return Def.AttackRange; }
@ -108,8 +100,7 @@ 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()];
// H2: a unit marked by Brunhild's spear takes more damage ("vulnerable"; 0 for everyone else). return value * (1.0 - DamageReduction());
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>
@ -215,13 +206,8 @@ 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);
@ -233,8 +219,6 @@ 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

@ -38,8 +38,6 @@ namespace Luneraria.Core
public string Ultimate = ""; public string Ultimate = "";
/// <summary>H1: cosmetic skin ("" = standard), chosen freely in planning, visible to everyone.</summary> /// <summary>H1: cosmetic skin ("" = standard), chosen freely in planning, visible to everyone.</summary>
public string Skin = ""; public string Skin = "";
/// <summary>S1 (extended rules): fell in the last combat; starts the next one weakened unless bought back.</summary>
public bool Exhausted;
public HeroState Clone() public HeroState Clone()
{ {
@ -75,17 +73,10 @@ namespace Luneraria.Core
public List<Booking> NewBookings = new List<Booking>(); public List<Booking> NewBookings = new List<Booking>();
/// <summary>Lane chosen by the boss chooser in this planning, "" if unchanged.</summary> /// <summary>Lane chosen by the boss chooser in this planning, "" if unchanged.</summary>
public string BossLane = ""; public string BossLane = "";
/// <summary>S2: lane the player holds the team glyph ready for, "" = none.</summary>
public string GlyphLane = "";
/// <summary>S2: Ancient levels this player buys in this planning.</summary>
public int CoreInvest;
/// <summary>S3: lanes the player places a ward on in this planning.</summary>
public List<string> WardLanes = new List<string>();
public Draft Clone() public Draft Clone()
{ {
var copy = new Draft { Gold = Gold, NextSeq = NextSeq, BossLane = BossLane, GlyphLane = GlyphLane, CoreInvest = CoreInvest, Hero = Hero != null ? Hero.Clone() : null, var copy = new Draft { Gold = Gold, NextSeq = NextSeq, BossLane = BossLane, Hero = Hero != null ? Hero.Clone() : null };
WardLanes = new List<string>(WardLanes) };
foreach (RosterEntry entry in Roster) foreach (RosterEntry entry in Roster)
copy.Roster.Add(entry.Clone()); copy.Roster.Add(entry.Clone());
foreach (Booking booking in NewBookings) foreach (Booking booking in NewBookings)
@ -113,8 +104,6 @@ namespace Luneraria.Core
public int NextSeq; public int NextSeq;
public Draft Draft; public Draft Draft;
public List<Draft> Undo = new List<Draft>(); public List<Draft> Undo = new List<Draft>();
/// <summary>S1 (extended rules): permanent income from booked attack champions (Legion TD 2).</summary>
public int IncomeBonus;
} }
public sealed class BossClaim public sealed class BossClaim
@ -135,16 +124,6 @@ namespace Luneraria.Core
public BossClaim Claim; public BossClaim Claim;
/// <summary>Round whose settlement was already applied (idempotence), 0 = none.</summary> /// <summary>Round whose settlement was already applied (idempotence), 0 = none.</summary>
public int SettledRound; public int SettledRound;
/// <summary>S1 (extended rules): Mondsegen stacks per team from grotto victories (League of Legends dragon souls).</summary>
public int[] Blessing = new int[2];
/// <summary>S2 (extended rules): first round each team's glyph can be held again (Dota 2).</summary>
public int[] GlyphReady = { 1, 1 };
/// <summary>S2 (extended rules): Ancient level per team, 0..3 (Legion TD 2 king upgrades).</summary>
public int[] CoreLevel = new int[2];
/// <summary>S3 (extended rules): combats left of the camp buffs, index team × 3 + lane (top Glutsegen, mid Mondschild).</summary>
public int[] CampBuff = new int[6];
/// <summary>S3 (extended rules): rounds left of each team's ward per lane (team × 3 + lane).</summary>
public int[] Wards = new int[6];
} }
public sealed class BossLogEntry public sealed class BossLogEntry
@ -204,12 +183,6 @@ namespace Luneraria.Core
public List<string> Bunds = new List<string>(); public List<string> Bunds = new List<string>();
/// <summary>Optional fixed bot profile per slot (balance runs).</summary> /// <summary>Optional fixed bot profile per slot (balance runs).</summary>
public List<string> Profiles = new List<string>(); public List<string> Profiles = new List<string>();
/// <summary>
/// S1: extended rules after Legion TD 2, Dota 2 and League of Legends (champion income,
/// barracks, exhaustion and buyback, Mondsegen) and bots that may pick the heroes after
/// the reference. False = the reference rules of the port (golden replays, fingerprints).
/// </summary>
public bool Extended;
} }
/// <summary>Bot-private notes per slot, derived only from its own actions and public outcomes.</summary> /// <summary>Bot-private notes per slot, derived only from its own actions and public outcomes.</summary>
@ -267,13 +240,5 @@ namespace Luneraria.Core
public static Command UltimateRule(string rule) { return new Command { Type = "ultimate_rule", TypeId = rule }; } public static Command UltimateRule(string rule) { return new Command { Type = "ultimate_rule", TypeId = rule }; }
/// <summary>H1: cosmetic skin of the hero ("" = standard); the skin id travels in TypeId.</summary> /// <summary>H1: cosmetic skin of the hero ("" = standard); the skin id travels in TypeId.</summary>
public static Command HeroSkin(string skin) { return new Command { Type = "hero_skin", TypeId = skin }; } public static Command HeroSkin(string skin) { return new Command { Type = "hero_skin", TypeId = skin }; }
/// <summary>S1: buys an exhausted hero back to full strength for the next combat.</summary>
public static Command Buyback() { return new Command { Type = "buyback" }; }
/// <summary>S2: hold the team glyph for a lane in the coming combat ("" withdraws it).</summary>
public static Command Glyph(string lane) { return new Command { Type = "glyph", Lane = lane }; }
/// <summary>S2: buy the next Ancient level for the team.</summary>
public static Command CoreUpgrade() { return new Command { Type = "core_upgrade" }; }
/// <summary>S3: place a ward on a lane (fog of war).</summary>
public static Command Ward(string lane) { return new Command { Type = "ward", Lane = lane }; }
} }
} }

View file

@ -48,7 +48,6 @@ 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);
@ -181,24 +180,6 @@ 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

@ -185,18 +185,6 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: 48235766686d249dfb6f4463f7a554c7, type: 2} Neutral: {fileID: 2100000, guid: 48235766686d249dfb6f4463f7a554c7, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
Rot: {fileID: 0} Rot: {fileID: 0}
- Key: AI_Basaltbastion
Neutral: {fileID: 2100000, guid: 2844b8628dab84e70bea79fbffa9958f, type: 2}
Blau: {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}
@ -229,10 +217,6 @@ MonoBehaviour:
Neutral: {fileID: 2100000, guid: 93a8cf8007ee9440bb5da876affb71ff, type: 2} Neutral: {fileID: 2100000, guid: 93a8cf8007ee9440bb5da876affb71ff, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
Rot: {fileID: 0} Rot: {fileID: 0}
- Key: AI_Sonnenesse
Neutral: {fileID: 2100000, guid: 5b981266cd95f494096dd602cad81f3d, type: 2}
Blau: {fileID: 0}
Rot: {fileID: 0}
- Key: AI_Sylvara - Key: AI_Sylvara
Neutral: {fileID: 2100000, guid: 00ddb73ac97f84f3aa8a67f370518a03, type: 2} Neutral: {fileID: 2100000, guid: 00ddb73ac97f84f3aa8a67f370518a03, type: 2}
Blau: {fileID: 0} Blau: {fileID: 0}
@ -753,14 +737,6 @@ 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

@ -1,31 +0,0 @@
%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

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

View file

@ -1,68 +0,0 @@
%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_Basaltbastion
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: 0d36246861f5e495c9a37eebff823d05, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: fb23cd5309e9a4cc280eaf1093b8e477, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: ced81c900c77948e38af00218f6fe9b5, 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

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

View file

@ -1,68 +0,0 @@
%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

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

View file

@ -1,68 +0,0 @@
%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

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

View file

@ -1,68 +0,0 @@
%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

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

View file

@ -1,68 +0,0 @@
%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

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

View file

@ -1,68 +0,0 @@
%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_Sonnenesse
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: a8d89482b31b946289ecd7628b8840a8, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 9c1740c7144b44bb8a0008a61f4e21e5, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OrmMap:
m_Texture: {fileID: 2800000, guid: 29aa5535e9c7246318d8345583175348, 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

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

View file

@ -187,7 +187,6 @@ namespace Luneraria.Net
Int(text, options.HumanSlot); Int(text, options.HumanSlot);
Str(text, options.Bunds != null ? string.Join("\x1d", options.Bunds) : ""); Str(text, options.Bunds != null ? string.Join("\x1d", options.Bunds) : "");
Str(text, options.Profiles != null ? string.Join("\x1d", options.Profiles) : ""); Str(text, options.Profiles != null ? string.Join("\x1d", options.Profiles) : "");
Int(text, options.Extended ? 1 : 0);
} }
static void WriteLobby(StringBuilder text, LobbyEntry entry) static void WriteLobby(StringBuilder text, LobbyEntry entry)
@ -224,17 +223,6 @@ namespace Luneraria.Net
Int(text, boss.Claim.ChooserSlot); Int(text, boss.Claim.ChooserSlot);
Str(text, boss.Claim.Lane ?? ""); Str(text, boss.Claim.Lane ?? "");
} }
Int(text, boss.Blessing != null && boss.Blessing.Length > 0 ? boss.Blessing[0] : 0);
Int(text, boss.Blessing != null && boss.Blessing.Length > 1 ? boss.Blessing[1] : 0);
for (int team = 0; team < 2; team++)
{
Int(text, boss.GlyphReady != null && boss.GlyphReady.Length > team ? boss.GlyphReady[team] : 1);
Int(text, boss.CoreLevel != null && boss.CoreLevel.Length > team ? boss.CoreLevel[team] : 0);
}
for (int i = 0; i < 6; i++)
Int(text, boss.CampBuff != null && boss.CampBuff.Length > i ? boss.CampBuff[i] : 0);
for (int i = 0; i < 6; i++)
Int(text, boss.Wards != null && boss.Wards.Length > i ? boss.Wards[i] : 0);
var cores = state.DestroyedCores ?? new List<int>(); var cores = state.DestroyedCores ?? new List<int>();
Int(text, cores.Count); Int(text, cores.Count);
foreach (int core in cores) foreach (int core in cores)
@ -274,7 +262,6 @@ namespace Luneraria.Net
Int(text, row.Spent); Int(text, row.Spent);
Int(text, row.NextSeq); Int(text, row.NextSeq);
Int(text, row.Undo); Int(text, row.Undo);
Int(text, row.IncomeBonus);
WriteRosterList(text, row.Roster); WriteRosterList(text, row.Roster);
Int(text, row.Hero != null ? 1 : 0); Int(text, row.Hero != null ? 1 : 0);
if (row.Hero != null) if (row.Hero != null)
@ -287,9 +274,6 @@ namespace Luneraria.Net
Int(text, draft.Gold); Int(text, draft.Gold);
Int(text, draft.NextSeq); Int(text, draft.NextSeq);
Str(text, draft.BossLane ?? ""); Str(text, draft.BossLane ?? "");
Str(text, draft.GlyphLane ?? "");
Int(text, draft.CoreInvest);
Str(text, string.Join("\x1d", draft.WardLanes));
WriteRosterList(text, draft.Roster); WriteRosterList(text, draft.Roster);
Int(text, draft.Hero != null ? 1 : 0); Int(text, draft.Hero != null ? 1 : 0);
if (draft.Hero != null) if (draft.Hero != null)
@ -342,7 +326,6 @@ namespace Luneraria.Net
Str(text, hero.FreshItems != null ? string.Join("\x1d", hero.FreshItems) : ""); Str(text, hero.FreshItems != null ? string.Join("\x1d", hero.FreshItems) : "");
Str(text, hero.Ultimate ?? ""); Str(text, hero.Ultimate ?? "");
Str(text, hero.Skin ?? ""); Str(text, hero.Skin ?? "");
Int(text, hero.Exhausted ? 1 : 0);
} }
static void WriteUnit(StringBuilder text, NetUnitRecord unit) static void WriteUnit(StringBuilder text, NetUnitRecord unit)
@ -616,7 +599,6 @@ namespace Luneraria.Net
string profiles = Text(); string profiles = Text();
if (!string.IsNullOrEmpty(profiles)) if (!string.IsNullOrEmpty(profiles))
options.Profiles.AddRange(profiles.Split('\x1d')); options.Profiles.AddRange(profiles.Split('\x1d'));
options.Extended = Integer() == 1;
return options; return options;
} }
@ -668,16 +650,6 @@ namespace Luneraria.Net
Lane = Text() ?? "" Lane = Text() ?? ""
}; };
} }
state.Boss.Blessing = new[] { Integer(), Integer() };
for (int team = 0; team < 2; team++)
{
state.Boss.GlyphReady[team] = Integer(1);
state.Boss.CoreLevel[team] = Integer();
}
for (int i = 0; i < 6; i++)
state.Boss.CampBuff[i] = Integer();
for (int i = 0; i < 6; i++)
state.Boss.Wards[i] = Integer();
int coreCount = Integer(); int coreCount = Integer();
for (int i = 0; i < coreCount; i++) for (int i = 0; i < coreCount; i++)
state.DestroyedCores.Add(Integer()); state.DestroyedCores.Add(Integer());
@ -717,8 +689,7 @@ namespace Luneraria.Net
Earned = Integer(), Earned = Integer(),
Spent = Integer(), Spent = Integer(),
NextSeq = Integer(), NextSeq = Integer(),
Undo = Integer(), Undo = Integer()
IncomeBonus = Integer()
}; };
row.Roster = ReadRosterList(); row.Roster = ReadRosterList();
if (Flag()) if (Flag())
@ -726,8 +697,7 @@ namespace Luneraria.Net
row.Bookings = ReadBookingList(); row.Bookings = ReadBookingList();
if (Flag()) if (Flag())
{ {
var draft = new Draft { Gold = Integer(), NextSeq = Integer(), BossLane = Text() ?? "", GlyphLane = Text() ?? "", CoreInvest = Integer() }; var draft = new Draft { Gold = Integer(), NextSeq = Integer(), BossLane = Text() ?? "" };
AddSplit(draft.WardLanes, Text());
draft.Roster = ReadRosterList(); draft.Roster = ReadRosterList();
if (Flag()) if (Flag())
draft.Hero = ReadHero(); draft.Hero = ReadHero();
@ -792,7 +762,6 @@ namespace Luneraria.Net
AddSplit(hero.FreshItems, Text()); AddSplit(hero.FreshItems, Text());
hero.Ultimate = Text() ?? ""; hero.Ultimate = Text() ?? "";
hero.Skin = Text() ?? ""; hero.Skin = Text() ?? "";
hero.Exhausted = Integer() == 1;
return hero; return hero;
} }

File diff suppressed because it is too large Load diff

View file

@ -22,12 +22,6 @@ MonoBehaviour:
- Id: basaltbastion - Id: basaltbastion
Prefab: {fileID: 919132149155446097, guid: 841c5b5333cc141a6bde6c22d3dc2884, type: 3} Prefab: {fileID: 919132149155446097, guid: 841c5b5333cc141a6bde6c22d3dc2884, type: 3}
Controller: {fileID: 9100000, guid: ec68488f0997c4a8185eea30724740ff, type: 2} Controller: {fileID: 9100000, guid: ec68488f0997c4a8185eea30724740ff, type: 2}
- Id: basaltbastion_meshy
Prefab: {fileID: 919132149155446097, guid: aa5734da897ea44808385f37d34070bf, type: 3}
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}
@ -74,8 +68,8 @@ MonoBehaviour:
Prefab: {fileID: 919132149155446097, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3} Prefab: {fileID: 919132149155446097, guid: 2a144fe945cf34c34a772171ca5034b1, type: 3}
Controller: {fileID: 9100000, guid: 34bd3ea42721340d7a9c58fa3585219a, type: 2} Controller: {fileID: 9100000, guid: 34bd3ea42721340d7a9c58fa3585219a, type: 2}
- Id: g04 - Id: g04
Prefab: {fileID: 919132149155446097, guid: aa5734da897ea44808385f37d34070bf, type: 3} Prefab: {fileID: 919132149155446097, guid: 841c5b5333cc141a6bde6c22d3dc2884, type: 3}
Controller: {fileID: 9100000, guid: a456a0a7fa6d34b699183f75137f8f86, type: 2} Controller: {fileID: 9100000, guid: ec68488f0997c4a8185eea30724740ff, type: 2}
- Id: g05 - Id: g05
Prefab: {fileID: 919132149155446097, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3} Prefab: {fileID: 919132149155446097, guid: 70c39c469a6fa406f85b60c8407d95c9, type: 3}
Controller: {fileID: 9100000, guid: 44426d34820fe40da91e59336999b8a9, type: 2} Controller: {fileID: 9100000, guid: 44426d34820fe40da91e59336999b8a9, type: 2}
@ -92,8 +86,8 @@ MonoBehaviour:
Prefab: {fileID: 919132149155446097, guid: b8441e587f74d4644ae91dbc0a6aa237, type: 3} Prefab: {fileID: 919132149155446097, guid: b8441e587f74d4644ae91dbc0a6aa237, type: 3}
Controller: {fileID: 9100000, guid: c39607363641a49fda53739117ea26a4, type: 2} Controller: {fileID: 9100000, guid: c39607363641a49fda53739117ea26a4, type: 2}
- Id: g10 - Id: g10
Prefab: {fileID: 919132149155446097, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3} Prefab: {fileID: 919132149155446097, guid: eab745fe77c754fc8802ef073fcd610b, type: 3}
Controller: {fileID: 9100000, guid: a6aed2254a9e24da1bd5e51c687e445c, type: 2} Controller: {fileID: 0}
- Id: glasballiste - Id: glasballiste
Prefab: {fileID: 919132149155446097, guid: 71588361ff1ed4a72a13d46d2f3753be, type: 3} Prefab: {fileID: 919132149155446097, guid: 71588361ff1ed4a72a13d46d2f3753be, type: 3}
Controller: {fileID: 9100000, guid: 25806d20be161460284fa5cd0affc84b, type: 2} Controller: {fileID: 9100000, guid: 25806d20be161460284fa5cd0affc84b, type: 2}
@ -220,9 +214,6 @@ MonoBehaviour:
- Id: schlundkrone - Id: schlundkrone
Prefab: {fileID: 919132149155446097, guid: b2dd57798499c4b7b8698ee56e676c45, type: 3} Prefab: {fileID: 919132149155446097, guid: b2dd57798499c4b7b8698ee56e676c45, type: 3}
Controller: {fileID: 9100000, guid: 55d11e29be0134459bf261f2dad38f33, type: 2} Controller: {fileID: 9100000, guid: 55d11e29be0134459bf261f2dad38f33, type: 2}
- Id: sonnenesse
Prefab: {fileID: 919132149155446097, guid: 04bd9b7cb5ca94d5193b6bb045ad3f7f, type: 3}
Controller: {fileID: 9100000, guid: a6aed2254a9e24da1bd5e51c687e445c, type: 2}
- Id: sylvara - Id: sylvara
Prefab: {fileID: 919132149155446097, guid: 6ec31d870bd7f4b71b9810cb0a14ba9a, type: 3} Prefab: {fileID: 919132149155446097, guid: 6ec31d870bd7f4b71b9810cb0a14ba9a, type: 3}
Controller: {fileID: 9100000, guid: a9f7e924f692041b38fc5703d10e1cec, type: 2} Controller: {fileID: 9100000, guid: a9f7e924f692041b38fc5703d10e1cec, type: 2}
@ -273,7 +264,6 @@ 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

@ -1,39 +0,0 @@
// 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

@ -1,9 +0,0 @@
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(), new H2HeroSuite(), new S4NetSuite() }; return new List<CheckSuite> { new ContentSuite(), new CoreRulesSuite(), new M2RulesSuite(), new GoldenSuite(), new DeterminismSuite(), new NetSuite(), new NetRoundsSuite(), new H1HeroSuite() };
} }
} }
} }

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", "held_brunhild" }), "heroes: exactly the documented later heroes (H1 Sylvara, H2 Brunhild)"); Check(ContentData.Heroes.Keys.Skip(ContentData.ReferenceHeroes.Length).SequenceEqual(new[] { "held_sylvara" }), "heroes: exactly the documented later heroes (H1: held_sylvara)");
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);
@ -116,10 +116,7 @@ namespace Luneraria.Core.Tests
void CompareItems(OrderedMap<string, object> expected) void CompareItems(OrderedMap<string, object> expected)
{ {
// S2 recipe items follow the reference items; those must match exactly. Check(expected.Keys.SequenceEqual(ContentData.Items.Keys), "items: same ids in the same order");
Check(expected.Keys.SequenceEqual(ContentData.ReferenceItems) && ContentData.Items.Keys.Take(ContentData.ReferenceItems.Length).SequenceEqual(ContentData.ReferenceItems),
"items: same reference ids in the same order, recipes after them");
Check(ContentData.Items.Values.Skip(ContentData.ReferenceItems.Length).All(item => item.IsRecipe), "items after the reference are recipes (S2)");
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

@ -1,148 +0,0 @@
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

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

View file

@ -1,184 +0,0 @@
using System.Collections.Generic;
using System.Linq;
namespace Luneraria.Core.Tests
{
/// <summary>
/// S1: the extended rules after Legion TD 2, Dota 2 and League of Legends (MatchOptions.Extended).
/// Champion income, barracks, exhaustion and buyback, Mondsegen, the bot rotation with later
/// heroes, and that none of it acts under the reference rules.
/// </summary>
public sealed class S1RulesSuite : CheckSuite
{
public override string Name { get { return "s1"; } }
protected override void RunChecks()
{
TestReferenceUntouched();
TestChampionIncome();
TestBarracks();
TestExhaustionAndBuyback();
TestBlessing();
TestBots();
}
static LuneMatch NewMatch(bool extended, int seed = 41)
{
var state = new LuneMatch();
state.Setup(new MatchOptions { Seed = seed, HumanSlot = -1, Extended = extended,
Bunds = new List<string> { "glutpakt", "wurzelbund", "glutpakt", "wurzelbund", "glutpakt", "wurzelbund" } });
return state;
}
void TestReferenceUntouched()
{
LuneMatch state = NewMatch(false);
Check(!state.Extended, "default options keep the reference rules");
state.Players[0].Draft.Gold += 1000;
state.Submit(0, Command.ChampionBook("ch_schutz", "top"));
state.Submit(0, Command.HeroBuy("held_ringborke"));
state.BeginCombat();
Check(state.Players[0].IncomeBonus == 0, "reference: a champion gives no income");
foreach (LuneUnit unit in state.Combat.Units.Where(u => u.Kind == "hero"))
unit.Hp = 0.0;
state.FinishCombat();
Check(!state.Players[0].Hero.Exhausted, "reference: a fallen hero is not exhausted");
Check(!state.Submit(0, Command.Buyback()).Ok, "reference: no buyback");
var setup = new LuneMatch();
setup.Setup(new MatchOptions { Seed = 3 });
Check(!setup.Extended, "MatchOptions.Extended defaults to false");
}
void TestChampionIncome()
{
LuneMatch state = NewMatch(true);
state.Players[0].Draft.Gold += 1000;
Check(state.Submit(0, Command.ChampionBook("ch_schutz", "top")).Ok, "book a champion");
Check(state.Players[0].IncomeBonus == 0, "income rises only when the booking is committed");
state.Submit(0, Command.ChampionCancel(state.Players[0].Draft.NewBookings[0].Uid));
state.Submit(0, Command.ChampionBook("ch_belagerung", "mid"));
state.BeginCombat();
Check(state.Players[0].IncomeBonus == 180 / 12, "Keilbrecher adds 15 income for good (" + state.Players[0].IncomeBonus + ")");
int before = state.Players[0].Gold;
int beforeOther = state.Players[1].Gold;
state.FinishCombat();
int gain = state.Players[0].Gold - before;
int gainOther = state.Players[1].Gold - beforeOther;
Check(gain - state.LastSettlement.Gains[0] == state.LastSettlement.Income + 15, "settlement pays round income plus the champion income");
Check(gainOther - state.LastSettlement.Gains[1] == state.LastSettlement.Income, "other seats get the plain income");
}
void TestBarracks()
{
LuneMatch state = NewMatch(true);
Check(!state.BarracksBroken(0, "mid"), "barracks intact at the start");
state.BuildingHp["rot_mid_inner"] = 0.0;
Check(state.BarracksBroken(0, "mid") && !state.BarracksBroken(1, "mid") && !state.BarracksBroken(0, "top"), "Blau's mid waves are reinforced once Rot's inner mid tower fell");
state.BeginCombat();
List<LuneUnit> blueMid = state.Combat.Units.Where(u => u.Kind == "monster" && u.Team == 0 && u.Lane == "mid").ToList();
List<LuneUnit> blueTop = state.Combat.Units.Where(u => u.Kind == "monster" && u.Team == 0 && u.Lane == "top").ToList();
List<LuneUnit> redMid = state.Combat.Units.Where(u => u.Kind == "monster" && u.Team == 1 && u.Lane == "mid").ToList();
Check(blueMid.Count == blueTop.Count + 1 && redMid.Count == blueTop.Count, "one extra monster on the broken lane only");
Check(GdMath.IsEqualApprox(blueMid.Last().MaxHp, blueTop.Last().MaxHp * 1.25), "reinforced monsters have 125 % health");
LuneMatch reference = NewMatch(false);
reference.BuildingHp["rot_mid_inner"] = 0.0;
reference.BeginCombat();
Check(reference.Combat.Units.Count(u => u.Kind == "monster" && u.Team == 0 && u.Lane == "mid") == blueTop.Count, "reference: no barracks effect");
}
void TestExhaustionAndBuyback()
{
LuneMatch state = NewMatch(true);
state.Players[1].Draft.Gold += 2000;
state.Submit(1, Command.HeroBuy("held_sylvara"));
Check(!state.Submit(1, Command.Buyback()).Ok, "no buyback for a fresh hero");
state.BeginCombat();
LuneUnit hero = state.Combat.Units.First(u => u.Kind == "hero" && u.OwnerSlot == 1);
hero.Hp = 0.0;
state.FinishCombat();
HeroState committed = state.Players[1].Hero;
Check(committed.Exhausted, "a hero that fell is exhausted");
state.BeginCombat();
hero = state.Combat.Units.First(u => u.Kind == "hero" && u.OwnerSlot == 1);
Check(GdMath.IsEqualApprox(hero.Hp, hero.MaxHp * 0.6), "an exhausted hero starts with 60 % health");
state.FinishCombat();
Check(!state.Players[1].Hero.Exhausted || !state.Combat.Units.First(u => u.Kind == "hero" && u.OwnerSlot == 1).Alive, "surviving clears the exhaustion");
state.Players[1].Hero.Exhausted = true;
state.Players[1].Draft = state.Snapshot(state.Players[1]);
int level = LuneContent.LevelFor(state.Players[1].Hero.Xp);
int cost = 60 + 20 * level;
int gold = state.GoldOf(1);
Check(state.Submit(1, Command.Buyback()).Ok && state.GoldOf(1) == gold - cost, "buyback costs 60 + 20 × level (" + cost + ")");
Check(state.Undo(1).Ok && state.GoldOf(1) == gold && state.Players[1].Draft.Hero.Exhausted, "buyback can be undone");
state.Submit(1, Command.Buyback());
state.BeginCombat();
hero = state.Combat.Units.First(u => u.Kind == "hero" && u.OwnerSlot == 1);
Check(hero.Hp == hero.MaxHp, "a bought back hero starts at full health");
state.FinishCombat();
}
void TestBlessing()
{
LuneMatch state = NewMatch(true);
state.Players[0].Draft.Gold += 1000;
state.Submit(0, Command.Buy("g01", "top"));
state.Submit(0, Command.HeroBuy("held_funkenlanze"));
state.BeginCombat();
state.Combat.GrottoOutcome = "success";
state.Combat.GrottoClaimTeam = 0;
state.SettleBoss();
Check(state.Boss.Blessing[0] == 1 && state.Boss.Blessing[1] == 0, "a grotto victory blesses the winning team");
state.FinishCombat();
state.Boss.Blessing[0] = 2;
state.BeginCombat();
LuneUnit troop = state.Combat.Units.First(u => u.Kind == "troop" && u.OwnerSlot == 0);
Check(GdMath.IsEqualApprox(troop.MaxHp, DataCatalog.GetUnit("g01").MaxHp * 1.08), "two stacks: troops have 108 % health");
LuneUnit enemy = state.Combat.Units.FirstOrDefault(u => u.Kind == "troop" && u.Team == 1);
Check(enemy == null || GdMath.IsEqualApprox(enemy.MaxHp, DataCatalog.GetUnit(enemy.Def.Id).MaxHp), "the other team is not blessed");
state.FinishCombat();
state.Boss.Blessing[0] = 4;
state.BeginCombat();
LuneUnit hero = state.Combat.Units.First(u => u.Kind == "hero" && u.OwnerSlot == 0);
Check(GdMath.IsEqualApprox(hero.Def.Regen, 0.01), "Mondseele: heroes regenerate 1 % per second");
state.FinishCombat();
state.Combat.GrottoOutcome = "success";
state.Combat.GrottoClaimTeam = 0;
state.Boss.SettledRound = 0;
state.Boss.Claim = null;
state.Boss.NextAvailableRound = 1;
state.SettleBoss();
Check(state.Boss.Blessing[0] == 4, "Mondsegen stops at four stacks");
}
void TestBots()
{
bool sylvaraPicked = false;
for (int seed = 1; seed <= 20 && !sylvaraPicked; seed++)
{
LuneMatch probe = NewMatch(true, seed);
for (int slot = 0; slot < 6; slot++)
sylvaraPicked |= LuneBot.ProfileFor(probe, slot) == "assassine";
}
Check(sylvaraPicked, "extended rules: the bot rotation includes Sylvara's profile");
string first = Play(17, out LuneMatch played);
Check(first == Play(17, out LuneMatch _), "extended bot matches are deterministic");
Check(played.Phase == Phase.Over, "an extended bot match ends by an Ancient (" + first.Split('|')[0] + ")");
Check(played.Players.Any(p => p.IncomeBonus > 0), "bots earn champion income");
Note("extended seed 17: " + first.Split('|')[0] + ", income bonus " + string.Join(",", played.Players.Select(p => p.IncomeBonus)) + ", blessing " + played.Boss.Blessing[0] + "/" + played.Boss.Blessing[1]);
}
static string Play(int seed, out LuneMatch match)
{
match = NewMatch(true, seed);
while (match.Phase != Phase.Over && match.RoundNumber <= 80)
{
for (int slot = 0; slot < 6; slot++)
LuneBot.Plan(match, slot);
match.BeginCombat();
match.FinishCombat();
}
return match.RoundNumber + "/" + match.Winner + "|" + string.Join(",", match.Players.Select(p => p.Gold + ":" + p.Earned + ":" + p.IncomeBonus))
+ "|" + string.Join(",", match.BuildingHp.Values.Select(v => v.ToString("R", System.Globalization.CultureInfo.InvariantCulture)));
}
}
}

View file

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 9e62ba3250254f8ba4fee06c56dfec7d

View file

@ -1,162 +0,0 @@
using System.Collections.Generic;
using System.Linq;
namespace Luneraria.Core.Tests
{
/// <summary>
/// S2: glyph (Dota 2), item recipes (Dota 2 / League of Legends), Ancient levels (Legion TD 2
/// king) and the bots' grotto hunt under the extended rules; none of it under the reference rules.
/// </summary>
public sealed class S2RulesSuite : CheckSuite
{
public override string Name { get { return "s2"; } }
protected override void RunChecks()
{
TestReference();
TestGlyph();
TestRecipes();
TestCore();
TestBots();
}
static LuneMatch NewMatch(bool extended, int seed = 51)
{
var state = new LuneMatch();
state.Setup(new MatchOptions { Seed = seed, HumanSlot = -1, Extended = extended,
Bunds = new List<string> { "glutpakt", "wurzelbund", "glutpakt", "wurzelbund", "glutpakt", "wurzelbund" } });
return state;
}
void TestReference()
{
LuneMatch state = NewMatch(false);
state.Players[0].Draft.Gold += 3000;
Check(!state.Submit(0, Command.Glyph("mid")).Ok, "reference: no glyph");
Check(!state.Submit(0, Command.CoreUpgrade()).Ok, "reference: no Ancient levels");
state.Submit(0, Command.HeroBuy("held_ringborke"));
state.Submit(0, Command.ItemBuy("basaltschild"));
state.Submit(0, Command.ItemBuy("rankenmantel"));
Check(!state.Submit(0, Command.ItemBuy("bollwerk")).Ok, "reference: no recipes");
state.BeginCombat();
Check(state.Combat.Buildings.Values.All(b => b.Kind != "core" || b.Def.Damage == 0.0), "reference: the Ancients do not shoot");
}
void TestGlyph()
{
LuneMatch state = NewMatch(true);
Check(!state.Submit(0, Command.Glyph("river")).Ok, "unknown lane rejected");
Check(state.Submit(1, Command.Glyph("mid")).Ok && state.Players[1].Draft.GlyphLane == "mid", "a player holds the team glyph for a lane");
state.Submit(0, Command.Glyph("top"));
state.BeginCombat();
Check(state.Combat.GlyphLane[0] == "top", "the first seat in slot order decides the team glyph");
LuneUnit tower = state.Combat.Buildings["blau_top_outer"];
tower.Hp = tower.MaxHp * 0.4;
state.Combat.Step();
Check(state.Combat.GlyphUsed[0] && state.Combat.Glyphed(tower), "the glyph fires once a tower of the lane is below half health");
double before = tower.Hp;
var gates = state.Combat.AliveMap();
state.Combat.QueueDamage(tower, 500.0, gates);
Check(!state.Combat.HasPendingDamage(tower), "glyphed towers take no damage");
Check(!state.Combat.Glyphed(state.Combat.Buildings["blau_mid_outer"]), "other lanes are not protected");
for (int i = 0; i < 120; i++)
state.Combat.Step();
Check(!state.Combat.Glyphed(tower), "the glyph ends after 5 s");
state.FinishCombat();
Check(state.Boss.GlyphReady[0] == state.RoundNumber - 1 + 1 + 4, "a fired glyph returns after 4 rounds (" + state.Boss.GlyphReady[0] + ")");
Check(!state.Submit(0, Command.Glyph("top")).Ok, "on cooldown the glyph cannot be held");
Check(state.Boss.GlyphReady[1] == 1, "the other team's glyph is untouched");
LuneMatch idle = NewMatch(true);
idle.Submit(2, Command.Glyph("bot"));
idle.BeginCombat();
idle.FinishCombat();
Check(idle.Combat.GlyphUsed[0] || idle.Boss.GlyphReady[0] == 1, "a glyph that never fired costs no cooldown");
}
void TestRecipes()
{
LuneMatch state = NewMatch(true);
state.Players[0].Draft.Gold += 3000;
state.Submit(0, Command.HeroBuy("held_ringborke"));
Check(!state.Submit(0, Command.ItemBuy("bollwerk")).Ok, "a recipe needs its parts");
state.Submit(0, Command.ItemBuy("basaltschild"));
state.Submit(0, Command.ItemBuy("rankenmantel"));
state.Submit(0, Command.ItemBuy("glutklinge"));
int gold = state.GoldOf(0);
Check(state.Submit(0, Command.ItemBuy("bollwerk")).Ok && state.GoldOf(0) == gold - 120, "combining costs the fee of 120");
HeroState hero = state.Players[0].Draft.Hero;
Check(hero.Items.SequenceEqual(new[] { "bollwerk", "glutklinge" }), "parts become the recipe item, a slot is free");
UnitDef definition = LuneContent.HeroDefinition(hero);
Check(GdMath.IsEqualApprox(definition.MaxHp, 2200.0 + 600.0) && GdMath.IsEqualApprox(definition.ReductionBonus, 0.15), "Bollwerk: +600 health, +15 % reduction");
Check(state.Undo(0).Ok && state.Players[0].Draft.Hero.Items.Count == 3, "combining can be undone");
state.Submit(0, Command.ItemBuy("bollwerk"));
Check(!state.Submit(0, Command.ItemBuy("splitterkrone")).Ok, "Splitterkrone needs its parts and level 5");
state.BeginCombat();
state.FinishCombat();
int sellGold = state.GoldOf(0);
Check(state.Submit(0, Command.ItemSell("bollwerk")).Ok && state.GoldOf(0) == sellGold + 250, "a recipe item sells for half its total (250)");
}
void TestCore()
{
LuneMatch state = NewMatch(true);
state.Players[0].Draft.Gold += 3000;
state.Players[1].Draft.Gold += 3000;
state.BuildingHp["blau_ancient"] = 5000.0;
int gold = state.GoldOf(0);
Check(state.Submit(0, Command.CoreUpgrade()).Ok && state.GoldOf(0) == gold - 150, "the first Ancient level costs 150");
Check(state.Submit(0, Command.CoreUpgrade()).Ok && state.GoldOf(0) == gold - 450, "the second costs 300");
Check(state.Submit(1, Command.CoreUpgrade()).Ok && state.Submit(1, Command.CoreUpgrade()).Ok, "a teammate buys too (priced by the committed level)");
state.BeginCombat();
Check(state.Boss.CoreLevel[0] == 3 && state.Boss.CoreLevel[1] == 0, "levels are capped at 3 for the team");
Check(state.Players[1].Gold > 0, "the teammate's excess level is refunded");
LuneUnit core = state.Combat.Buildings["blau_ancient"];
Check(GdMath.IsEqualApprox(core.Def.Damage, 110.0) && GdMath.IsEqualApprox(core.Def.AttackRange, 7.5), "level 3: the Ancient shoots 110 in 7.5 m");
Check(GdMath.IsEqualApprox(core.Hp, 8000.0), "each level repaired 1,000 (5,000 → 8,000)");
Check(!state.Submit(0, Command.CoreUpgrade()).Ok, "no commands in combat");
state.FinishCombat();
Check(!state.Submit(0, Command.CoreUpgrade()).Ok, "no level above 3");
}
void TestBots()
{
int hunts = 0;
int blessings = 0;
int combines = 0;
int glyphs = 0;
int cores = 0;
string first = "";
for (int seed = 1; seed <= 12; seed++)
{
LuneMatch match = NewMatch(true, seed);
while (match.Phase != Phase.Over && match.RoundNumber <= 80)
{
for (int slot = 0; slot < 6; slot++)
LuneBot.Plan(match, slot);
if (match.Players.Any(p => p.Draft.Roster.Any(r => r.Lane == LuneMatch.Grotto)))
hunts++;
match.BeginCombat();
match.FinishCombat();
glyphs += match.Combat.GlyphUsed.Count(used => used);
}
blessings += match.Boss.Blessing[0] + match.Boss.Blessing[1];
cores += match.Boss.CoreLevel[0] + match.Boss.CoreLevel[1];
combines += match.Players.Count(p => p.Hero != null && p.Hero.Items.Any(id => ContentData.Items[id].IsRecipe));
if (seed == 1)
first = match.RoundNumber + "/" + match.Winner;
}
Check(hunts > 0 && blessings > 0, "extended bots go to the grotto and win Mondsegen (" + hunts + " expeditions, " + blessings + " stacks in 12 matches)");
// Bots recruit heroes late (reference bot behaviour), so recipes rarely come up in whole
// matches; a prepared planning shows that a bot forges one when it can.
LuneMatch forge = NewMatch(true, 3);
Player bot = forge.Players[0];
bot.Hero = new HeroState { Uid = "h0-9", Seq = 9, HeroId = "held_ringborke", Lane = bot.Lane, Xp = 300, Invested = 260, Items = new List<string> { "basaltschild", "rankenmantel" } };
bot.Gold = 1200;
bot.Draft = forge.Snapshot(bot);
LuneBot.Plan(forge, 0);
Check(bot.Draft.Hero.Items.Contains("bollwerk"), "a bot forges Bollwerk from its parts (" + string.Join("+", bot.Draft.Hero.Items) + ")");
Check(glyphs > 0, "extended bots fire glyphs (" + glyphs + ")");
Note("12 extended matches: expeditions " + hunts + ", Mondsegen " + blessings + ", recipe heroes " + combines + ", glyphs " + glyphs + ", Ancient levels " + cores + "; seed 1 " + first);
}
}
}

View file

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 04183de557804f08aac74a3d73fe5f3c

View file

@ -1,183 +0,0 @@
using System.Collections.Generic;
using System.Linq;
namespace Luneraria.Core.Tests
{
/// <summary>
/// S3: bots that recruit their heroes early and a rotation over all profiles, neutral camps
/// (League of Legends buff camps), wards and the fog of war (Dota 2) under the extended
/// rules; none of it under the reference rules.
/// </summary>
public sealed class S3RulesSuite : CheckSuite
{
public override string Name { get { return "s3"; } }
protected override void RunChecks()
{
TestReference();
TestBots();
TestCamps();
TestWards();
TestFog();
}
static LuneMatch NewMatch(bool extended, int seed = 61)
{
var state = new LuneMatch();
state.Setup(new MatchOptions { Seed = seed, HumanSlot = -1, Extended = extended,
Bunds = new List<string> { "glutpakt", "wurzelbund", "glutpakt", "wurzelbund", "glutpakt", "wurzelbund" } });
return state;
}
void TestReference()
{
LuneMatch state = NewMatch(false);
state.RoundNumber = 3;
state.Players[0].Draft.Gold += 500;
Check(!state.Submit(0, Command.Ward("mid")).Ok, "reference: no wards");
state.BeginCombat();
Check(state.Combat.Units.All(u => u.Kind != "camp"), "reference: no camps in round 3");
Check(LuneFog.Hidden(state, state.Combat, 0, false).Count == 0, "reference: no fog");
}
void TestBots()
{
var profiles = new HashSet<string>();
LuneMatch probe = NewMatch(true, 1);
for (int slot = 0; slot < 6; slot++)
profiles.Add(LuneBot.ProfileFor(probe, slot));
Check(profiles.Count == 6, "extended rotation gives six different profiles (" + string.Join(",", profiles) + ")");
int heroes = 0;
int seats = 0;
for (int seed = 1; seed <= 6; seed++)
{
LuneMatch match = new LuneMatch();
match.Setup(new MatchOptions { Seed = seed, HumanSlot = -1, Extended = true });
while (match.Phase != Phase.Over && match.RoundNumber <= 6)
{
for (int slot = 0; slot < 6; slot++)
LuneBot.Plan(match, slot);
match.BeginCombat();
match.FinishCombat();
}
heroes += match.Players.Count(p => p.Hero != null);
seats += 6;
}
Check(heroes * 2 >= seats, "extended bots have most heroes after round 6 (" + heroes + " of " + seats + ")");
LuneMatch reference = new LuneMatch();
reference.Setup(new MatchOptions { Seed = 1, HumanSlot = -1 });
for (int round = 0; round < 6; round++)
{
for (int slot = 0; slot < 6; slot++)
LuneBot.Plan(reference, slot);
reference.BeginCombat();
reference.FinishCombat();
}
Check(reference.Players.Count(p => p.Hero != null) == 0, "reference bots keep their late heroes (parity)");
LuneMatch bounty = NewMatch(true);
Check(bounty.ChampionBountyFor(100) == 50 && NewMatch(false).ChampionBountyFor(100) == 100, "extended: defenders get half a champion's bounty");
}
void TestCamps()
{
LuneMatch state = NewMatch(true);
Check(!state.CampRound(1) && !state.CampRound(2) && state.CampRound(3) && state.CampRound(6), "camps every third round");
state.BeginCombat();
Check(state.Combat.Units.All(u => u.Kind != "camp"), "no camp in round 1");
state.FinishCombat();
state.RoundNumber = 3;
state.Players[0].Draft = state.Snapshot(state.Players[0]);
state.BeginCombat();
List<LuneUnit> camps = state.Combat.Units.Where(u => u.Kind == "camp").ToList();
Check(camps.Count == 3 && camps.All(c => c.Team == LuneCombat.Neutral && c.Zone == "lane"), "three neutral guardians, one per lane");
LuneUnit top = camps.First(c => c.Lane == "top");
Vec2 start = top.Position;
for (int i = 0; i < 40; i++)
state.Combat.Step();
Check(top.Position.DistanceTo(start) < 0.000001, "a guardian never moves");
// Blau's units stand next to the top guardian when it falls.
foreach (LuneUnit unit in state.Combat.Units.Where(u => u.Team == 0 && u.IsMobile()).Take(4))
unit.Position = top.Position + new Vec2(1.0, 0.0);
top.Hp = 0.0;
LuneUnit bot = camps.First(c => c.Lane == "bot");
foreach (LuneUnit unit in state.Combat.Units.Where(u => u.Team == 1 && u.IsMobile()).Take(4))
unit.Position = bot.Position + new Vec2(1.0, 0.0);
bot.Hp = 0.0;
state.Combat.Step();
CombatEvent topEvent = state.Combat.Events.First(e => e.Kind == "camp" && e.Lane == "top");
Check(topEvent.ClaimTeam == 0, "the team with more units near the guardian takes the camp");
int[] before = state.Players.Select(p => p.Gold).ToArray();
state.FinishCombat();
Check(state.Boss.CampBuff[0] == 2 && state.Boss.CampBuff[3] == 0, "Glutsegen for Blau for two combats");
int redGain = state.Players[4].Gold - before[4] - state.LastSettlement.Gains[4] + 50;
Check(state.LastSettlement.Gains[3] >= 50 && state.LastSettlement.Gains[4] >= 50 && state.LastSettlement.Gains[5] >= 50, "Beute: Rot's players get 50 gold each");
state.Players[0].Draft.Gold += 500;
state.Submit(0, Command.Buy("g01", "top"));
state.BeginCombat();
LuneUnit troop = state.Combat.Units.First(u => u.Kind == "troop" && u.OwnerSlot == 0 && u.Def.Id == "g01");
Check(GdMath.IsEqualApprox(troop.Def.Damage, DataCatalog.GetUnit("g01").Damage * 1.10), "Glutsegen: +10 % damage");
state.FinishCombat();
state.Boss.CampBuff[4] = 1;
state.Players[3].Draft.Gold += 500;
state.Submit(3, Command.Buy("w01", "top"));
state.BeginCombat();
LuneUnit red = state.Combat.Units.First(u => u.Kind == "troop" && u.Team == 1);
Check(GdMath.IsEqualApprox(red.Shield, red.MaxHp * 0.10) || red.Shield > red.MaxHp * 0.10, "Mondschild: shield of 10 % at the start");
Check(redGain >= 0, "settlement consistent");
// Combats end without waiting for a lone guardian.
LuneMatch lonely = NewMatch(true);
lonely.RoundNumber = 3;
lonely.BeginCombat();
foreach (LuneUnit unit in lonely.Combat.Units.Where(u => u.Kind != "camp" && u.IsMobile()))
unit.Hp = 0.0;
lonely.Combat.Step();
lonely.Combat.Step();
Check(lonely.Combat.Finished && lonely.Combat.EndReason == "cleared", "a guardian alone does not hold the combat open");
}
void TestWards()
{
LuneMatch state = NewMatch(true);
int gold = state.GoldOf(0);
Check(!state.Submit(0, Command.Ward("river")).Ok, "unknown lane rejected");
Check(state.Submit(0, Command.Ward("mid")).Ok && state.GoldOf(0) == gold - 40, "a ward costs 40");
Check(!state.Submit(0, Command.Ward("mid")).Ok, "one ward per lane and planning");
Check(LuneFog.LaneScouted(state, 0, "mid", state.Players[0].Draft) && !LuneFog.LaneScouted(state, 0, "mid"), "the own draft ward scouts at once, the team sees it after the commit");
state.BeginCombat();
Check(state.Boss.Wards[1] == 3 && state.Boss.Wards[4] == 0, "the team ward watches mid for three rounds");
state.FinishCombat();
Check(state.Boss.Wards[1] == 2 && LuneFog.LaneScouted(state, 0, "mid") && !LuneFog.LaneScouted(state, 1, "mid"), "it counts down and scouts only for Blau");
state.BuildingHp["rot_top_outer"] = 0.0;
Check(LuneFog.LaneScouted(state, 0, "top"), "a fallen enemy outer tower scouts the lane");
}
void TestFog()
{
LuneMatch state = NewMatch(true);
state.RoundNumber = 3;
state.BeginCombat();
HashSet<int> hidden = LuneFog.Hidden(state, state.Combat, 0, false);
Check(state.Combat.Units.Where(u => u.Team == 1 && u.IsMobile()).All(u => hidden.Contains(u.Id)), "at combat start Blau sees no Rot unit (they stand at their base)");
Check(state.Combat.Units.Where(u => u.Team != 1).All(u => !hidden.Contains(u.Id)), "own and neutral units are always visible");
LuneUnit enemy = state.Combat.Units.First(u => u.Team == 1 && u.IsMobile());
LuneUnit own = state.Combat.Units.First(u => u.Team == 0 && u.IsMobile() && u.Zone == enemy.Zone);
enemy.Position = own.Position + new Vec2(5.0, 0.0);
Check(!LuneFog.Hidden(state, state.Combat, 0, false).Contains(enemy.Id), "an enemy within 9 m of an own unit is visible");
enemy.Position = LuneFog.WardPoint(state, enemy.Lane == "grotto" ? "mid" : enemy.Lane);
bool before = LuneFog.Hidden(state, state.Combat, 0, false).Contains(enemy.Id);
state.Boss.Wards[LuneMap.LaneIndex(enemy.Lane)] = 2;
Check(before && !LuneFog.Hidden(state, state.Combat, 0, false).Contains(enemy.Id), "a ward reveals the middle of its lane");
state.FinishCombat();
LuneMatch plan = NewMatch(true);
plan.Players[3].Draft.Gold += 200;
plan.Submit(3, Command.Buy("w01", "top"));
plan.Submit(3, Command.Buy("w01", "mid"));
plan.BeginCombat();
plan.FinishCombat();
plan.Boss.Wards[0] = 1;
List<LuneMatch.ArmyEntry> scouted = LuneFog.ScoutedEnemies(plan, 0);
Check(scouted.Any(e => e.Lane == "top" && e.Slot == 3) && scouted.All(e => e.Lane == "top"), "planning: the warded lane shows Rot's committed army, the others nothing");
Check(LuneFog.ScoutedEnemies(plan, 1).Count == 0 && LuneFog.ScoutedEnemies(NewMatch(false), 0).Count == 0, "no scouting without a ward or under the reference rules");
}
}
}

View file

@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 9632c5c9699a4bc99db6e8b3479cf103

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