From 739ff253ec06ffb33df027535c73c003510b713a Mon Sep 17 00:00:00 2001 From: Robin Gilh Date: Sat, 25 Apr 2020 15:20:37 +0200 Subject: [PATCH] Dragon work --- assets/common/npc_names.json | 14 + .../voxygen/voxel/dragon_center_manifest.ron | 46 ++ .../voxygen/voxel/dragon_lateral_manifest.ron | 70 +++ assets/voxygen/voxel/npc/dragon/wing_in_l.vox | Bin 2884 -> 0 bytes assets/voxygen/voxel/npc/dragon/wing_in_r.vox | Bin 2884 -> 0 bytes .../voxygen/voxel/npc/dragon/wing_out_l.vox | Bin 3544 -> 0 bytes .../voxygen/voxel/npc/dragon/wing_out_r.vox | Bin 3544 -> 0 bytes .../female}/chest_front.vox | Bin .../female}/chest_rear.vox | Bin .../{dragon => reddragon/female}/foot_bl.vox | Bin .../{dragon => reddragon/female}/foot_br.vox | Bin .../{dragon => reddragon/female}/foot_fl.vox | Bin .../{dragon => reddragon/female}/foot_fr.vox | Bin .../npc/{dragon => reddragon/female}/head.vox | Bin .../female}/tail_front.vox | Bin .../female}/tail_rear.vox | Bin .../voxel/npc/reddragon/female/wing_in_l.vox | Bin 0 -> 57352 bytes .../voxel/npc/reddragon/female/wing_in_r.vox | Bin 0 -> 57352 bytes .../voxel/npc/reddragon/female/wing_out_l.vox | Bin 0 -> 58012 bytes .../voxel/npc/reddragon/female/wing_out_r.vox | Bin 0 -> 58012 bytes .../voxel/npc/reddragon/male/chest_front.vox | Bin 0 -> 4556 bytes .../voxel/npc/reddragon/male/chest_rear.vox | Bin 0 -> 6080 bytes .../voxel/npc/reddragon/male/foot_bl.vox | Bin 0 -> 1408 bytes .../voxel/npc/reddragon/male/foot_br.vox | Bin 0 -> 1408 bytes .../voxel/npc/reddragon/male/foot_fl.vox | Bin 0 -> 1408 bytes .../voxel/npc/reddragon/male/foot_fr.vox | Bin 0 -> 1408 bytes .../voxygen/voxel/npc/reddragon/male/head.vox | Bin 0 -> 3040 bytes .../voxel/npc/reddragon/male/tail_front.vox | Bin 0 -> 1784 bytes .../voxel/npc/reddragon/male/tail_rear.vox | Bin 0 -> 1392 bytes .../voxel/npc/reddragon/male/wing_in_l.vox | Bin 0 -> 57352 bytes .../voxel/npc/reddragon/male/wing_in_r.vox | Bin 0 -> 57352 bytes .../voxel/npc/reddragon/male/wing_out_l.vox | Bin 0 -> 58012 bytes .../voxel/npc/reddragon/male/wing_out_r.vox | Bin 0 -> 58012 bytes common/src/comp/body.rs | 2 + common/src/comp/body/dragon.rs | 165 ++---- common/src/generation.rs | 3 + common/src/npc.rs | 13 +- voxygen/src/anim/dragon/mod.rs | 81 ++- voxygen/src/scene/figure/cache.rs | 95 +++- voxygen/src/scene/figure/load.rs | 477 ++++++++++++------ world/src/lib.rs | 2 +- 41 files changed, 662 insertions(+), 306 deletions(-) create mode 100644 assets/voxygen/voxel/dragon_center_manifest.ron create mode 100644 assets/voxygen/voxel/dragon_lateral_manifest.ron delete mode 100644 assets/voxygen/voxel/npc/dragon/wing_in_l.vox delete mode 100644 assets/voxygen/voxel/npc/dragon/wing_in_r.vox delete mode 100644 assets/voxygen/voxel/npc/dragon/wing_out_l.vox delete mode 100644 assets/voxygen/voxel/npc/dragon/wing_out_r.vox rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/chest_front.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/chest_rear.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/foot_bl.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/foot_br.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/foot_fl.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/foot_fr.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/head.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/tail_front.vox (100%) rename assets/voxygen/voxel/npc/{dragon => reddragon/female}/tail_rear.vox (100%) create mode 100644 assets/voxygen/voxel/npc/reddragon/female/wing_in_l.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/female/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/female/wing_out_l.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/female/wing_out_r.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/chest_front.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/chest_rear.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/foot_bl.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/foot_br.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/foot_fl.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/foot_fr.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/head.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/tail_front.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/tail_rear.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/wing_in_l.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/wing_in_r.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/wing_out_l.vox create mode 100644 assets/voxygen/voxel/npc/reddragon/male/wing_out_r.vox diff --git a/assets/common/npc_names.json b/assets/common/npc_names.json index bced2a7ad1..88b237ac4d 100644 --- a/assets/common/npc_names.json +++ b/assets/common/npc_names.json @@ -539,5 +539,19 @@ "generic": "Fungome" } } + }, + "dragon": { + "body": { + "keyword": "dragon", + "names": [ + "Smaug" + ] + }, + "species": { + "reddragon": { + "keyword": "reddragon", + "generic": "Reddragon" + } + } } } diff --git a/assets/voxygen/voxel/dragon_center_manifest.ron b/assets/voxygen/voxel/dragon_center_manifest.ron new file mode 100644 index 0000000000..a4f492c4e1 --- /dev/null +++ b/assets/voxygen/voxel/dragon_center_manifest.ron @@ -0,0 +1,46 @@ +({ + (Reddragon, Male): ( + head: ( + offset: (-7.0, -9.0, -5.5), + center: ("npc.reddragon.male.head"), + ), + chest_front: ( + offset: (-7.0, 4.5, 5.0), + center: ("npc.reddragon.male.chest_front"), + ), + chest_rear: ( + offset: (-7.0, -4.5, 5.0), + center: ("npc.reddragon.male.chest_rear"), + ), + tail_front: ( + offset: (-7.0, -4.5, -5.0), + center: ("npc.reddragon.male.tail_front"), + ), + tail_rear: ( + offset: (-7.0, -4.5, -5.0), + center: ("npc.reddragon.male.tail_rear"), + ) + ), + (Reddragon, Female): ( + head: ( + offset: (-7.0, -9.0, -5.5), + center: ("npc.reddragon.female.head"), + ), + chest_front: ( + offset: (-7.0, 4.5, 5.0), + center: ("npc.reddragon.female.chest_front"), + ), + chest_rear: ( + offset: (-7.0, -4.5, 5.0), + center: ("npc.reddragon.female.chest_rear"), + ), + tail_front: ( + offset: (-7.0, -4.5, -5.0), + center: ("npc.reddragon.female.tail_front"), + ), + tail_rear: ( + offset: (-7.0, -4.5, -5.0), + center: ("npc.reddragon.female.tail_rear"), + ) + ), +}) diff --git a/assets/voxygen/voxel/dragon_lateral_manifest.ron b/assets/voxygen/voxel/dragon_lateral_manifest.ron new file mode 100644 index 0000000000..d9e64fb684 --- /dev/null +++ b/assets/voxygen/voxel/dragon_lateral_manifest.ron @@ -0,0 +1,70 @@ +({ + (Reddragon, Male): ( + wing_in_l: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.male.wing_in_l"), + ), + wing_in_r: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.male.wing_in_r"), + ), + wing_out_l: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.male.wing_out_l"), + ), + wing_out_r: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.male.wing_out_r"), + ), + foot_fl: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.reddragon.male.foot_fl"), + ), + foot_fr: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.reddragon.male.foot_fr"), + ), + foot_bl: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.reddragon.male.foot_bl"), + ), + foot_br: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.reddragon.male.foot_br"), + ) + ), + (Reddragon, Female): ( + wing_in_l: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.female.wing_in_l"), + ), + wing_in_r: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.female.wing_in_r"), + ), + wing_out_l: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.female.wing_out_l"), + ), + wing_out_r: ( + offset: (20.0, 20.0, 5.0), + lateral: ("npc.reddragon.female.wing_out_r"), + ), + foot_fl: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.reddragon.female.foot_fl"), + ), + foot_fr: ( + offset: (-2.5, -4.0, -1.5), + lateral: ("npc.reddragon.female.foot_fr"), + ), + foot_bl: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.reddragon.female.foot_bl"), + ), + foot_br: ( + offset: (-2.5, -4.0, -3.0), + lateral: ("npc.reddragon.female.foot_br"), + ) + ), +}) \ No newline at end of file diff --git a/assets/voxygen/voxel/npc/dragon/wing_in_l.vox b/assets/voxygen/voxel/npc/dragon/wing_in_l.vox deleted file mode 100644 index 3d7e37036e36fbb2335d7023cabf78aaa3147420..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2884 zcmchYZD^L)8ON_^lIP`qe|_?zNsNgm+SS+kGHn;Du8meR>+0IfO1rhJnUp>Rkyb*7 zbt`kN&zuvj(9XFbZj`!KqHOGglOm;1inuZcLrNKAU-w~*ef#fsBHM?;*tb3K<2vWu z_w~R2*E#1-_DwuKaK_AbZ5iK9u$7+K-to!pzMJstfl+9K$Df!Sw+aJ(*I8)mwu!bL zo8YC1wq7FCQ)||{t=X7ohZ=2msNQAGF2-GqyUY%CL!;d$8XeFH6{tcD>fnJ70fZ1i z3<;!=K@J6!(10$$O9LMbJTw--Lg<5j7=T4E2#a9|hG7XTg%O*mEyVMDn<(*C;;nGt zFL&TEbKo;|;5BjJH+JATa^O33;5~5Q-*?c1=b(>b5&J_gH3$7v9rRRj&{wB}-ikqM zcFFBX$xdfJ4t5^cVFl5bq$XfYgYi5hBm7$pqS}Vmv zvdCI7F=igI9`QV69I_VhEEuq+KVU7t-(wY)xj_gSk(tTC^$Ugdd(afS5?``5Y9 zTAd5zK&zlufnGt~0?h&s1-b=( z3bYHn6#*LfEPNuK3y+BZqE4?)ug3m3ZE6k{daF52YS!8BoSHd%nO8aEf-^25hX!QO1@xCuE2F=R zS~avY=tM80Rz`mrwK8he-JJgF?j8E8^M1x&W}H>Vex}q;$xG=crJt03s^q5BsFGXb z{ggAWv7T}Vs_s4RLmC2pQ}!^WpOk)5_AsTNls!zTk)WNRosg5DouE;1bF?eYH$7DG zRb{QpJc+E8P&2`Qf`uOl=gyhdn5>~)042+au35t^OuIhs}X z9L)&L2))SZvA-eb7jk|fK0`D^e1_zNXolp3XohHpXohHpXomD3q8Z{dL@z`yL@z)i zz+-?$fX@JpfIAVO5pX90Gy*gOGy*gO^a8X3bOLk&bbK^?G<-CCG<-CCeEDej`0~;4 z`L2D=+b7>A-zVQE-y_!}*CW>>*CV%+T#sCjT#wowbv^Eg$NligtMh&*I(2d@Xw}Kh zxi=XeQ^?(U^PQyB%^*Q5=KD!qjv~|>UV1wzA_IAC&`ku8tn%X|7BYQ@4=GoPnd2GGTJhxRhzW+7- z_2QJ4FD|utb-#9gX++QNTd#vVOvj!yoj+u{{zKEcz8;M)8`A!D_iB3EM(tZxYHDq- zPCPWM*#j%Iee)_!e0ifLzp_OKpW3Y>FHGv>_YP|I(yO}t{#%-TbH8r<;@k2(PhDA} zfq?<78XeTSdza{ot4DS6y9;#rr-SToxOX8FZXbF`ug;p;nP~VqN!(IdsSTr8v6KG z!@4%vtyApP=lB1CO{eCxp4j`5rk|5uI(tdSem<+#mG^b-ceiz4^SB;(<-B(Op5ScmiIg;7awSA&c$6zr{>}p+BPY9YN6d(Pcb7IkY)+th!a{rjEIMf(>y83_mg diff --git a/assets/voxygen/voxel/npc/dragon/wing_in_r.vox b/assets/voxygen/voxel/npc/dragon/wing_in_r.vox deleted file mode 100644 index 249db770c865e4474384a467c403d605b9da3a3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2884 zcmchYTZmQn6~@=>+u3LDJ?B1`Gov%(IHNO~#%sJ(W5=jXMx(pN#wJrENt@72C1e;x z5*bp=w4pZf)Y?HKB(=7PEg?3MQCj+7B}fQ_AU2djkq}DhYadGK+t=TJLi-RXed~db zwJ-nmecxK^fA;@i{@B1-Guyj;d>_G9r)CGnCw67-hF=dD1#RH5$0x?Ezy-e>Jm~7S zysK$>H)!?}L9>SlI=U?HbYM+Kr{xWY4$I3G%S#Sr%iA4FmS+y_mZuJx<%vUTdC?)U zJa#BrUT}ylj~oh?hoHS-Q(3=FwReCz=ma&;1*)JMR6x^O?LDBE>qTHO=(DL3`6Y5o z3;c6zrM(BlF#sFGV?9u>F>%(Q~9s>{Vw)%C||FoP=33uqPGdUOitL`8tV z2)#1zqm+42Uz8Eyi0~T05#cT3zD{1m`-)rR)>D5(Emij%y@bwFRE2A~HKJqTlF zGYE?C;yq08iGE0J6>_VN)Aa<-7@m+?Luw7t57DpjK19C)LU+x63R%lv?`X(g3ds%G zOCd7|sW+s~kUB%SLv(_IwSuL@7+szR_-L>uz(+uj1L_XwaX{Sxx&b{7&<&_NKr>+O z0lEQm56}&$J3uqQYk+2eX5jc7H<|&Oeq=2lT^~)KKKu08r(U1heCqPy_Tly6^x^a2 z^5OB}@LfJUKAb-MK3YDyJ|2Ah_;~a2>EqeQzt0SP`s-7pKLm!E72lV7!}6L#oo^5S zmkxM3*dqz%ZaU;Sl?TK1KMA(DO$4#w-WR_|DL$ zgngUP`-B-3@m9oRk(m|oU1V-WR}-~V-96rFXch5R!-F>r&k$G&2Eh_A0Qx~6SPT{c z&IXTj!Q-s(I1@b129GnrV`d)n^6=r+KoxL4c$^I$=Yq$X;Bg*!oCO}|fX5l&@%{Js z_IrHyJieJ8-^?nx6$kRmpz3PDXU#==RCM12>WHZ)X0|c)#mqKle-^2u$Q~@xgCgr= zX3g<-w5<(zcC<{s$F=9K;Vd(UM;?4&y9EnJp>5ierh0m#gcLY3KypXH8pgnCz?QACF~o zCE3-6PA;$N^6CzKe1EUBdx_@EbRGNw`~}RtV7l^S)6L7K58mZ|%ye;=>DP~#?taTO z!Tk#dO{bsc`7zUuQPbf~riX(-uk(EW`W{X08r1RqBRc!cTFpGVQD>jsp_||Tn*Mre zQY)8sYU|p5?fKG(o;kQtM|PWLpDxT+yk?^}Rav z;IQTouhOoqYm|R^vnIZ>T}PhWr{m90==ArFX#Vmmy7S(fnt$VvZvNuiO4C%`^{NI2 z2DD~$P#f-DrZ27?)#>jp(v_bM>W?3+(A|$#>J2pKFPT34t?AFdHyxiG(d)D8bnERM z`rDrlX!_NPPW`f>cW*a!SN;FB{$o4s|5E?Db?fw_jTf|P%|&fF`Ldd`O}+m!)5l*o zy)`nT(a}-eSG!*iKXg?#dt4pU9lCz*vl+hB!`|uZ(|3mFw0hN)o__Tebsz51N52}@ z^@*m=(5uh)f7_Nb3tW#M_)yc&N-v(ftl6K>t9A7~o&Vh(-8Xeo+g`q)JwLgj1Ml3? z*w~mpHOXS2f5^XM`s6pC`TK$H-GcQLcHhvZPm+7t!tb7&%1xG`CPPr0YO3i!~g&Q diff --git a/assets/voxygen/voxel/npc/dragon/wing_out_l.vox b/assets/voxygen/voxel/npc/dragon/wing_out_l.vox deleted file mode 100644 index f8b1875b49cc4290ca66945945c8dc09541a5c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3544 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 diff --git a/assets/voxygen/voxel/npc/dragon/chest_front.vox b/assets/voxygen/voxel/npc/reddragon/female/chest_front.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/chest_front.vox rename to assets/voxygen/voxel/npc/reddragon/female/chest_front.vox diff --git a/assets/voxygen/voxel/npc/dragon/chest_rear.vox b/assets/voxygen/voxel/npc/reddragon/female/chest_rear.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/chest_rear.vox rename to assets/voxygen/voxel/npc/reddragon/female/chest_rear.vox diff --git a/assets/voxygen/voxel/npc/dragon/foot_bl.vox b/assets/voxygen/voxel/npc/reddragon/female/foot_bl.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/foot_bl.vox rename to assets/voxygen/voxel/npc/reddragon/female/foot_bl.vox diff --git a/assets/voxygen/voxel/npc/dragon/foot_br.vox b/assets/voxygen/voxel/npc/reddragon/female/foot_br.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/foot_br.vox rename to assets/voxygen/voxel/npc/reddragon/female/foot_br.vox diff --git a/assets/voxygen/voxel/npc/dragon/foot_fl.vox b/assets/voxygen/voxel/npc/reddragon/female/foot_fl.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/foot_fl.vox rename to assets/voxygen/voxel/npc/reddragon/female/foot_fl.vox diff --git a/assets/voxygen/voxel/npc/dragon/foot_fr.vox b/assets/voxygen/voxel/npc/reddragon/female/foot_fr.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/foot_fr.vox rename to assets/voxygen/voxel/npc/reddragon/female/foot_fr.vox diff --git a/assets/voxygen/voxel/npc/dragon/head.vox b/assets/voxygen/voxel/npc/reddragon/female/head.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/head.vox rename to assets/voxygen/voxel/npc/reddragon/female/head.vox diff --git a/assets/voxygen/voxel/npc/dragon/tail_front.vox b/assets/voxygen/voxel/npc/reddragon/female/tail_front.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/tail_front.vox rename to assets/voxygen/voxel/npc/reddragon/female/tail_front.vox diff --git a/assets/voxygen/voxel/npc/dragon/tail_rear.vox b/assets/voxygen/voxel/npc/reddragon/female/tail_rear.vox similarity index 100% rename from assets/voxygen/voxel/npc/dragon/tail_rear.vox rename to assets/voxygen/voxel/npc/reddragon/female/tail_rear.vox diff --git a/assets/voxygen/voxel/npc/reddragon/female/wing_in_l.vox b/assets/voxygen/voxel/npc/reddragon/female/wing_in_l.vox new file mode 100644 index 0000000000000000000000000000000000000000..4248691c504188886c549aeeb41f1a43f1127a17 GIT binary patch literal 57352 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 M;Kq0=#T_F51y29oPyhe` literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/female/wing_in_r.vox b/assets/voxygen/voxel/npc/reddragon/female/wing_in_r.vox new file mode 100644 index 0000000000000000000000000000000000000000..10a75b0e8faa0744eab0d325bcc066bad64c4b88 GIT binary patch literal 57352 zcmdsH;t~-l zNUP#fiq?usfog4wXsNZemZG(`mRf7A-D_KG?Rxq<_l2&T%d*OWXai1Q1ukF#ZeRwU(thOyK9v0+0D{17!dPGfPGAMD z0*pm;0}t>5pQ&H@K>%e(3F_!$NAwqBEMmF6Usc$$s=^9THd_G7X0%x>z}&Aas9O=8 z=nq9yS%7GI&Kna}uh#^E1s05`T2+G(SlmkDoBbN`+hPCh_ zdJ+9-v!ZVR(S}%o_4lIeLfHg#aP|~kT5FN;2LYouOhw&cHi8ZmpyA1RYiz) zgmx2RC1NRJ5U~s~fLIRvpaS@S8F+yOcz_kSfepBT9XNpl6gc};At(aHPRs>NpcIsW za!>)xzyhqm2JFBAoWKR#zyrL%2mBxaf}j$FKozJ4HDEXx0UQN*A25YcWdojJSf@PX z$-~;g-ItF&X0WG$0{CK$gN0ZJ5Gq2%o>UfNJ+NLu>{$@cWhI{ZO1vjRcz1;GoK)fY zslvTpjr+W&qF+_x-mbzoeDEqLd5jjK^Z6oCQt&3K@lhf1t1^f0V_PL z#Td`vGseNs7p~EPYjh*pKmdDE27*}YQp8F`6QT>}?7#^eAcS`1?omU)P~gUUVTcQ5 z;6d41lI>cuXn|jU5}y2nKN4x+;4&XwGZ$TEHj4VQl#6_BC^$6-*ZCL*I0csnb1a^9 znVlPO@OeH?oa6GmY0DS!=ktk!&*g(ySG+U9l`v;KwHG&@)hlvlFTSR;dexoTi?8Uc zUiD}8$~#xDhBJHdRiBls@yuQY=jt`_%wGJ3%2~OZxYweY7f(}sK{%S5o2jp_kKWp< zXx6<)sK)*wy>GYE;luN}D?K**04*9oQPD13R+RbRa|KsZR1- z6Qa;{<7mvTNu*}vlj*Op7454PT{1?|%4S9L^780zv@dM%Qffvu ztzS5rwkPVS@A4+v-hK%kzWEAzcXx`$)i`NNT_w%EXf!33Hc`hMMVqcxw5vzap*s{! z40>ty*x_{5#9GQtpF~T?Iw{rQquXbWp#3W+(2OY&ie5U2R$MlXI<8qj>oY58%Z(kh zf6q;H?D>0X|2i^ho9V)hyJ+rxhiLH=$7t%*sq_}!SgHun2Q=)MqBoy5t`FZzeB^mN zf;7&1F~9HV!Xa55=Z{M1IDW`vvRt0iT-=p81J?pZGB2;3nskXM>?gYP1VrvqqWP1L;D4R<} z*-RH@GeeZkrJ`(Rin5s{%4W7Gn>nIv=8CeJC(35NC>#E7ujKp`H!8~JGEp`QMcFJ8 zWwTh6%@R>Imy5DlD$3>xQ8vp&*(?`jvqF^3m7;8}5@mC>D4Ug{Y+|Bpt`TJu7iF_b zlue5$n^sXa2~jp}qHL0)Y}!THq(s?VE6S!rlucTcO{XZEE>SiaQ8rmoHXjpZlM`jr zEy|`xlufTFo7JLh)`+rME6Qe_D4X@7Y(6f^rcad3Cq&s?C(7n}Q8u3xWwSw)%|=l+ zn?%{%Aj;-OQ8qV;viX!Ko0~=1Y!+p6izu60McLdY%I0=aHvOV(?hs|OMU>5*qHMN` zvbjr?%{EaspB81aU6joZQ8ssrve_xh<};#fJ}b)R9#J;;in6&+l+7+tHusCNc|erS zgQ9F65@qu_Q8v3p*?eA<%^p!U4~w#SM3l`JMA6M--)vMy(pVM zh_d;kD4X|0+5AbA&7Vct{6&<_`=V_AD$3>qQ8s@QW%HpZo4<>)`G+W*e~PmCmnfTm zi?aETC>s)GqlPF|3Zr}w>sgmg6mg+7)z;SAohan;nnWtu-h*x`Qo!|GrZ?F>45e^w zM33suCR&VoqaMKZSazT#kB6i(Iip&ytMMM4F3fGQWSHB=hie;+YQ*T-Y}D2mwI)4L zTe^2GUxywMOSk59B^SMTP7PZ57zzeW^jwLq)w-cG)0!CUp3pnpSS zC=za9cirBZN}S%28_u~xd?IPAM{}c|HB%pJ)$4JhrpHCX#>z$_VZPSs1J}wU2d`D% zm2H`1?8I6bdCs{#x-mJp?&sWWoj9H7>ehv9E_1E!uNST@vzk*hG#2B}SUj7^_4MWv zhDcqbzLHhxcxxiorN^AoaPo#+Fd)I{2PJf&EtT%ng~Zxyh7%aOwK`>7u|5@VNpzn) zm5g`t#?;l;@$xJ?S7yC4tJ0ZFr#9$Jtu?mN*s|`Hc-px6_466$2h_MXczoAlIr z7rV3ZmQD3d4NaOwfB7=l6>I{o0Vkwz(8!U13raqaKHf;Sz1Ypb!=DiS(g-?P#l8d zIF5l7Vn|AzltO^oZql?R4yBZqQtHq&ZAvLg)AVlIrfGV0~rK?ZKSef!#@ZW4U@rtzgA zS}~0ff+na>R!o=}OI1ufQZds~-6lqCh;*AqViPn&9$b(EH+cOO;{$Ji2p&t2Jh;IV zB7zHoafnq+fS9FiATeS57V^FXV>1U|a>As26_c{iZxRxaqTi&2J`=M!wCiH*q>KK@1U-M1NDa z2{7*DnZOhFQYjol{HNIS?w1Om)0N^EAHF=9P2PE11r zQjmmbL$}E{PzQ1lhb$x@14&3j3R>!U26@OqyuRBch)GC68ZwZb)@^drs0Xdk0y9{r zmcWE*je{S26Q<2eS&Xy?+z=)20@kaIHJ+KCFw=2uiAZ5!wjh7{i;hcmjuKi#+;(S`_>SK5CoZD0Q}6+#~i)jVV-X0>0+ME%#m~A zXRiYgWZyy%h6qI2ix|XN`vfE*1!>4YmUYQN9$KIk+6;4q8DN;FVV)5Wd&s-cz}nVB zjC14TEM?gzFEK~-5c9-F_QuWgH1(S(YlH@<$1iHzveyw}oERo1h-vC4i2=@jis&Xr zZF`7=k9uJ*?;J77JMAHQXydl!yz3GBu5*4OoTUhNMVJ_-EM)Hi-t#bhgg84v&P9m1 zgls$V5z1ZUo1uxaMsQQd!!09R*!DvV5j_wDFYiH= zImRGjvGwgU+W3hniyf1CY0?4GF8W9lGvxg?+UMZsT}seLfIbrBgTyA*DMXycSq&4D zv`s-HYug0P&`Lf>Y$0Zed18j>g*0pABf42XKQRdb-pvFtNQ^R0oOO=UriFEG;7({H z-^kf-Vh@|a1vv=X{)t)JKQTj06Mc{ZKSby+VAFgb2--Y#Lfiq3^c%HjfIV;Kj5hJS z8S>zQ9JnD12|Pobw=`{oL^t`c-A~pgO*%lGCi)8!!?u57it>c@AnhVH@y<4L9$erC z4+I!H%K7ozGz1|8VTdrdX8MYeZn5Rm%@Z4#s~19ypP}zGZ1Q+FQ@PHS5 z;D-PN!9$;Zh>(s#j5FCn%(B*bVuXFj5!1vhF-6P}!}Ra6?%)A0_`nYVo2O47BsfD6 z@=<7o7_>kf@{r&@&k>W5g%o5U4KD67H|Nv?Uhvs73$3`fL5Q@A^AjdUAqFiFhdd-8 z2T8tHWQi%rKpNcKkschp;DaRnB_K#T1TCcFcCATAArCRgK^(G>fD9xd&G(`dc(`}H z;NvdvLjZyhf-vOi*AIEpF~~t2vXFob-^-H3>2-Wxn#Q}q9qwGDsVIMYcKlNa{u<5Bjw%&Ae%ogym&+X^jGn?M9 z>h>-6XU20M`>YX)BR#_~HFRWz?-&3po(pq*-@2S;sX)QaW_tfgVv{u9AYAwFB zmYwx``s%v0R@3EbExEK-^W|zSwY9d~c>OA4C&XvjvSo7MzyW#ph>@F~ctvK$ek4DL z#pKMHjkc;hyY`f9T3?W!J6Fho-RtGlp|x`ANROO)q#{dCjY?=`Leh7)N!z^(WZv=R zV%9W@+36AUR7A`x2?=d9k{mXYJ8b02=Z&~_8u1@A5+$E_#>nE0URgIBlI{0J<)f$b zvig9L%}0&wc+SYaH)*>$BQ50_GV8#6S#olvWUDcm@o+}wKiw+rug;O=9Y$u|N8iVc zT=S9_ffvv$PM$1+_lWehK2@tl=97sGg4kNL-uc;E5}M5 za^Tjba%}JhIrHELpZT+`7i>)$t5O52vo&UHo(-f86cxRIAWZe&SIM%K=s zC3h@YB-Pc+W!wCOlow~^;Tvbm$-AzSHP^ID_xqR2_M2D9&bv3s{?YAn_#->z57=F8h}ERe?; z^W@V;UjK@b?|j|J{_O&!U_zN+4;mx$XEv^5j|L)c1|HZ$v zvr|5?^tfEr{*tRYm$9dO%WlCFPAT&X&{L({hBhx^(@oTXDqc>-Md$OLb6W-yV_!WhU6n&}-TlX9{byd1tsCnk)~b`9UH+I8w_Wj=6PHgr;6&Tber#Ocd!G}p zeC$n$2Gi16SDt!yuFfTq-;3X};cGOuAA9rI--|nU=lH%#$wj8vSMKlMHCD3MNpVl9 zJTN$J>$TfUs8}7{H85x|z`~+-r`1@c)LYAUISp*SSeY!bS5C1!TCHU}oovsz(_O)q z6$c8oY++$hS1sFKtGTR}+f&Oebq4Am+O^lt!)Z|*>Z>}L3vKM}t;fc?>#?!htjES4 zNIf?8#nxkEZy`N4_CnTUWB+(pkBvu_jaQY8J!N`MnqQSoK$T5Um5u$A8$It$Sd~pg zl}%KYjs4R~J?~9il}$pGO;VLjN|jAom5u!y7Cm=bR+WwYn>amtlUHTaqROUKl}(!} zo9U`-W~j26smf-SDx2A=Y_3pcGe?!pTvaynRN2f|WwSt)&6TQb7OJvYq{`+hRW=1x zHtnixI#k(osVC z*{o7!bG<5?8&uh>R%NqBmCgHA+1#kg<|b7(YgO5-Q)RPWmCXiKHXBvh*nf&m&;L8f zKLDl3=4Mqkn^oCtQDw7LmCY@xY;IL$vrU!F2UOYIrpo4aRW{pI*?dry%^j+2?o?%S zmnxg0Dx14i+4QKg*`dm&SCvhlDw~ojn|@U`1FCEWRoRqP+1#VbW~VBfAyqcRs%%D7 z*^H{Psi?B~DOEOARW@U)Y{pgD>{4a3Tb0coRW^H7+3ZtgvtO0XPph&ypvvZFRN36C z%H~6=Y<^ai&3&qD?pI}VP?gPxRoQ$*mCXaHY<^Ca&4a3J4ym&Fs4AO>RM~t?mCeJd zY$jCMd|Z{yVO2JtP-SyOmCYwr*&J16^C?v}$5h!oqRQq`RW^^QviYSV2{GlqFv#M;quFB>uRW^U5%H|uYZ2nl4%{Nuq z{D~@?KUHP(Embyurpo4RRW^UF%H|zaHh-bY=3P}b-&SSw9aT1esmkWNs%-vBmCg55 z+5ELCo4-+I^S7#O{!W$6->b6u2URxzsLJM_RM~uAmCZk^viTQPHvg*1<_D^5{!Nw5 z4^`RxyDFO>sj~SGRW|>r%I3dR+5EREoBvT|^S`QWM3s%HGscHeBNWH?RZ1?K=qva4 z?;0yL+w`7Nd0=pyYNox(=BuN-1_tX%6&AHSt;Q;)-deuPX<+lk%4A7{ZBibs*0P;W zwrAYwu3*cG0|i^Qu&}7BmTj-qTvp5NspXbB1N9H>+H2?Gv?vbsRh>+=`}%b=DYc(z zFlFM5RT|mt6bz5{m8Pnfoyx{opNp%PNBV6a#q#91PG+ZYvwn?02=ouLpD%r+e zg|@DO(@Rga)ME!NEGpC{+*cmkIW_1~p4gA=`Qkx$jg)`#pjLCC)4}DsDDN1mbzz5V zcg(A!wNm)#zx zaA0cPFT2@J$3vx&F(*-}j^5+ccNVUHbhqtdahIE~#hyy3I=-t~s)=-TIWyTY)YDfg zjyP>DC^&y0H%&^|?x!T2M1Of`*h!T3Rz__HwcXlXuFcqa)YDrUJO5~)XV`8`$D$6q zJhxr0XJ==242_NsI|jq$y|t~ZZP{3F&rt2~JMU+YeL-ty!|rc!e6U&?8yp>SmbBfD zaqZ+77adin?Er88NS`xY@95BI)ygj`v^oDdLl2&N)t!#!Om<|~b7~oEuf-h$=R2`a z3T^zdV_!Ylb_^7IFUs{eIY-mkN!zBqjbBdV-qO&JtD3d4NavYVZ5rm3-j~o0Vkw;ED})z^AYc4miLfODk!yj_pc5>ym;KibGHw z$1#vX3`wbzQV3AnO`5jEp_I~6N*$V}O(`X5n%+&@G)>Pp&wMKj+ql2{*FWAhkKdX3 z=6Yu4o0Sbew)NcFe#{uNan;&Q1oObRjoG?(`x>v!@Tr5@kcL}t+rIW_D+xaR_57BM zRZKo!F&W4~7Gm)p6DKAh2`NZJ+(kW4#k4{eT#$nnXtuF_(gf-&Cekozn(8J^&^>9w zbrlnESB#J6eqy+pG%*QYNI{x9X<~+$AqI$9q6=D}8JgTZrm3M~8tFIR$Qaa#k&n<{ zpmoy3Tj`&eAo`%SY0`L!sm4j;A*LZ``zPj!ZszK1su+*$6LO}<oF~U2=o|Nu*W1BqczlH+~FRRU>t9x$M~W> z#t(s5j|oBu!VqEIqmZCYEWsW?fVE5zlaPWmWRg853pvO`l78EW?J4@A?F`~fXke|v zedxtBEx5=lqA>>JOTp#@x!ha`KNBepS4mY8GxGej?>!3Qbu zLlQhK%$XR32HJ**QM+F)6;p5LL2P9GnuyKN0y%I&7Fr<#QQD@7F50GuUiwWEeGmvR z9x=?B3=rKAw0XQ@)DMx46aCa{qE0ikfD5t~o@Iz`NP`EW%+pJZ5q&Ps6l>)tAL7ik z;_SxXO-$JO#E_r*#2E8zh6uFMZ;~_TCnks~+Qf+=TaOqfMu`z(181p`F`A$mQno$y zn>d>}&aa!YEYU;E5EDV>3USCl46+b~97G@wG4?c1UupVEGfswdhIE#gB_>0R1<5cG z(h#Iw08$b15Wz9RT1Ie>^6o}SM@h#lc8w{E6XV1LF+oh)GR96o(&D2(@Z#fTTpx4s zai0Aa(gC~zM3-G(aN9^<9&lUeFT;8F5ylW};It@w4Kq4?{ zvcx##z{_}1=Fz~IjgY2~80C40LIgtKvin4ga}ENmLy&Ykb=$y4+6x|VLo2v=*HfH@ zG$bJd3CKd+&t4K^kcTL=K?K5(O;Crk>gBw6z)zVEyx@Um*2+z61s8;HO|zy+)+$2` zGQSk*dhVz!`7r4mF+_QS{xWzbiA|K}DUbR%d$t}lQ`Q1)JokYc0+jo~2VThX+(UFj zE4ZMAJ1)#Ta;#;L=Mm0Qh_wka*8po4WSvv&R~mxU_ptws_Dr*PLF(m+QD|YjFl|D% zoOy;whk5RzeG4>G)&xPG2fz$EyM`XPak1o4nh!w0N+Ik z)-(xmaN!dpwi2Vn1n1MoerHLCAp}8iGY=1V!3TZ_KoCL@h6qF<260G05>hs@rf$9) z1N7wwAK#50@?Or95Bv~-AcP=In+#+voQpJj6Q(>v+X#197MB+GFJbR9)+J7yL5$gF zoR18oAq7$Uez2BtXs1q;Ix+SAFF8*hr*0zUS+{hWJd(;HUZw#EL;cK-ccf%91>58KwQS*gYIR&(%g*UNwK^}ZWoPuBT3r{{YP?jfB^TGSvwlxs-51wt zzErKH7uRaJRIO#U)|MNtTgCo5pXJM!%Yg$2ax~pB`4JBbPsC#I@6i@1T(g`S{aDmTdIMx{;u4zc(TuJ)M))2aIe!YGlW= zM)tiy+s$domuJfC0}Ev7$(53+MrGzhX<6`8n{>P~R}!}ynSC#PA2V|Gi$=`NjKAL{ z=BQuH3sE^VHzX$tF?sWvjL5nfa+KqB8omMFg`<0oJo`x_XHFP-^?C9ujXb%=$d|Sl zd27(fcJh0-89Cff`EDcE&o^@Caw8iW8|4woH!n#`dCg4Ozj>Ye9aUi`R`rTMh1T`*g2U%FVTt5?Xj z1#u}a$;d-D%#o9KULk9)?vS4MuaNCGt&*L0ZIb=QHPo3AdAw_aZ;k1^)Sr;NPz6(isI zx{>|mdGg4?E_wNx>*f33+A7rtgYwW9qVoJ3DS1oU{!jnitIhw5e^*zRd}7&gxuWAq zx$4k;k~)}@S3Yax%?}!Rdfq&lKYzY-hp&+hH@+a|;C_i!V{-c8+8*AM=IrG2@}W6L zrEo<>`X9Vsl6NNL^)Jqm)7w*WgtfYO{ja_1h|||?TVIpvkjTD=PsqW~os`KJUXn+@ zdRDqChveG(j?4PbyeM0rJ1Z+!u9SDUv5X7khthD?$lG78&F^i_*H3!RODGG|*V+3{ zuC1#$apT;w6BpH8C81lYPI^xHV@}+5*`rQeQGdXRww?XhxT5b~Ctm*O8xjemq^qtx z{p?(wiz0s(zj?#gXly_B=COYkcka%KeU*}nOtHT_FtBU9WUrIro>F;mXu{U(u$NG= zI<{+Y$Xf-Nf!7Hrv~!s6~) zwxd>ac`di6mRsfwG%&ntubqd}qBz`Nbu#DM*xOr=jdj;!W4Bq4jXjWhZ0w7z$Hv}5 zdTi{4tjEUw^{yTpw<;TtDjR#s^qe%GDjUBln}8}C`!_dw-kXpro3JXIh$Dil{Dx172n>JN8?W$~MsIr-<%4U`- zo7t*t=BTo{OqI=CRW|cf+00jEvp|*2LRB`GtFl?7%4V@Dn=4e=6ja%CsIuu)Wz(g~ zW{E1BZdEo*RoN_4WwTtB%?edESE{nPN|nvks%)-NWpk}6oA;@*S*glql`5O-RM}jw z%4W4Hn>DIz-ml8$230mUsue1`J^hFqpEB^rOM`*Dw~H@**v1k=22BPpH^k_^QvqfQ)TnGDx1%!vN^8G z<_T3cPpY!{tSXz&sj~S6RW?tlviU_-HYZfsd|s8!7gX8&k}8|0RoVQqDw}6i**vSt z=8LLqo>OJ>yegX)RN4HBDw~t4Y)+}NIjzd(S5?`3NtMl)RoVQSDx0sUviWsYHou|D z<~LQ@yr|0NtEz0ysIvK*Dw~&7+5DC&o0nDD{I)8aS5(>jjw+j1RoVQmDx2R^W%HUU zo8MPu^SUaVKTu`!hANvsRAqBkmCe^x*}SRB=8sg_d_$GZAFHzYrYf61QDyU|s%*Zc z%I42h*}SF7=Fe5xysgUSFI3sQqsr#ns%*Za%H}Us*?d=(&0ndq`JO79zgA`QH>zy@ zR+Y`)sj~TdRW|>i%H|(c+5D3#oA0Z#`Dax&|Dwv~Usc)sK$XqEsj~T@Dw}^-W%DCd zHvgf@=08>0{Ff@5|5j!5KdNm0SCx&ZvN3hWcrj{%;>5m6$z>D$<$-}+qO+%jjNf#F?y?L3?o#o_*{ld1Mxw{8}t_EQhjCeB!;(cMnL z$XI`Ax_a5EY>f4}uzGoP!1hrrPmSwjc6uo4?Cx%#!dZsi(ZS)8ZQNaG?=CpK^j1r~ zcF@A<$qRB5S(;F2q39}L#kV|lkT z>R4B?-&v1yIj3Dmp|-Le9R)kr)l+k|EvM(|oXUZ*!Q#2Ks`Ycp?QseRr`P?Go9%Qw zTpAsB5|!%M-A;XH;ReQb+b))LxAJ?jw^FK3?5dV(BAwmNOm+W{ zkByBu1|#LYwXLje*?3>?aP9Cr?`N-lL2GBj?r(8os9G8y8XI<&w8M^Z&D0nd995_7 zAaDO@zcXCl*zj1@$}capJO4OC51o6}osQ;Cb!69bdKql5#T|q1c4D6t+WBS2zH+L` z1!LD1tbed{iAGM*o^t=h)TQLC(j8O1*oM;sJBh(+`MmktB4=o47so5TedSSSBWib@ z(`{|%3!P3CUg^qk?>=Ye?R4*(8puAJ9;nt?X<~xT&RaHTOQ$E{bm8Pmh`pQJF<9)o bAlK{U98G5@ZJUmEemRZ%O2fmpLdTB*Q!X;{ literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/chest_front.vox b/assets/voxygen/voxel/npc/reddragon/male/chest_front.vox new file mode 100644 index 0000000000000000000000000000000000000000..26f3dc5dc1bbce39f181fb2db9a2544e877bbe19 GIT binary patch literal 4556 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 DY)G-% literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/chest_rear.vox b/assets/voxygen/voxel/npc/reddragon/male/chest_rear.vox new file mode 100644 index 0000000000000000000000000000000000000000..84114c625a81ce45c6e0ef66a8228bb065cfa8c3 GIT binary patch literal 6080 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 OPyP4XfBJmFx_<+=E7ns0 literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/foot_bl.vox b/assets/voxygen/voxel/npc/reddragon/male/foot_bl.vox new file mode 100644 index 0000000000000000000000000000000000000000..fe7d64b1d7c737a7f7e23847c19b1b9c35fca185 GIT binary patch literal 1408 zcmchWZA@EL7{{M;@9m4j7Z|0iFrjuZTA1Ud45%^ zjABqDijgsKY*g4Q88V0raV!{OFBpw;8hh2KL^M6e>orvsCXrDk1|_0uimEU|V&b)o zVrEQAL@|pY)gU6OQE(5zHCc@!BBVF5s$4^&ajbEUA*r0xWGpDA5XCg95=F!`l~E{0 z5{?xk@$)eT;vU33i1)H*6h<&4y~3UmjHa?@6p5LJl*edDa7@x0HLj!aIdE*E%)z~T z+IYV{nwpvrkH_&~lCbZ}Dz;hvz;6}{ve^LSxaLozyQ>Drk2WJd+=cX*AL+^CNKX%< zF&#m!*9zM)JM3>&!8Pjv`3#`&CeYkw(5e-=0Yc$v!qy4Gj_U+-nD9h`kk8(Fl~5nZ zLFegQ1V{66Vfkrv#0fn~!mEpfvunJ!rwAn>2g>4=Xh?Zc9JRnPUWCf|QqjhH&s zj_i9c9b#WsYGbz>wF#KgN{q!!L&{pJ;gb>c9`TE3t963YWQOYMyZC8^TZD5k^8zTuQjHdaWJ5{@9D? z#axVkX~B&(8#Yk-ukSzHLI2D9yWMVl)HsXk+Br0jor5i5!>!K<_g*1fbvog4xv*>V zZtUN;1WJscAX4$eH@2I4t1aFroQBysL6Bo~8%RnLSepQa;pbe9JR*#;4YxAUD z>qze%L{9-{rx%d;JcSRIZer%!b?h1(L+iO&bbYdd-s|h|dcAl+0GS#54t1Sy|Lcd( zcb~tn|C;BY5LHEcAhlHt>KdpB>H4f_M&6;Q9+!vS*R^l^jIJIfuB+T9hg8pNqq^>x TSwsF)Hn>ITpSi!+Jfid`DDyW7 literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/foot_br.vox b/assets/voxygen/voxel/npc/reddragon/male/foot_br.vox new file mode 100644 index 0000000000000000000000000000000000000000..09d30e06b4ae82db9744a0ece7ae8a4868db8a0c GIT binary patch literal 1408 zcmc(eUrbw79LIn6+dib7V;NCqQ zd>8s?X=y<+nZ$!h!oDl3*k=9{znjg-=Y!D3wLliVJ#{#Kv=zyb9%RP?$W9(dc6tcS z*%%6a7FdtjVSlRzu30b0uY#hRKy#Zxs}>Xn38kkATPFxRt`kgA!V@V%F?-8ZLSwK1 z-KPr?9xcZE%TJ>#N$5)xUR@-dTjRBTHk3yks7$)il<}b~ZiZvr2KRgg>Tgw}bbwGf z%DtxuZ7T$NiT6*KKr;aq}!{>*vrqb{^K06}LVo+ zXjpZTO%##9NH!4-L9+}uQb>&-uvy5mWLXF<#>9|iF~+ZcFvf3xpVO%ymKeWzl3)JM z|2gM8&%Ni|8$58>K1oDft$}V9dQ(T#8wmLymxc#h+VqzmJ`xHv3z;R7i&dSPQT1v@ zFp5r%DtgAiv0h=XWJo76#IazAy$dSF(j39nv4a-6{5H%RicQvrZNh} zNy4$BCw@LgN8E$B2k~C^jKTB$G)z7$@wzvWjh{Kk%E$glx78a$E~6p}Vsh$B#B4In;@zkpPy)k7H?S z0QE~zMFtqA)aNc1={d9oJCL-m+E z)rRbQFXNZFFe;NH-w+QBP7C3TuOPcdaVt={@9Dy z#e9r@X~K;)3pP;tukSz9PXEjMdpsU|R6m2NnprfBoP#B0!L82-_g*1fbvog4xv*>V zZtUN;2udYT6f45=)WbWJcVx5K@OJqGs;dTY;^KL1=`Y6Jugb9;vS6Ig>e2IWX&TSf zI?{Uwu~Wd=sd=P6Pve8do0$G~9lHib&~k1Dou90r_xd_~J|7+sKt=|?LtQ7_|N7zc z-RJM?zvlTTM5T2Pq_&8GoOV@&bNZ}kLcyU}E-nwhpVQ#>>6|ty$(+i4a!74_Z8)bp Urq@vTlm#9U{%7v*HIFF$3G7HW%>V!Z literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/foot_fr.vox b/assets/voxygen/voxel/npc/reddragon/male/foot_fr.vox new file mode 100644 index 0000000000000000000000000000000000000000..d2988d546cd9383e9948a8d6e24ee1e41e101455 GIT binary patch literal 1408 zcmc(eUrbw79LIn6+~QSO#?~tW1WhTV-U^Ew0w3q$6Z& z8V##1vWX%#Fp^C~L(nY4jkKi32W%FyELj$Ui!m`|S&Z@32V;Eu`n#R_uooXa$tU06 z_ji8hcg{Wc-r#}5wkaYCbohH&=q;6~-yiZlp&1@*Y17|&_(;g#CTUqBtyri^R_K&0 z$&{5CQ9x&ef#FzY6fG|}&&UiZ>>0txjG}p!JtJ%AIA$bG^;|DY!z5@}(coAJM&g(e zM8l-Tij)^KIuTWLf@7XzPmIK#H1d0JPp%PqnfH~WLY4UpGOuH}$HBdO zI`}T~qot(3Gw z@x4_@57xrhR*wTOdJuZ41Ce9Bh(|-1crSwV!Ue3~x{CCb0pz}X6NQC^*iupqo6UxL zryWf@x8wN+CnnzAip9_D`0bq#LW(JMr63{fJ#E z!uVH4+*~tb0~P=K^Sj+{eB3;X+WI-Pj-7`&X~yl(3HM(mTyr?!bULwX^KR_lw**SY zQ5q}7^7Ny3xL;9VwOa8`RSI>rLpX8i0=5j6;ojF(SPq#n$#?bm{kOMH=6fCKzl+!@ z;N0{Al3%3p;nFS4e7BBWLt|(^KZ~AESI~cB9bT^&4+$UxgFhgz6CQl?=zI_O`}(hW z{s~cI*#k}6rJ=kAs>6AGPHIK*p;$hy3V)E-;P#okdPE|x+B$7$>Un)MuRCVeQ1Y}H OZYlil+&?vsDg6b}LN;Rn literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/head.vox b/assets/voxygen/voxel/npc/reddragon/male/head.vox new file mode 100644 index 0000000000000000000000000000000000000000..0de9789f15d4495178dca869b50b40272cc46005 GIT binary patch literal 3040 zcmc(gTZ~m#8OPUs?{gcV4A6lJBZb01E!T1pibDb0fkLHN>^V}>Y8yKe7%~{rl8J_n zHey8)36zA2Xb767*peA?j3G!G(lj9r!N!mn(lkbW^}!h5{{Ge>`p_32J;^WM`mXC+ z-`;zjolic~d(s%Qb^X9Lgt<{OX2(ElQ#~vEDliEqz%$L(z?p&tzrR{ztaWW0AwdD9 zYbWFP6%GOiT+Oyq6*|(jT{VNR>aGOV5$S8L9l+N-c7MfJ z!vS9l`260;I%1FL0U5G%rX4&4h>)N#?Fc^05*>V|TC#ru$O@EY+oj^ROXY1Bi`yxK zp3p;u9xCin1!U~3*{>4lEzv`27p3Pck$M4qyU4a`Cbn&0P7ZvQ7RkApW5O1Z0SeXy z_5y#AeatrIxD5G;nHL4V65ZrAF#8zLc@_>mG1tV56Z;ey@`{{?KTy|`7m?8tgG`2c zl?;A-9=pr6$Z_OGY>qg`z7`_S!V+ug!PBG5(0AY&I{Nfrspsg)QOjq^9*JC+pEQe!fp;(LOJK2C zY!;hCFUrW=AVCBR0UY=&spHuLyTj&@0W52a-Qu^|M-89jd>V4(J8IbiUy04+HL#Zt z=6TKyROSvY!IsCz03gM*mxmFN%>@#v9UpY!R{Q!mzt$u+1Ka{ZhW${~;6 z;vW9a(D{dNuTC=*iHBp%0UL;GQnHvn}6(<^HhwPUgP0 z*jN;>Yao@R$yW+UlV*an|z#4n%Kun$Q1tR!5?;}J=;K0{8A4KqV zzDY=(_`GKSoZlcHLW5lJ9dcdn*E;_>#CZq}?g9u6^epSlwNbX8dhF5lCfxm>UbSkK zMn*>T$#J8{-@LB-yZ@zsba(68wXMp(w+F_xZOdXk|Lhu#9NePuBLf;g{=CLd?bpij zAx-R`s-EY1)%)#*>N~qyW>b{eQw0ZADwGL0#4=#U38%K<`pD_B`MWa`4lDmDnW)9BQoRI}uG1jjc!`+&Fbh;Lt zpQR=5&(pMBMsp5R`=rs@t48L_?0=|~IngC^sar?pP11$MQ}odzGo;O*)d^#C8U6@= zffFwqUHqxhwF^ccyo=s%bZ(PT`zfP4-!N*Szr54v*bCSX8g1w^+P%u?;6|f2uy0>J zU4xru>(KW3I{D&KjXb?lCtup2Yv2Eh{&s#)3-6z*wM%Dd%NOSB#hoj)XS31hvqopX zWpwq&Mk{7c*T8}~+O^^#4R2hnoeQRFaQO@!eQd7Ab}!PVwM+Em7gwwGrS;nL+%_E= zYU$Yb_Gs+FYr6H`n;JW_OV@t&P1R~O-8*@bdV71dq;IxXJoJD*zqC)szI&f8{(QD> zf3QGzK3u3X>^XMc=*I7i{`?1{Lxc16#^^F#e|v-e{-+%petn{j{<>T5-t5sG&HBHe zf7!BS`pL?(TD0Vx)*N|NJ)=E({})Cdebwl#`SaD+*QbZ?c|=baA-Mf35KK#vGU2gU0IJ5fn{MW5H-l^5xaYMr|Nw1u` zpwVBB=|`8|)9K&e(!=|YXx*!4wdH45wd0*z>hJH@Cq^i zzCtaW{;0BCXZLsH)_H>+`8m5rlb#;#tmh8?up@UqaJnN`yOEB}dHI*+>aQQ}$Oli~ T)Z__0T4o3T>-$g4r=GH&!j5Vh0%!ZVU zlpa;0pp+vGO6kPEp4ggL?-VUA61liNm5Tmfw}k5I;1gxhfHxY^6C0#-ErXlh5Z zU$pV5PhZp5^fhagsWUZozrP=Ga^(SLBM^BDZ2`W0@CA9%JS-an7K57TQ?OLN4S& zt}JR;thdbGs7%woMoEz9V}FeirjoJ*UT zVyPKpW}_C@v{`d}=9627yG<_R#_~=y@5bidY_kvU$ELQ;9=4g4XRdk9n&)mioNG`w4sVkrHN~ zc3}UW-SuKS&sVCdst^u`@nB4__sS}^CjE)ulajEq(hBok^Dm;Ur5HyK*C5>Ag2iD! z7RQcaak3Yci>DCpOF`O^EM%Q6gm=0c(&U2l#6o5^K~_@`-zrEwDcCY9*nVB$?h!mb zBuJ#6a#c{?8i(eS@dyqk;@zdE&=?l9j|*Oz7o1sRZMz2GQEjPZU!gICa9CD>=%xWssSxd)-9Yz(yL zW8!!z!UrlbaiRe$@4SRxXG195nu6NWOtd_gkK>({=xG)V9TrT#Ay|H2P?6z*zaR%) z6+6(^SdGqt6okstF|sEYk?tZi)s`Ued^LhE)T8G}8wO4VG5U57B6H`le)9?KJ$n9iHDiv}p^iJ~I{}=ToWszk5xlo>6I0)=V`uL$>dsB0<)dYETwjOJ z=feX5#7*E2=yk#UuOH5LpYQ9x*7+Br(6bxH)~Q~{w&sN#`;4kV!ht@A=Y}piwsYH* jW2>#OV@;j;jIDlk(6QU6){yvQ8p>4YpS8bp94CoP!)VY9Mc(gTVg#hNzxNCEnS|Nld;B>o!O9b zkx@hpWYdTmqvj-Kz-oOU=9qJHj*)9^jXBp^U;EHn-+tZCs$Zr+I3y`+yCV} zr^7tr9~Y69x?ro4bViA^2SbgUEu+h+*s9R5961^a<{K(>H7N{_%QUt)O=Gjd<1`&n z4%6Xun1<6ZjVMK|YPWK9U~SVrx&^YmK$v zChbueoAkUkTlY|}XEH>!SgbkK4%H6ThPX_96@~WNUi7X`^U(f%b>gz0O)4rXh(sbh z8Wj#)TV-eBpZuPf$jV9!*18c~q_w$_6UVBE^fj|M6l8Jq1d9_rlrNqot~MF(aX*` zL}(imUY!%puW4_akF;tboRJVy)4K}x_`eL z8QY4?Co+^B&un255B8=)(=&{Tu%!4w@rz>YoG|yXure#$y`{cZm~IrlJ|t|sE`-#d z>kvjxYP?UV4+vcq!aAhu=It-$VVr{wuHlLh^k3u(-zPvAHEX zZ1b~574e6AZJiZ<-{y{8lQvg6A~sun*0Q+rwE>&+C)Y@L%1en6{wMc$%@Ztt0gbF4 Ak^lez literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/wing_in_l.vox b/assets/voxygen/voxel/npc/reddragon/male/wing_in_l.vox new file mode 100644 index 0000000000000000000000000000000000000000..4248691c504188886c549aeeb41f1a43f1127a17 GIT binary patch literal 57352 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 M;Kq0=#T_F51y29oPyhe` literal 0 HcmV?d00001 diff --git a/assets/voxygen/voxel/npc/reddragon/male/wing_in_r.vox b/assets/voxygen/voxel/npc/reddragon/male/wing_in_r.vox new file mode 100644 index 0000000000000000000000000000000000000000..10a75b0e8faa0744eab0d325bcc066bad64c4b88 GIT binary patch literal 57352 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 bAlK{U98G5@ZJUmEemRZ%O2fmpLdTB*Q!X;{ literal 0 HcmV?d00001 diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index 4545478126..a69cc9b961 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -60,6 +60,7 @@ pub struct AllBodies { pub biped_large: BodyData>, pub golem: BodyData>, pub critter: BodyData>, + pub dragon: BodyData>, } /// Can only retrieve body metadata by direct index. @@ -76,6 +77,7 @@ impl core::ops::Index for AllBodies &self.biped_large.body, NpcKind::StoneGolem => &self.golem.body, NpcKind::Rat => &self.critter.body, + NpcKind::Reddragon => &self.dragon.body, } } } diff --git a/common/src/comp/body/dragon.rs b/common/src/comp/body/dragon.rs index 94c23ce9b9..8591ba74e1 100644 --- a/common/src/comp/body/dragon.rs +++ b/common/src/comp/body/dragon.rs @@ -2,128 +2,69 @@ use rand::{seq::SliceRandom, thread_rng}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Body { - pub head: Head, - pub chest_front: ChestFront, - pub chest_rear: ChestRear, - pub tail_front: TailFront, - pub tail_rear: TailRear, - pub wing_in_l: WingInL, - pub wing_in_r: WingInR, - pub wing_out_l: WingOutL, - pub wing_out_r: WingOutR, - pub foot_fl: FootFL, - pub foot_fr: FootFR, - pub foot_bl: FootBL, - pub foot_br: FootBR, + pub species: Species, + pub body_type: BodyType, } + impl Body { pub fn random() -> Self { let mut rng = thread_rng(); - Self { - head: *(&ALL_HEADS).choose(&mut rng).unwrap(), - chest_front: *(&ALL_CHEST_FRONTS).choose(&mut rng).unwrap(), - chest_rear: *(&ALL_CHEST_REARS).choose(&mut rng).unwrap(), - tail_front: *(&ALL_TAIL_FRONTS).choose(&mut rng).unwrap(), - tail_rear: *(&ALL_TAIL_REARS).choose(&mut rng).unwrap(), - wing_in_l: *(&ALL_WING_IN_LS).choose(&mut rng).unwrap(), - wing_in_r: *(&ALL_WING_IN_RS).choose(&mut rng).unwrap(), - wing_out_l: *(&ALL_WING_OUT_LS).choose(&mut rng).unwrap(), - wing_out_r: *(&ALL_WING_OUT_RS).choose(&mut rng).unwrap(), - foot_fl: *(&ALL_FOOT_FLS).choose(&mut rng).unwrap(), - foot_fr: *(&ALL_FOOT_FRS).choose(&mut rng).unwrap(), - foot_bl: *(&ALL_FOOT_BLS).choose(&mut rng).unwrap(), - foot_br: *(&ALL_FOOT_BRS).choose(&mut rng).unwrap(), + let species = *(&ALL_SPECIES).choose(&mut rng).unwrap(); + Self::random_with(&mut rng, &species) + } + + #[inline] + pub fn random_with(rng: &mut impl rand::Rng, &species: &Species) -> Self { + let body_type = *(&ALL_BODY_TYPES).choose(rng).unwrap(); + Self { species, body_type } + } +} + +impl From for super::Body { + fn from(body: Body) -> Self { super::Body::Dragon(body) } +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[repr(u32)] +pub enum Species { + Reddragon = 0, +} + +/// Data representing per-species generic data. +/// +/// NOTE: Deliberately don't (yet?) implement serialize. +#[derive(Clone, Debug, Deserialize)] +pub struct AllSpecies { + pub reddragon: SpeciesMeta, +} + +impl<'a, SpeciesMeta> core::ops::Index<&'a Species> for AllSpecies { + type Output = SpeciesMeta; + + #[inline] + fn index(&self, &index: &'a Species) -> &Self::Output { + match index { + Species::Reddragon => &self.reddragon, } } } -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum Head { - Default, +pub const ALL_SPECIES: [Species; 1] = [ + Species::Reddragon, +]; + +impl<'a, SpeciesMeta: 'a> IntoIterator for &'a AllSpecies { + type Item = Species; + + type IntoIter = impl Iterator; + + fn into_iter(self) -> Self::IntoIter { ALL_SPECIES.iter().copied() } } -const ALL_HEADS: [Head; 1] = [Head::Default]; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[repr(u32)] -pub enum ChestFront { - Default, +pub enum BodyType { + Female = 0, + Male = 1, } -const ALL_CHEST_FRONTS: [ChestFront; 1] = [ChestFront::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum ChestRear { - Default, -} -const ALL_CHEST_REARS: [ChestRear; 1] = [ChestRear::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum TailFront { - Default, -} -const ALL_TAIL_FRONTS: [TailFront; 1] = [TailFront::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum TailRear { - Default, -} -const ALL_TAIL_REARS: [TailRear; 1] = [TailRear::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingInL { - Default, -} -const ALL_WING_IN_LS: [WingInL; 1] = [WingInL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingInR { - Default, -} -const ALL_WING_IN_RS: [WingInR; 1] = [WingInR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingOutL { - Default, -} -const ALL_WING_OUT_LS: [WingOutL; 1] = [WingOutL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum WingOutR { - Default, -} -const ALL_WING_OUT_RS: [WingOutR; 1] = [WingOutR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootFL { - Default, -} -const ALL_FOOT_FLS: [FootFL; 1] = [FootFL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootFR { - Default, -} -const ALL_FOOT_FRS: [FootFR; 1] = [FootFR::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootBL { - Default, -} -const ALL_FOOT_BLS: [FootBL; 1] = [FootBL::Default]; - -#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[repr(u32)] -pub enum FootBR { - Default, -} -const ALL_FOOT_BRS: [FootBR; 1] = [FootBR::Default]; +pub const ALL_BODY_TYPES: [BodyType; 2] = [BodyType::Female, BodyType::Male]; diff --git a/common/src/generation.rs b/common/src/generation.rs index 22cf420021..15850ebb64 100644 --- a/common/src/generation.rs +++ b/common/src/generation.rs @@ -79,6 +79,9 @@ impl EntityInfo { Body::QuadrupedSmall(body) => { Some(get_npc_name(&NPC_NAMES.quadruped_small, body.species)) }, + Body::Dragon(body) => { + Some(get_npc_name(&NPC_NAMES.dragon, body.species)) + }, _ => None, } .map(|s| { diff --git a/common/src/npc.rs b/common/src/npc.rs index fc08070dea..97d42e9b43 100644 --- a/common/src/npc.rs +++ b/common/src/npc.rs @@ -15,9 +15,10 @@ pub enum NpcKind { Ogre, Rat, StoneGolem, + Reddragon, } -pub const ALL_NPCS: [NpcKind; 7] = [ +pub const ALL_NPCS: [NpcKind; 8] = [ NpcKind::Humanoid, NpcKind::Wolf, NpcKind::Pig, @@ -25,6 +26,7 @@ pub const ALL_NPCS: [NpcKind; 7] = [ NpcKind::Ogre, NpcKind::Rat, NpcKind::StoneGolem, + NpcKind::Reddragon, ]; /// Body-specific NPC name metadata. @@ -91,6 +93,7 @@ pub fn kind_to_body(kind: NpcKind) -> Body { NpcKind::Ogre => comp::biped_large::Body::random().into(), NpcKind::Rat => comp::critter::Body::random().into(), NpcKind::StoneGolem => comp::golem::Body::random().into(), + NpcKind::Reddragon => comp::critter::Body::random().into(), } } @@ -212,6 +215,14 @@ impl NpcBody { comp::golem::Body::random_with, ) }) + .or_else(|| { + parse( + s, + NpcKind::Reddragon, + &npc_names.dragon, + comp::dragon::Body::random_with, + ) + }) .ok_or(()) } } diff --git a/voxygen/src/anim/dragon/mod.rs b/voxygen/src/anim/dragon/mod.rs index 67cf9c5317..b997fab2f7 100644 --- a/voxygen/src/anim/dragon/mod.rs +++ b/voxygen/src/anim/dragon/mod.rs @@ -10,7 +10,7 @@ use crate::render::FigureBoneData; use common::comp::{self}; use vek::Vec3; -#[derive(Clone)] +#[derive(Clone, Default)] pub struct DragonSkeleton { head: Bone, chest_front: Bone, @@ -28,23 +28,7 @@ pub struct DragonSkeleton { } impl DragonSkeleton { - pub fn new() -> Self { - Self { - head: Bone::default(), - chest_front: Bone::default(), - chest_rear: Bone::default(), - tail_front: Bone::default(), - tail_rear: Bone::default(), - wing_in_l: Bone::default(), - wing_in_r: Bone::default(), - wing_out_l: Bone::default(), - wing_out_r: Bone::default(), - foot_fl: Bone::default(), - foot_fr: Bone::default(), - foot_bl: Bone::default(), - foot_br: Bone::default(), - } - } + pub fn new() -> Self { Self::default() } } impl Skeleton for DragonSkeleton { @@ -98,7 +82,17 @@ impl Skeleton for DragonSkeleton { } } -pub struct SkeletonAttr; +pub struct SkeletonAttr { + head: (f32, f32), + chest_front: (f32, f32), + chest_rear: (f32, f32), + tail_front: (f32, f32), + tail_rear: (f32, f32), + wing_in: (f32, f32), + wing_out: (f32, f32), + feet_f: (f32, f32, f32), + feet_b: (f32, f32, f32), +} impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { type Error = (); @@ -112,9 +106,52 @@ impl<'a> std::convert::TryFrom<&'a comp::Body> for SkeletonAttr { } impl Default for SkeletonAttr { - fn default() -> Self { Self } + fn default() -> Self { + Self { + head: (0.0, 0.0), + chest_front: (0.0, 0.0), + chest_rear: (0.0, 0.0), + tail_front: (0.0, 0.0), + tail_rear: (0.0, 0.0), + wing_in: (0.0, 0.0), + wing_out: (0.0, 0.0), + feet_f: (0.0, 0.0, 0.0), + feet_b: (0.0, 0.0, 0.0), + } + } } impl<'a> From<&'a comp::dragon::Body> for SkeletonAttr { - fn from(_body: &'a comp::dragon::Body) -> Self { Self } -} + fn from(body: &'a comp::dragon::Body) -> Self { + use comp::dragon::Species::*; + Self { + head: match (body.species, body.body_type) { + (Reddragon, _) => (4.0, 3.0), + }, + chest_front: match (body.species, body.body_type) { + (Reddragon, _) => (0.0, 5.0), + }, + chest_rear: match (body.species, body.body_type) { + (Reddragon, _) => (0.0, 5.0), + }, + tail_front: match (body.species, body.body_type) { + (Reddragon, _) => (-3.0, 1.5), + }, + tail_rear: match (body.species, body.body_type) { + (Reddragon, _) => (-3.0, 1.5), + }, + wing_in: match (body.species, body.body_type) { + (Reddragon, _) => (2.75, 0.0), + }, + wing_out: match (body.species, body.body_type) { + (Reddragon, _) => (2.75, 0.0), + }, + feet_f: match (body.species, body.body_type) { + (Reddragon, _) => (2.0, -1.5, 4.0), + }, + feet_b: match (body.species, body.body_type) { + (Reddragon, _) => (2.0, -1.5, 4.0), + }, + } + } +} \ No newline at end of file diff --git a/voxygen/src/scene/figure/cache.rs b/voxygen/src/scene/figure/cache.rs index d06f72cd1e..4ca5547771 100644 --- a/voxygen/src/scene/figure/cache.rs +++ b/voxygen/src/scene/figure/cache.rs @@ -410,24 +410,83 @@ impl FigureModelCache { None, None, ], - Body::Dragon(body) => [ - Some(mesh_dragon_head(body.head, generate_mesh)), - Some(mesh_dragon_chest_front(body.chest_front, generate_mesh)), - Some(mesh_dragon_chest_rear(body.chest_rear, generate_mesh)), - Some(mesh_dragon_tail_front(body.tail_front, generate_mesh)), - Some(mesh_dragon_tail_rear(body.tail_rear, generate_mesh)), - Some(mesh_dragon_wing_in_l(body.wing_in_l, generate_mesh)), - Some(mesh_dragon_wing_in_r(body.wing_in_r, generate_mesh)), - Some(mesh_dragon_wing_out_l(body.wing_out_l, generate_mesh)), - Some(mesh_dragon_wing_out_r(body.wing_out_r, generate_mesh)), - Some(mesh_dragon_foot_fl(body.foot_fl, generate_mesh)), - Some(mesh_dragon_foot_fr(body.foot_fr, generate_mesh)), - Some(mesh_dragon_foot_bl(body.foot_bl, generate_mesh)), - Some(mesh_dragon_foot_br(body.foot_br, generate_mesh)), - None, - None, - None, - ], + Body::Dragon(body) => { + let dragon_center_spec = + DragonCenterSpec::load_watched(manifest_indicator); + let dragon_lateral_spec = + DragonLateralSpec::load_watched(manifest_indicator); + + [ + Some(dragon_center_spec.mesh_head( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_center_spec.mesh_chest_front( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_center_spec.mesh_chest_rear( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_center_spec.mesh_tail_front( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_center_spec.mesh_tail_rear( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_wing_in_l( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_wing_in_r( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_wing_out_l( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_wing_out_r( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_foot_fl( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_foot_fr( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_foot_bl( + body.species, + body.body_type, + generate_mesh, + )), + Some(dragon_lateral_spec.mesh_foot_br( + body.species, + body.body_type, + generate_mesh, + )), + None, + None, + None, + ] + }, Body::BirdSmall(body) => [ Some(mesh_bird_small_head(body.head, generate_mesh)), Some(mesh_bird_small_torso(body.torso, generate_mesh)), diff --git a/voxygen/src/scene/figure/load.rs b/voxygen/src/scene/figure/load.rs index 3b1debba8f..1bfd77b30f 100644 --- a/voxygen/src/scene/figure/load.rs +++ b/voxygen/src/scene/figure/load.rs @@ -6,7 +6,8 @@ use common::{ bird_medium::{BodyType as BMBodyType, Species as BMSpecies}, bird_small, critter::{BodyType as CBodyType, Species as CSpecies}, - dragon, fish_medium, fish_small, + dragon::{BodyType as DBodyType, Species as DSpecies}, + fish_medium, fish_small, golem::{BodyType as GBodyType, Species as GSpecies}, humanoid::{Body, BodyType, EyeColor, Race, Skin}, item::{ @@ -1865,173 +1866,345 @@ pub fn mesh_fish_medium_fin_r( ) } -pub fn mesh_dragon_head( - head: dragon::Head, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match head { - dragon::Head::Default => "npc.dragon.head", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) +//// + +#[derive(Serialize, Deserialize)] +pub struct DragonCenterSpec(HashMap<(DSpecies, DBodyType), SidedDCenterVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedDCenterVoxSpec { + head: DragonCenterSubSpec, + chest_front: DragonCenterSubSpec, + chest_rear: DragonCenterSubSpec, + tail_front: DragonCenterSubSpec, + tail_rear: DragonCenterSubSpec, +} +#[derive(Serialize, Deserialize)] +struct DragonCenterSubSpec { + offset: [f32; 3], // Should be relative to initial origin + center: VoxSimple, } -pub fn mesh_dragon_chest_front( - chest_front: dragon::ChestFront, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match chest_front { - dragon::ChestFront::Default => "npc.dragon.chest_front", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) +#[derive(Serialize, Deserialize)] +pub struct DragonLateralSpec(HashMap<(DSpecies, DBodyType), SidedDLateralVoxSpec>); + +#[derive(Serialize, Deserialize)] +struct SidedDLateralVoxSpec { + wing_in_l: DragonLateralSubSpec, + wing_in_r: DragonLateralSubSpec, + wing_out_l: DragonLateralSubSpec, + wing_out_r: DragonLateralSubSpec, + foot_fl: DragonLateralSubSpec, + foot_fr: DragonLateralSubSpec, + foot_bl: DragonLateralSubSpec, + foot_br: DragonLateralSubSpec, +} +#[derive(Serialize, Deserialize)] +struct DragonLateralSubSpec { + offset: [f32; 3], // Should be relative to initial origin + lateral: VoxSimple, } -pub fn mesh_dragon_chest_rear( - chest_rear: dragon::ChestRear, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match chest_rear { - dragon::ChestRear::Default => "npc.dragon.chest_rear", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) +impl Asset for DragonCenterSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + + fn parse(buf_reader: BufReader) -> Result { + ron::de::from_reader(buf_reader).map_err(assets::Error::parse_error) + } } -pub fn mesh_dragon_tail_front( - tail_front: dragon::TailFront, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match tail_front { - dragon::TailFront::Default => "npc.dragon.tail_front", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) +impl Asset for DragonLateralSpec { + const ENDINGS: &'static [&'static str] = &["ron"]; + + fn parse(buf_reader: BufReader) -> Result { + ron::de::from_reader(buf_reader).map_err(assets::Error::parse_error) + } } -pub fn mesh_dragon_tail_rear( - tail_rear: dragon::TailRear, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match tail_rear { - dragon::TailRear::Default => "npc.dragon.tail_rear", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} +impl DragonCenterSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.dragon_center_manifest", indicator) + .unwrap() + } -pub fn mesh_dragon_wing_in_l( - wing_in_l: dragon::WingInL, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match wing_in_l { - dragon::WingInL::Default => "npc.dragon.wing_in_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + pub fn mesh_head( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No head specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let center = graceful_load_segment(&spec.head.center.0); -pub fn mesh_dragon_wing_in_r( - wing_in_r: dragon::WingInR, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match wing_in_r { - dragon::WingInR::Default => "npc.dragon.wing_in_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + generate_mesh(¢er, Vec3::from(spec.head.offset)) + } -pub fn mesh_dragon_wing_out_l( - wing_out_l: dragon::WingOutL, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match wing_out_l { - dragon::WingOutL::Default => "npc.dragon.wing_out_l", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + pub fn mesh_chest_front( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No chest front specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let center = graceful_load_segment(&spec.chest_front.center.0); -pub fn mesh_dragon_wing_out_r( - wing_out_r: dragon::WingOutR, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match wing_out_r { - dragon::WingOutR::Default => "npc.dragon.wing_out_r", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + generate_mesh(¢er, Vec3::from(spec.chest_front.offset)) + } + + pub fn mesh_chest_rear( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No chest rear specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let center = graceful_load_segment(&spec.chest_rear.center.0); -pub fn mesh_dragon_foot_fl( - foot_fl: dragon::FootFL, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match foot_fl { - dragon::FootFL::Default => "npc.dragon.foot_fl", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + generate_mesh(¢er, Vec3::from(spec.chest_rear.offset)) + } -pub fn mesh_dragon_foot_fr( - foot_fr: dragon::FootFR, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match foot_fr { - dragon::FootFR::Default => "npc.dragon.foot_fr", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + pub fn mesh_tail_front( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No tail front specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let center = graceful_load_segment(&spec.tail_front.center.0); -pub fn mesh_dragon_foot_bl( - foot_bl: dragon::FootBL, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match foot_bl { - dragon::FootBL::Default => "npc.dragon.foot_bl", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) -} + generate_mesh(¢er, Vec3::from(spec.tail_front.offset)) + } -pub fn mesh_dragon_foot_br( - foot_br: dragon::FootBR, - generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, -) -> Mesh { - load_mesh( - match foot_br { - dragon::FootBR::Default => "npc.dragon.foot_br", - }, - Vec3::new(-7.0, -6.0, -6.0), - generate_mesh, - ) + pub fn mesh_tail_rear( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No tail rear specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let center = graceful_load_segment(&spec.tail_rear.center.0); + + generate_mesh(¢er, Vec3::from(spec.tail_rear.offset)) + } +} +impl DragonLateralSpec { + pub fn load_watched(indicator: &mut ReloadIndicator) -> Arc { + assets::load_watched::("voxygen.voxel.dragon_lateral_manifest", indicator) + .unwrap() + } + + pub fn mesh_wing_in_l( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.wing_in_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_in_l.offset)) + } + + pub fn mesh_wing_in_r( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.wing_in_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_in_r.offset)) + } + + pub fn mesh_wing_out_l( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.wing_out_l.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_out_l.offset)) + } + + pub fn mesh_wing_out_r( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No wing specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.wing_out_r.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.wing_out_r.offset)) + } + + pub fn mesh_foot_fl( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.foot_fl.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_fl.offset)) + } + + pub fn mesh_foot_fr( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.foot_fr.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_fr.offset)) + } + + pub fn mesh_foot_bl( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.foot_bl.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_bl.offset)) + } + + pub fn mesh_foot_br( + &self, + species: DSpecies, + body_type: DBodyType, + generate_mesh: impl FnOnce(&Segment, Vec3) -> Mesh, + ) -> Mesh { + let spec = match self.0.get(&(species, body_type)) { + Some(spec) => spec, + None => { + error!( + "No foot specification exists for the combination of {:?} and {:?}", + species, body_type + ); + return load_mesh("not_found", Vec3::new(-5.0, -5.0, -2.5), generate_mesh); + }, + }; + let lateral = graceful_load_segment(&spec.foot_br.lateral.0); + + generate_mesh(&lateral, Vec3::from(spec.foot_br.offset)) + } } //// diff --git a/world/src/lib.rs b/world/src/lib.rs index 6f47c7a311..41b8a54b36 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -21,7 +21,7 @@ use crate::{ util::{Grid, Sampler}, }; use common::{ - comp::{self, bird_medium, critter, quadruped_medium, quadruped_small}, + comp::{self, bird_medium, critter, quadruped_medium, quadruped_small, dragon}, generation::{ChunkSupplement, EntityInfo}, terrain::{Block, BlockKind, TerrainChunk, TerrainChunkMeta, TerrainChunkSize}, vol::{ReadVol, RectVolSize, Vox, WriteVol},