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,133 @@
[
{
"Figure": ["Orc", "Elf1"],
"State": ["Patrol", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["walk_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Chase", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["walk_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Attack", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["attack_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Skill", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["attack_1"],
"Loop": false,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Wait", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["idle_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Knockback", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["knockback_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Stun", "Combination"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["stun_0"],
"Loop": true,
"IsCombat": true,
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["SkillIcon", "Combination"],
"Image": [
{
"Path": "%image\skill_orcextractor1.png",
},
],
},
{
"Figure": ["Orc", "Elf1"],
"State": ["Map", "Map"],
"Spine": [
{
"Path": "%spine\orcextractor_combat",
"Animation": ["portrait_0"],
"Loop": false,
},
],
},
{
"Figure": ["OrcExtractor"],
"State": ["Icon"],
"Spine": [
{
"Path": "%spine\orcextractor_icon",
"Animation": ["animation"],
"Loop": true,
},
],
},
]
@@ -0,0 +1,28 @@
[
{
"Group": "OrcExtractor",
"Name": "#OrcExtractor",
"Text": "#OrcExtractorText",
"Script": "CombinationScripts.OrcExtractor",
"List": [
{
"Figure": ["Orc", "Elf1"],
"Size": [4, 1],
},
],
},
]
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://swqav032vq4g"
path="res://.godot/imported/skill_orcextractor1.png-85e1eac966bd789a93e0af8d1d8dc594.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/orc_elf1/image/skill_orcextractor1.png"
dest_files=["res://.godot/imported/skill_orcextractor1.png-85e1eac966bd789a93e0af8d1d8dc594.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,48 @@
{
"Id": "OrcExtractor",
"Name": "#OrcExtractor",
"Figure": "Orc",
"Unit": "Orc",
"Type": "Monster",
"Gender": "Male",
"Race": "Orc",
"SexTime": [45],
"BabyGrowthTime": [60],
"Health": [45],
"Defense": [4],
"Damage": [6],
"CriticalHtiChance": [20],
"CriticalHtiMultiplier": [165],
"KnockbackStability": [25],
"KnockbackDistance": [70],
"WalkingSpeed": [200],
"WalkingSpeedMultiplier": [1],
"AttackSpeedMultiplier": [1],
"RangeAngle": [20, -20],
"Size": [2, 0.5],
"Deployment": [4, 1],
"Script": "CharacterScripts.OrcExtractor",
"ScriptCombat1": "CharacterBehaviourScripts.Hold",
"ScriptCombat2": "CharacterBehaviourScripts.Forward_OrcExtractor",
"ScriptCombat3": "CharacterBehaviourScripts.Forward_OrcExtractor",
"Skill": [
{
"Name": "#SkillNameOrcExtractor",
"Text": "#SkillTextOrcExtractor",
"HitType": "Projectile:Elf1Weapon",
"State": "Attack",
"Range": [18],
"Multiplier": [200],
},
],
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,38 @@
[gd_scene format=3]
[ext_resource type="Texture2D" path="res://characters/orc_elf1/spine/orcextractor_icon.png" id="1_wc66s"]
[sub_resource type="Animation" id="Animation_kyi6g"]
length = 0.001
loop_mode = 1
[sub_resource type="AnimationLibrary" id="AnimationLibrary_fgutl"]
_data = {
&"animation": SubResource("Animation_kyi6g")
}
[node name="Native" type="Node2D" unique_id=1753327938]
[node name="SpineRoot" type="Node2D" parent="." unique_id=1438423250]
position = Vector2(640, 360)
scale = Vector2(4.8403363, -4.8403363)
[node name="Skeleton2D" type="Skeleton2D" parent="SpineRoot" unique_id=1528273785]
[node name="root" type="Bone2D" parent="SpineRoot/Skeleton2D" unique_id=1210257956]
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=1872219901]
texture = ExtResource("1_wc66s")
skeleton = NodePath("..")
polygon = PackedVector2Array(2.5532973, 59.5, 58.5, 19.80742, 58.5, -4.55662, 4.0424323, -59.5, -2.9982274, -59.5, -58.5, -3.72896, -58.5, 3.86498, -2.6805527, 59.5)
uv = PackedVector2Array(63.05329, 2, 119, 41.692585, 119, 66.05662, 64.54243, 121.00001, 57.50177, 121.00001, 2, 65.22896, 2, 57.63502, 57.81945, 2)
polygons = [PackedInt32Array(2, 5, 6), PackedInt32Array(0, 1, 2), PackedInt32Array(2, 4, 5), PackedInt32Array(6, 7, 0), PackedInt32Array(6, 0, 2), PackedInt32Array(3, 4, 2)]
bones = ["root", PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1)]
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1028766893]
root_node = NodePath("../SpineRoot/Skeleton2D")
libraries/ = SubResource("AnimationLibrary_fgutl")
@@ -0,0 +1,231 @@
orcextractor_combat.png
size:868,868
filter:Linear,Linear
C_armA
bounds:462,67,95,58
offsets:573,361,1080,1080
C_armchainA1
bounds:526,607,69,75
offsets:578,374,1080,1080
C_armclothA
bounds:671,431,61,53
offsets:573,366,1080,1080
C_armclothA2
bounds:831,482,26,45
offsets:609,365,1080,1080
C_bodyA
bounds:228,593,170,89
offsets:521,337,1080,1080
C_clothbodyA1
bounds:509,6,37,59
offsets:654,337,1080,1080
C_clothbodyA2
bounds:316,209,21,26
offsets:664,332,1080,1080
C_clothface
bounds:634,145,52,35
offsets:681,352,1080,1080
C_clothlegA1
bounds:583,492,94,99
offsets:441,311,1080,1080
C_clothlegA2
bounds:831,529,35,84
offsets:498,333,1080,1080
C_faceA_a
bounds:564,703,31,39
offsets:696,341,1080,1080
C_faceA_b
bounds:832,184,32,37
offsets:697,343,1080,1080
C_faceB_a
bounds:832,223,31,39
offsets:696,341,1080,1080
C_faceB_b
bounds:735,92,32,37
offsets:697,343,1080,1080
C_hairbackA
bounds:559,51,81,81
offsets:660,347,1080,1080
C_hairbackB1_1
bounds:734,463,95,71
offsets:602,378,1080,1080
C_hairbackB1_2
bounds:794,264,66,62
offsets:631,375,1080,1080
C_hairbackB2_2
bounds:2,307,200,284
offsets:515,119,1080,1080
C_hairclothA1
bounds:548,271,69,95
offsets:621,332,1080,1080
C_hairfrontA1_1
bounds:804,328,43,75
offsets:690,337,1080,1080
C_hairfrontA1_2
bounds:821,615,45,89
offsets:688,323,1080,1080
C_hairfrontA2_1
bounds:624,182,46,88
offsets:671,328,1080,1080
C_hairfrontA2_2
bounds:679,486,53,105
offsets:666,311,1080,1080
C_hairfrontA3_1
bounds:567,744,28,68
offsets:719,333,1080,1080
C_hairfrontA3_2
bounds:672,183,27,87
offsets:719,314,1080,1080
C_hairfrontA4_1
bounds:673,288,42,83
offsets:709,328,1080,1080
C_hairfrontA4_2
bounds:619,272,52,94
offsets:705,318,1080,1080
C_hairfrontB
bounds:688,131,52,34
offsets:689,373,1080,1080
C_headA
bounds:200,18,119,61
offsets:620,336,1080,1080
C_legA1
bounds:204,81,143,123
offsets:441,311,1080,1080
C_legA1_L
bounds:716,2,33,28
offsets:516,400,1080,1080
C_legA2
bounds:597,593,120,122
offsets:349,310,1080,1080
C_legB1
bounds:701,210,67,69
offsets:540,364,1080,1080
C_legchainA1
bounds:656,373,58,56
offsets:360,364,1080,1080
C_nippleA
bounds:671,32,44,29
offsets:606,276,1080,1080
C_nippleB
bounds:686,63,45,29
offsets:643,278,1080,1080
C_pregnant_1
bounds:583,444,86,46
offsets:542,324,1080,1080
C_pregnant_2
bounds:734,405,100,56
offsets:535,316,1080,1080
C_pregnant_3
bounds:403,2,104,63
offsets:532,308,1080,1080
C_pregnant_4
bounds:548,368,106,74
offsets:530,300,1080,1080
C_titsA
bounds:123,23,75,93
offsets:597,281,1080,1080
C_titsA_L
bounds:770,193,60,69
offsets:611,286,1080,1080
C_titsB
bounds:550,177,72,92
offsets:624,282,1080,1080
M_armA1
bounds:204,206,110,197
offsets:380,417,1080,1080
M_armA2
bounds:605,717,129,149
offsets:377,320,1080,1080
M_armB1
bounds:335,411,95,180
offsets:553,416,1080,1080
M_armB2
bounds:462,127,86,131
offsets:573,347,1080,1080
M_body
bounds:2,593,224,273
offsets:388,360,1080,1080
M_chainA1
bounds:734,536,85,82
offsets:561,436,1080,1080
M_chainA2
bounds:717,281,75,62
offsets:589,446,1080,1080
M_chainB1
bounds:349,76,111,159
offsets:476,468,1080,1080
M_chainB2
bounds:535,463,46,142
offsets:593,468,1080,1080
M_cumshotA_a
bounds:686,94,47,35
offsets:467,375,1080,1080
M_cumshotB_a
bounds:632,2,37,47
offsets:484,326,1080,1080
M_dickA
bounds:818,147,45,35
offsets:527,368,1080,1080
M_dickB
bounds:548,9,82,40
offsets:481,361,1080,1080
M_dickC
bounds:321,2,80,72
offsets:446,300,1080,1080
M_eye
bounds:763,156,53,35
offsets:584,593,1080,1080
M_headA1
bounds:717,345,85,58
offsets:544,548,1080,1080
M_headA2
bounds:701,167,60,41
offsets:570,569,1080,1080
M_headB1
bounds:2,19,119,97
offsets:528,575,1080,1080
M_headB1_L
bounds:733,64,36,26
offsets:552,643,1080,1080
M_headB2
bounds:671,2,43,28
offsets:580,576,1080,1080
M_legA1
bounds:432,431,101,169
offsets:371,131,1080,1080
M_legA2
bounds:204,405,129,186
offsets:364,232,1080,1080
M_legB1
bounds:316,237,109,166
offsets:531,138,1080,1080
M_legB2
bounds:2,118,200,187
offsets:448,241,1080,1080
M_legclothA1
bounds:719,620,98,84
offsets:365,116,1080,1080
M_legclothA2
bounds:736,706,119,160
offsets:365,139,1080,1080
M_legclothB1
bounds:400,602,124,80
offsets:519,127,1080,1080
M_legclothB2
bounds:427,260,119,149
offsets:528,144,1080,1080
M_semenA_1
bounds:550,134,82,41
offsets:483,363,1080,1080
M_semenB_1
bounds:642,69,42,74
offsets:474,298,1080,1080
shadow
bounds:228,814,375,52
offsets:344,114,1080,1080
weapon_skill_a
bounds:228,684,334,63
offsets:625,446,1080,1080
weapon_skill_b
bounds:228,749,337,63
offsets:625,446,1080,1080
Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

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

After

Width:  |  Height:  |  Size: 13 KiB

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cb60iw3mbeoub"
path="res://.godot/imported/orcextractor_icon.png-71ea44624e0a9dacd3d2b12df377351d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://characters/orc_elf1/spine/orcextractor_icon.png"
dest_files=["res://.godot/imported/orcextractor_icon.png-71ea44624e0a9dacd3d2b12df377351d.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,7 @@
[
{
"Type": "Combination",
"Id": "OrcExtractor",
"Cost": 20,
},
]