ProjectRR — нативный прототип на ассетах ProjectR

- Все 189 скелетов Spine сконвертированы в нативные Godot Skeleton2D (.tscn), без Spine в рантайме
- Меню + сцены: подземелье (карта комнат), просмотр спрайтов, нативные анимации
- Кастомизация цвета (кожа/волосы/глаза) через шейдер
- Вытащенные текстуры/UI/шрифты + нарезка спрайтов из атласа
- Датасет комнат для LoRA, офлайн-инструменты конвертации в tools/

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-08-03 16:29:21 +03:00
co-authored by Claude Opus 4.8
commit 04cf5f90b0
2193 changed files with 360105 additions and 0 deletions
@@ -0,0 +1,157 @@
[
{
"Figure": ["OniRider"],
"State": ["Icon"],
"Spine": [
{
"Path": "%spine\onirider_icon",
"Animation": ["animation"],
"Loop": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Patrol", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["walk_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Chase", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["walk_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Charge", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["run_0"],
"Mix": ["walk_0", 0.5],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Attack", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["attack_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Skill", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["attack_1"],
"Loop": false,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Wait", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["idle_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Knockback", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["knockback_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Stun", "Combination"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["stun_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["Map", "Map"],
"Spine": [
{
"Path": "%spine\onirider_combat",
"Animation": ["portrait_0"],
"Loop": false,
},
],
},
{
"Figure": ["Oni", "Horse"],
"State": ["SkillIcon", "Combination"],
"Image": [
{
},
{
"Path": "%image\skill_onirider1.png",
},
{
"Path": "%image\skill_onirider2.png",
},
],
},
]
@@ -0,0 +1,28 @@
[
{
"Group": "OniRider",
"Name": "#OniRider",
"Text": "#OniRiderText",
"Script": "CombinationScripts.OniRider",
"List": [
{
"Figure": ["Oni", "Horse"],
"Size": [4, 1],
},
],
},
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxytnifsrrrl4"
path="res://.godot/imported/skill_onirider1.png-d3476ab5c33a47953b3ca37813c1f4ea.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/oni_horse/image/skill_onirider1.png"
dest_files=["res://.godot/imported/skill_onirider1.png-d3476ab5c33a47953b3ca37813c1f4ea.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bi3xh0nqjq0sh"
path="res://.godot/imported/skill_onirider2.png-9bf57fd456ef7d2f2700b167263795e1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/oni_horse/image/skill_onirider2.png"
dest_files=["res://.godot/imported/skill_onirider2.png-9bf57fd456ef7d2f2700b167263795e1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
+67
View File
@@ -0,0 +1,67 @@
{
"Id": "OniRider",
"Name": "#OniRider",
"Figure": "Oni",
"Unit": "Oni",
"Type": "Monmusu",
"Gender": "Female",
"Race": "Oni",
"ConceptionRate": [45],
"BabyGrowthTime": [60],
"FetalGrowthTime": [240],
"Health": [50],
"Damage": [22],
"CriticalHtiChance": [27],
"CriticalHtiMultiplier": [195],
"KnockbackStability": [35],
"KnockbackDistance": [100],
"Defense": [9],
"WalkingSpeed": [450],
"WalkingSpeedMultiplier": [1],
"AttackSpeedMultiplier": [1],
"Size": [2, 1],
"Deployment": [4, 1],
"Script": "CharacterScripts.Oni",
"ScriptCombat1": "CharacterBehaviourScripts.Hold",
"ScriptCombat2": "CharacterBehaviourScripts.Forward_OniRider",
"ScriptCombat3": "CharacterBehaviourScripts.Forward_OniRider",
"Skill": [
{
"Hide": true,
"HitType": "Melee",
"State": "Attack",
"Range": [2.5, 1],
},
{
"Name": "#SkillNameOniRider1",
"Text": "#SkillTextOniRider1",
"State": "Charge",
"HitType": "Melee",
"MinRange": [4],
"Range": [12],
"AreaRange": [0.5, 0.5],
"Multiplier": [200, 400, 600],
"Cooldown": [1],
"RequiresLineOfSight": true,
},
{
"Name": "#SkillNameOniRider2",
"Text": "#SkillTextOniRider2",
"HitType": "Melee",
"State": "Skill",
"Range": [2.5, 1],
"Multiplier": [200],
"Cooldown": [20],
},
],
}
File diff suppressed because one or more lines are too long
@@ -0,0 +1,38 @@
[gd_scene format=3]
[ext_resource type="Texture2D" path="res://characters/oni_horse/spine/onirider_icon.png" id="1_g6dqy"]
[sub_resource type="Animation" id="Animation_kxfmr"]
length = 0.001
loop_mode = 1
[sub_resource type="AnimationLibrary" id="AnimationLibrary_gfwoq"]
_data = {
&"animation": SubResource("Animation_kxfmr")
}
[node name="Native" type="Node2D" unique_id=573003602]
[node name="SpineRoot" type="Node2D" parent="." unique_id=804936260]
position = Vector2(640, 360)
scale = Vector2(4.8403363, -4.8403363)
[node name="Skeleton2D" type="Skeleton2D" parent="SpineRoot" unique_id=208384667]
[node name="root" type="Bone2D" parent="SpineRoot/Skeleton2D" unique_id=1382138276]
rest = Transform2D(1, 0, 0, 1, 0, 0)
auto_calculate_length_and_angle = false
length = 0.0
bone_angle = 0.0
[node name="Icon" type="Polygon2D" parent="SpineRoot/Skeleton2D" unique_id=606958214]
texture = ExtResource("1_g6dqy")
skeleton = NodePath("..")
polygon = PackedVector2Array(7.3250375, 59.5, 55.40676, 26.05498, 58.5, 3.77284, 58.5, -4.61569, 3.5471227, -59.5, -2.6672873, -59.5, -58.5, -3.61768, -58.5, 3.53651, -2.5179126, 59.5)
uv = PackedVector2Array(67.82504, 2, 115.90675, 35.445026, 119, 57.727158, 119, 66.115685, 64.04712, 121.00001, 57.832714, 121.00001, 2, 65.11768, 2, 57.963493, 57.982086, 2)
polygons = [PackedInt32Array(2, 5, 6), PackedInt32Array(1, 2, 0), PackedInt32Array(6, 7, 2), PackedInt32Array(2, 8, 0), PackedInt32Array(8, 2, 7), PackedInt32Array(3, 5, 2), PackedInt32Array(4, 5, 3)]
bones = ["root", PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1)]
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=530683067]
root_node = NodePath("../SpineRoot/Skeleton2D")
libraries/ = SubResource("AnimationLibrary_gfwoq")
@@ -0,0 +1,312 @@
onirider_combat.png
size:1212,1212
filter:Linear,Linear
C_armA1
bounds:749,225,70,113
offsets:461,659,1080,1080
C_armA1_L
bounds:1173,1146,37,64
offsets:467,702,1080,1080
C_armA2
bounds:1096,790,112,82
offsets:462,607,1080,1080
C_armB1
bounds:821,62,103,87
offsets:553,678,1080,1080
C_armB2
bounds:1079,389,55,104
offsets:618,679,1080,1080
C_armB3
bounds:1131,498,46,42
offsets:630,745,1080,1080
C_armclothA1
bounds:715,6,90,78
offsets:474,607,1080,1080
C_armclothA2
bounds:405,670,39,51
offsets:505,609,1080,1080
C_armclothA2_L
bounds:1075,122,39,51
offsets:505,609,1080,1080
C_armclothB1
bounds:449,979,54,57
offsets:619,694,1080,1080
C_armclothB2
bounds:770,87,46,21
offsets:630,731,1080,1080
C_bodyA
bounds:576,331,143,109
offsets:450,569,1080,1080
C_bodyB
bounds:955,1008,92,150
offsets:502,643,1080,1080
C_bodyclothA1
bounds:862,20,59,40
offsets:521,742,1080,1080
C_bodyclothA2
bounds:972,151,55,42
offsets:524,739,1080,1080
C_bodyclothA2_L
bounds:862,2,18,16
offsets:558,749,1080,1080
C_bodyclothB1_0
bounds:553,608,126,77
offsets:478,607,1080,1080
C_bodyclothB2a_0
bounds:505,977,43,59
offsets:532,597,1080,1080
C_bodyclothB2b_0
bounds:1032,111,41,62
offsets:562,594,1080,1080
C_bodyclothB3_0
bounds:1173,1035,30,109
offsets:546,548,1080,1080
C_eyeA1_a
bounds:952,792,63,25
offsets:538,786,1080,1080
C_eyeA1_b
bounds:293,386,63,20
offsets:538,787,1080,1080
C_eyeB1_a
bounds:1017,792,63,25
offsets:538,786,1080,1080
C_eyeB1_b
bounds:358,386,63,20
offsets:538,787,1080,1080
C_eyeB2_a
bounds:303,2,48,18
offsets:548,789,1080,1080
C_faceA1_attack
bounds:1075,78,38,42
offsets:558,772,1080,1080
C_faceA1_hit
bounds:1032,73,39,36
offsets:558,774,1080,1080
C_faceA1_normal
bounds:1170,379,35,39
offsets:561,775,1080,1080
C_faceB1_attack
bounds:1115,78,38,42
offsets:558,772,1080,1080
C_faceB1_hit
bounds:926,35,39,36
offsets:558,774,1080,1080
C_faceB1_normal
bounds:1170,338,35,39
offsets:561,775,1080,1080
C_hairA_0
bounds:657,11,56,65
offsets:559,794,1080,1080
C_hairA_1
bounds:972,195,53,80
offsets:559,779,1080,1080
C_hairB_0
bounds:1107,291,61,96
offsets:505,758,1080,1080
C_hairB_1
bounds:702,568,92,117
offsets:482,737,1080,1080
C_hairC_0
bounds:926,73,41,93
offsets:582,758,1080,1080
C_hairC_1
bounds:770,110,49,113
offsets:579,739,1080,1080
C_hairD1_1
bounds:796,599,149,188
offsets:393,642,1080,1080
C_hairD2_1
bounds:952,819,142,187
offsets:453,643,1080,1080
C_hairE_0
bounds:572,210,129,119
offsets:475,744,1080,1080
C_hairE_1
bounds:303,22,174,119
offsets:430,750,1080,1080
C_hairF_0
bounds:798,789,152,247
offsets:389,507,1080,1080
C_headA_1
bounds:310,648,93,73
offsets:510,765,1080,1080
C_hornA_0
bounds:1176,573,27,71
offsets:546,809,1080,1080
C_hornA_1
bounds:1075,288,30,98
offsets:545,809,1080,1080
C_hornB_0
bounds:1027,219,36,68
offsets:584,804,1080,1080
C_hornB_1
bounds:1131,542,43,95
offsets:584,805,1080,1080
C_legA1
bounds:441,241,129,160
offsets:443,485,1080,1080
C_legA1_L
bounds:441,145,121,94
offsets:439,519,1080,1080
C_legB1
bounds:1049,1028,122,182
offsets:514,464,1080,1080
C_legB1_L
bounds:702,446,120,120
offsets:511,484,1080,1080
C_legclothA3
bounds:1064,175,47,33
offsets:483,349,1080,1080
C_move_legB2
bounds:1096,874,88,152
offsets:481,357,1080,1080
C_move_legB3
bounds:1128,178,60,33
offsets:480,351,1080,1080
C_move_legclothB2
bounds:446,579,105,142
offsets:470,364,1080,1080
C_nippleA
bounds:807,6,53,54
offsets:516,671,1080,1080
C_nippleB
bounds:1157,127,38,49
offsets:615,670,1080,1080
C_pregnant_1
bounds:596,8,59,68
offsets:533,611,1080,1080
C_pregnant_2
bounds:915,378,78,90
offsets:519,596,1080,1080
C_pregnant_3
bounds:905,277,91,99
offsets:515,589,1080,1080
C_pregnant_4
bounds:721,340,98,104
offsets:515,586,1080,1080
C_pregnant_L_2
bounds:681,627,15,58
offsets:577,609,1080,1080
C_pregnant_L_3
bounds:1185,717,25,71
offsets:578,598,1080,1080
C_pregnant_L_4
bounds:1186,954,24,79
offsets:582,597,1080,1080
C_titsA
bounds:824,378,89,94
offsets:497,655,1080,1080
C_titsA_L
bounds:904,168,66,94
offsets:502,655,1080,1080
C_titsB
bounds:995,388,82,99
offsets:565,650,1080,1080
C_titsB_L
bounds:998,289,75,97
offsets:576,650,1080,1080
C_weapon
bounds:449,1038,504,120
offsets:249,739,1080,1080
horse_armorB
bounds:555,687,181,159
offsets:601,373,1080,1080
horse_bodyA
bounds:2,382,289,264
offsets:563,395,1080,1080
horse_bodyB
bounds:2,976,445,234
offsets:287,356,1080,1080
horse_bodyclothA
bounds:310,723,243,251
offsets:376,358,1080,1080
horse_bodyclothB1
bounds:2,648,306,326
offsets:336,271,1080,1080
horse_earA
bounds:1179,517,31,54
offsets:826,623,1080,1080
horse_earB
bounds:1116,125,39,51
offsets:848,613,1080,1080
horse_hairA
bounds:915,470,71,127
offsets:825,569,1080,1080
horse_hairB
bounds:555,848,241,188
offsets:602,547,1080,1080
horse_handle
bounds:2,8,299,106
offsets:538,539,1080,1080
horse_headA
bounds:576,442,124,164
offsets:776,495,1080,1080
horse_headB
bounds:1029,175,33,42
offsets:839,500,1080,1080
horse_headcloth
bounds:479,13,115,130
offsets:769,528,1080,1080
horse_headcloth2
bounds:596,78,115,130
offsets:769,528,1080,1080
horse_hornA
bounds:713,86,55,125
offsets:845,601,1080,1080
horse_hornB
bounds:703,213,44,116
offsets:864,599,1080,1080
horse_legA1
bounds:947,613,129,174
offsets:558,333,1080,1080
horse_legA2
bounds:821,151,81,111
offsets:578,271,1080,1080
horse_legA3
bounds:1133,646,50,142
offsets:579,168,1080,1080
horse_legA4
bounds:1065,210,61,76
offsets:585,124,1080,1080
horse_legA5
bounds:446,403,128,174
offsets:600,347,1080,1080
horse_legA6
bounds:821,264,82,112
offsets:620,284,1080,1080
horse_legA7
bounds:1079,495,50,142
offsets:621,182,1080,1080
horse_legA8
bounds:1128,213,61,76
offsets:627,138,1080,1080
horse_legB1
bounds:293,408,151,238
offsets:267,328,1080,1080
horse_legB2
bounds:988,489,89,122
offsets:260,274,1080,1080
horse_legB3
bounds:1078,639,53,149
offsets:260,169,1080,1080
horse_legB4
bounds:969,74,61,75
offsets:270,125,1080,1080
horse_legB5
bounds:288,143,151,237
offsets:313,343,1080,1080
horse_legB6
bounds:824,474,89,123
offsets:305,287,1080,1080
horse_legB7
bounds:738,697,56,149
offsets:304,183,1080,1080
horse_legB8
bounds:1136,420,62,76
offsets:315,138,1080,1080
horse_tail
bounds:2,116,284,264
offsets:53,300,1080,1080
shadow
bounds:449,1160,589,50
offsets:188,116,1080,1080
Binary file not shown.

After

Width:  |  Height:  |  Size: 586 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dthdrllbqwuho"
path="res://.godot/imported/onirider_combat.png-274fdf0023b866473b869cac8b114e60.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/oni_horse/spine/onirider_combat.png"
dest_files=["res://.godot/imported/onirider_combat.png-274fdf0023b866473b869cac8b114e60.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
@@ -0,0 +1,5 @@
onirider_icon.png
size:124,124
filter:Linear,Linear
Button_unitmix_5
bounds:2,2,117,119
Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bnuggtvbq50ol"
path="res://.godot/imported/onirider_icon.png-0258439fddbdaaae059d84dc41ecd3b9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/oni_horse/spine/onirider_icon.png"
dest_files=["res://.godot/imported/onirider_icon.png-0258439fddbdaaae059d84dc41ecd3b9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
Binary file not shown.
@@ -0,0 +1,7 @@
[
{
"Type": "Combination",
"Id": "OniRider",
"Cost": 20,
},
]