26
26
27
27
namespace xivModdingFramework . General . Enums
28
28
{
29
+
30
+ public enum XivBaseRace : byte
31
+ {
32
+ Hyur = 1 ,
33
+ Elezen = 2 ,
34
+ Lalafell = 3 ,
35
+ Miqote = 4 ,
36
+ Roegadyn = 5 ,
37
+ AuRa = 6 ,
38
+ Hrothgar = 7 ,
39
+ Viera = 8
40
+ } ;
41
+
42
+ public enum XivSubRace : byte
43
+ {
44
+ Hyur_Midlander = 1 ,
45
+ Hyur_Highlander ,
46
+ Elezen_Wildwood ,
47
+ Elezen_Duskwright ,
48
+ Lalafell_Plainsfolk ,
49
+ Lalafell_Dunesfolk ,
50
+ Miqote_Seeker ,
51
+ Miqote_Keeper ,
52
+ Roegadyn_SeaWolf ,
53
+ Roegadyn_Hellsguard ,
54
+ AuRa_Raen ,
55
+ AuRa_Xaela ,
56
+ Hrothgar_Hellion ,
57
+ Hrothgar_Lost ,
58
+ Viera_Rava ,
59
+ Viera_Veena
60
+ } ;
61
+
29
62
/// <summary>
30
63
/// Enum containing all known races
31
64
/// </summary>
@@ -81,7 +114,7 @@ public class XivRaceNode {
81
114
public bool HasSkin = false ;
82
115
}
83
116
84
- public static class XivRaceTree
117
+ public static class XivRaceTree
85
118
{
86
119
private static XivRaceNode tree ;
87
120
private static Dictionary < XivRace , XivRaceNode > dict ;
@@ -351,7 +384,7 @@ public static XivRaceNode GetFullRaceTree()
351
384
public static bool IsChildOf ( this XivRace possibleChild , XivRace possibleParent , bool allowSame = true )
352
385
{
353
386
CheckTree ( ) ;
354
- if ( possibleChild == possibleParent && allowSame )
387
+ if ( possibleChild == possibleParent && allowSame )
355
388
{
356
389
return true ;
357
390
}
@@ -369,7 +402,7 @@ public static bool IsChildOf(this XivRace possibleChild, XivRace possibleParent,
369
402
public static bool IsParentOf ( this XivRace possibleParent , XivRace possibleChild , bool allowSame = true )
370
403
{
371
404
CheckTree ( ) ;
372
- if ( possibleChild == possibleParent && allowSame )
405
+ if ( possibleChild == possibleParent && allowSame )
373
406
{
374
407
return true ;
375
408
}
@@ -450,7 +483,7 @@ public static List<XivRace> GetChildren(this XivRace race, bool includeNPCs = fa
450
483
451
484
// Recursion for children.
452
485
var children = new List < XivRace > ( ) ;
453
- foreach ( var c in node . Children )
486
+ foreach ( var c in node . Children )
454
487
{
455
488
children . AddRange ( GetChildren ( c . Race , includeNPCs ) ) ;
456
489
}
@@ -467,17 +500,17 @@ public static List<XivRace> GetChildren(this XivRace race, bool includeNPCs = fa
467
500
public static XivRace GetSkinRace ( this XivRace race )
468
501
{
469
502
var node = GetNode ( race ) ;
470
- if ( node == null )
503
+ if ( node == null )
471
504
{
472
505
return XivRace . Hyur_Midlander_Male ;
473
506
}
474
507
475
- if ( node . HasSkin )
508
+ if ( node . HasSkin )
476
509
{
477
510
return node . Race ;
478
511
}
479
512
480
- while ( node . Parent != null )
513
+ while ( node . Parent != null )
481
514
{
482
515
node = node . Parent ;
483
516
if ( node . HasSkin )
@@ -487,6 +520,77 @@ public static XivRace GetSkinRace(this XivRace race)
487
520
return XivRace . Hyur_Midlander_Male ;
488
521
}
489
522
523
+
524
+ /// <summary>
525
+ /// Retrieves the subrace offset for this race.
526
+ /// </summary>
527
+ /// <param name="race"></param>
528
+ /// <returns></returns>
529
+ public static int GetSubRaceId ( this XivSubRace subrace )
530
+ {
531
+ return ( int ) subrace % 2 == 1 ? 0 : 1 ;
532
+ }
533
+ public static XivBaseRace GetBaseRace ( this XivSubRace subrace )
534
+ {
535
+ byte rId = ( byte ) ( ( ( ( byte ) subrace ) - 1 ) / 2 ) ;
536
+ return ( XivBaseRace ) rId ;
537
+ }
538
+
539
+ /// <summary>
540
+ /// Retrieves the base race enum value for this race/clan/gender race.
541
+ /// Used for CMP files and a few other things.
542
+ /// </summary>
543
+ /// <param name="race"></param>
544
+ /// <returns></returns>
545
+ public static XivBaseRace GetBaseRace ( this XivRace race )
546
+ {
547
+ switch ( race )
548
+ {
549
+ case XivRace . Hyur_Midlander_Male :
550
+ case XivRace . Hyur_Midlander_Female :
551
+ case XivRace . Hyur_Midlander_Male_NPC :
552
+ case XivRace . Hyur_Midlander_Female_NPC :
553
+ case XivRace . Hyur_Highlander_Male :
554
+ case XivRace . Hyur_Highlander_Female :
555
+ case XivRace . Hyur_Highlander_Male_NPC :
556
+ case XivRace . Hyur_Highlander_Female_NPC :
557
+ return XivBaseRace . Hyur ;
558
+ case XivRace . Elezen_Male :
559
+ case XivRace . Elezen_Female :
560
+ case XivRace . Elezen_Male_NPC :
561
+ case XivRace . Elezen_Female_NPC :
562
+ return XivBaseRace . Elezen ;
563
+ case XivRace . Lalafell_Male :
564
+ case XivRace . Lalafell_Female :
565
+ case XivRace . Lalafell_Male_NPC :
566
+ case XivRace . Lalafell_Female_NPC :
567
+ return XivBaseRace . Lalafell ;
568
+ case XivRace . Miqote_Male :
569
+ case XivRace . Miqote_Female :
570
+ case XivRace . Miqote_Male_NPC :
571
+ case XivRace . Miqote_Female_NPC :
572
+ return XivBaseRace . Miqote ;
573
+ case XivRace . Roegadyn_Male :
574
+ case XivRace . Roegadyn_Female :
575
+ case XivRace . Roegadyn_Male_NPC :
576
+ case XivRace . Roegadyn_Female_NPC :
577
+ return XivBaseRace . Roegadyn ;
578
+ case XivRace . AuRa_Male :
579
+ case XivRace . AuRa_Female :
580
+ case XivRace . AuRa_Male_NPC :
581
+ case XivRace . AuRa_Female_NPC :
582
+ return XivBaseRace . AuRa ;
583
+ case XivRace . Viera :
584
+ case XivRace . Viera_NPC :
585
+ return XivBaseRace . Viera ;
586
+ case XivRace . Hrothgar :
587
+ case XivRace . Hrothgar_NPC :
588
+ return XivBaseRace . Hrothgar ;
589
+ default :
590
+ return XivBaseRace . Hyur ;
591
+ }
592
+ }
593
+
490
594
/// <summary>
491
595
/// Gets the internal FFXIV MTRL path for a given race's skin, using the tree as needed to find the appropriate ancestor skin.
492
596
/// </summary>
0 commit comments