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,18 @@
[
{
"Figure": ["Shield"],
"State": ["Icon"],
"Spine": [
{
"Path": "%spine\shield_icon",
"Animation": ["animation"],
"Loop": true,
},
],
},
]
@@ -0,0 +1,51 @@
[
{
"Figure": ["Goblin", "Elf"],
"State": ["Wait", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["idle_0", "idle_1"],
"Loop": true,
},
],
},
{
"Figure": ["Goblin", "Elf"],
"State": ["Knockback", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["defense_0"],
"Loop": false,
},
],
},
{
"Figure": ["Goblin", "Elf"],
"State": ["Stun", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["idle_0", "idle_1"],
"Loop": true,
},
],
},
{
"Figure": ["Goblin", "Elf"],
"State": ["Map", "Map"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["portrait"],
"Loop": false,
},
],
},
]
@@ -0,0 +1,51 @@
[
{
"Figure": ["Goblin", "Human"],
"State": ["Wait", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["idle_0", "idle_1"],
"Loop": true,
},
],
},
{
"Figure": ["Goblin", "Human"],
"State": ["Knockback", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["defense_0"],
"Loop": false,
},
],
},
{
"Figure": ["Goblin", "Human"],
"State": ["Stun", "Combination"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["idle_0", "idle_1"],
"Loop": false,
},
],
},
{
"Figure": ["Goblin", "Human"],
"State": ["Map", "Map"],
"Spine": [
{
"Path": "%spine\goblin_woman_shield",
"Animation": ["portrait"],
"Loop": false,
},
],
},
]
@@ -0,0 +1,32 @@
[
{
"Group": "Shield",
"Name": "#Shield",
"Text": "#ShieldText",
"Script": "CombinationScripts.Shield",
"List": [
{
"Figure": ["Goblin", "Human"],
"Size": [3, 1],
},
{
"Figure": ["Goblin", "Elf"],
"Size": [3, 1],
},
],
},
]
File diff suppressed because one or more lines are too long
@@ -0,0 +1,32 @@
{
"Id": "GoblinShield",
"Name": "#GoblinShield",
"Figure": "Goblin",
"Unit": "GoblinShield",
"Type": "Monster",
"Gender": "Male",
"Race": "Goblin",
"SexTime": [30],
"BabyGrowthTime": [60],
"Health": [25],
"Armor": [4],
"Damage": [1],
"CriticalHtiChance": [15],
"CriticalHtiMultiplier": [160],
"KnockbackStability": [0],
"KnockbackDistance": [0],
"WalkingSpeed": [0],
"WalkingSpeedMultiplier": [1],
"AttackSpeedMultiplier": [1],
"Size": [2, 0.5],
"Deployment": [3, 1],
"Script": "CharacterScripts.Shield",
"ScriptCombat": "CharacterBehaviourScripts.GoblinShield",
}
@@ -0,0 +1,38 @@
[gd_scene format=3]
[ext_resource type="Texture2D" path="res://characters/goblin_human/spine/shield_icon.png" id="1_rrxt6"]
[sub_resource type="Animation" id="Animation_qtbn0"]
length = 0.001
loop_mode = 1
[sub_resource type="AnimationLibrary" id="AnimationLibrary_vjpsr"]
_data = {
&"animation": SubResource("Animation_qtbn0")
}
[node name="Native" type="Node2D" unique_id=609716214]
[node name="SpineRoot" type="Node2D" parent="." unique_id=2132298824]
position = Vector2(640, 360)
scale = Vector2(4.8403363, -4.8403363)
[node name="Skeleton2D" type="Skeleton2D" parent="SpineRoot" unique_id=1845071758]
[node name="root" type="Bone2D" parent="SpineRoot/Skeleton2D" unique_id=2038939113]
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=1414736584]
texture = ExtResource("1_rrxt6")
skeleton = NodePath("..")
polygon = PackedVector2Array(11.262837, 59.5, 58.5, 4.38682, 58.5, -4.68684, 3.5602427, -59.5, -2.8651474, -59.5, -58.5, -3.59807, -58.5, 3.54284, -21.843351, 48.6706, -2.9108527, 59.5)
uv = PackedVector2Array(71.76283, 2, 119, 57.113182, 119, 66.186844, 64.060234, 121.00001, 57.634846, 121.00001, 2, 65.09807, 2, 57.957165, 38.65666, 12.8294, 57.589146, 2)
polygons = [PackedInt32Array(5, 6, 7), PackedInt32Array(0, 7, 8), PackedInt32Array(7, 0, 1), PackedInt32Array(2, 4, 1), PackedInt32Array(4, 7, 1), PackedInt32Array(5, 7, 4), PackedInt32Array(3, 4, 2)]
bones = ["root", PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1)]
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=866083629]
root_node = NodePath("../SpineRoot/Skeleton2D")
libraries/ = SubResource("AnimationLibrary_vjpsr")
@@ -0,0 +1,279 @@
goblin_woman_shield.png
size:816,816
filter:Linear,Linear
C_armA
bounds:152,79,72,178
offsets:514,446,1080,1080
C_armB
bounds:484,559,83,165
offsets:533,466,1080,1080
C_armclothA_1
bounds:766,237,48,44
offsets:522,575,1080,1080
C_armclothB_1
bounds:469,21,50,48
offsets:538,572,1080,1080
C_body
bounds:384,554,98,170
offsets:556,334,1080,1080
C_chainC
bounds:428,393,20,159
offsets:559,134,1080,1080
C_chainD1
bounds:498,71,49,54
offsets:378,348,1080,1080
C_chainD2
bounds:231,535,151,279
offsets:373,356,1080,1080
C_eyeA1_a
bounds:599,445,27,14
offsets:596,500,1080,1080
C_eyeA1_b
bounds:625,79,27,13
offsets:597,498,1080,1080
C_eyeB1_a
bounds:434,265,27,14
offsets:596,500,1080,1080
C_eyeB1_b
bounds:565,439,27,13
offsets:597,498,1080,1080
C_eyeB2_a
bounds:738,173,22,11
offsets:599,501,1080,1080
C_faceA1_a
bounds:717,76,31,38
offsets:598,486,1080,1080
C_faceA1_b
bounds:584,2,31,36
offsets:598,485,1080,1080
C_faceB1_a
bounds:750,80,31,38
offsets:598,486,1080,1080
C_faceB1_b
bounds:617,2,31,36
offsets:598,485,1080,1080
C_hairA_0
bounds:599,461,39,102
offsets:574,451,1080,1080
C_hairA_1
bounds:720,459,38,96
offsets:576,456,1080,1080
C_hairA_2
bounds:722,280,32,82
offsets:576,462,1080,1080
C_hairA_3
bounds:729,186,35,92
offsets:573,457,1080,1080
C_hairB_0
bounds:549,69,33,56
offsets:618,496,1080,1080
C_hairB_1
bounds:468,256,61,64
offsets:591,492,1080,1080
C_hairB_2
bounds:762,413,37,69
offsets:618,486,1080,1080
C_hairB_3
bounds:672,116,64,65
offsets:590,489,1080,1080
C_hairC_0
bounds:346,9,68,44
offsets:579,508,1080,1080
C_hairC_2
bounds:738,120,68,41
offsets:579,511,1080,1080
C_hairD_0
bounds:722,364,38,93
offsets:604,461,1080,1080
C_hairD_1
bounds:399,152,39,97
offsets:609,463,1080,1080
C_hairD_2
bounds:571,159,44,92
offsets:609,468,1080,1080
C_hairD_3
bounds:565,454,32,103
offsets:614,457,1080,1080
C_hairE_0
bounds:628,368,92,89
offsets:556,490,1080,1080
C_hairE_1
bounds:531,330,95,105
offsets:553,474,1080,1080
C_hairE_2
bounds:226,123,115,122
offsets:533,457,1080,1080
C_hairE_3
bounds:231,247,114,286
offsets:543,293,1080,1080
C_hairF_0
bounds:511,160,58,91
offsets:525,491,1080,1080
C_hairG_1
bounds:2,44,62,213
offsets:556,271,1080,1080
C_headA_0
bounds:333,55,81,66
offsets:566,479,1080,1080
C_headA_1
bounds:226,55,105,66
offsets:542,479,1080,1080
C_legA1
bounds:652,557,69,167
offsets:572,218,1080,1080
C_legA1_L
bounds:723,584,59,129
offsets:576,233,1080,1080
C_legA2
bounds:66,88,84,169
offsets:554,88,1080,1080
C_legB1
bounds:569,565,81,159
offsets:614,239,1080,1080
C_legB1_L
bounds:434,281,32,110
offsets:660,248,1080,1080
C_legB2
bounds:450,431,64,121
offsets:629,151,1080,1080
C_legclothA_1
bounds:617,144,53,39
offsets:553,120,1080,1080
C_nippleA
bounds:549,35,33,32
offsets:598,429,1080,1080
C_nippleB
bounds:784,587,22,29
offsets:635,439,1080,1080
C_pregnant_1
bounds:756,283,58,79
offsets:599,359,1080,1080
C_pregnant_2
bounds:440,161,69,93
offsets:597,351,1080,1080
C_pregnant_3
bounds:640,459,78,96
offsets:594,349,1080,1080
C_pregnant_4
bounds:725,715,88,99
offsets:592,349,1080,1080
C_titsA
bounds:760,484,53,54
offsets:581,420,1080,1080
C_titsA_L
bounds:784,663,29,50
offsets:590,420,1080,1080
C_titsB
bounds:416,19,51,53
offsets:604,427,1080,1080
C_titsB_L
bounds:307,2,37,51
offsets:617,427,1080,1080
M_armA1
bounds:617,185,55,93
offsets:369,313,1080,1080
M_armA2
bounds:152,12,71,65
offsets:393,315,1080,1080
M_armA2_L
bounds:723,561,33,21
offsets:417,356,1080,1080
M_armB1
bounds:2,6,62,36
offsets:487,284,1080,1080
M_armB2
bounds:766,163,40,72
offsets:483,293,1080,1080
M_armB3
bounds:567,127,35,30
offsets:528,291,1080,1080
M_armclothA1
bounds:584,75,39,50
offsets:384,324,1080,1080
M_armclothB1
bounds:762,376,45,35
offsets:493,285,1080,1080
M_bodyA
bounds:66,4,84,82
offsets:429,316,1080,1080
M_bodyB
bounds:347,251,85,131
offsets:414,238,1080,1080
M_bodyclothA
bounds:225,6,80,47
offsets:412,262,1080,1080
M_bodyclothB
bounds:516,437,47,120
offsets:440,166,1080,1080
M_earA
bounds:440,128,66,31
offsets:412,378,1080,1080
M_earB
bounds:664,83,51,31
offsets:497,376,1080,1080
M_faceA
bounds:521,2,42,31
offsets:498,380,1080,1080
M_faceA_L
bounds:565,4,17,29
offsets:522,382,1080,1080
M_faceB
bounds:508,127,57,31
offsets:481,393,1080,1080
M_faceB_L
bounds:399,134,39,16
offsets:497,407,1080,1080
M_faceC_a
bounds:343,123,52,19
offsets:484,394,1080,1080
M_headA
bounds:531,253,84,75
offsets:452,378,1080,1080
M_headA_L
bounds:416,74,80,52
offsets:455,400,1080,1080
M_headB
bounds:384,535,33,17
offsets:491,377,1080,1080
M_headC
bounds:521,35,26,34
offsets:490,358,1080,1080
M_headD
bounds:760,540,54,42
offsets:471,355,1080,1080
M_headE
bounds:584,40,38,33
offsets:485,361,1080,1080
M_legA1
bounds:343,144,54,101
offsets:399,198,1080,1080
M_legA1_L
bounds:783,74,17,44
offsets:426,230,1080,1080
M_legA2
bounds:468,322,61,107
offsets:388,127,1080,1080
M_legA2_L
bounds:784,618,19,43
offsets:394,168,1080,1080
M_legB1
bounds:628,280,92,86
offsets:446,211,1080,1080
M_legB1_L
bounds:625,94,37,48
offsets:496,230,1080,1080
M_legB2
bounds:674,183,53,95
offsets:485,141,1080,1080
M_legB2_L
bounds:750,33,17,45
offsets:487,175,1080,1080
shadow
bounds:384,726,339,88
offsets:359,81,1080,1080
shield
bounds:2,259,227,555
offsets:471,99,1080,1080
shieldB
bounds:347,384,79,149
offsets:518,251,1080,1080
Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://o2dduyebp27a"
path="res://.godot/imported/goblin_woman_shield.png-59971048417c2719558c74e82bb58b0d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/goblin_human/spine/goblin_woman_shield.png"
dest_files=["res://.godot/imported/goblin_woman_shield.png-59971048417c2719558c74e82bb58b0d.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 @@
shield_icon.png
size:124,124
filter:Linear,Linear
Button_unitmix_1
bounds:2,2,117,119
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b71itn3hcghpu"
path="res://.godot/imported/shield_icon.png-7808fc2f49eab463fdba023aa01a1bb2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/goblin_human/spine/shield_icon.png"
dest_files=["res://.godot/imported/shield_icon.png-7808fc2f49eab463fdba023aa01a1bb2.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": "Shield",
"Cost": 16,
},
]