summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--data/joints.tsv42
-rw-r--r--src/GameDraw.cpp14
-rw-r--r--src/GameTick.cpp123
-rw-r--r--src/Person.cpp98
-rw-r--r--src/Skeleton.cpp27
-rw-r--r--src/Skeleton.h1
-rw-r--r--src/misc.h1
-rw-r--r--src/misc.zig2
8 files changed, 138 insertions, 170 deletions
diff --git a/data/joints.tsv b/data/joints.tsv
index 6b3f60d..b2ba6a2 100644
--- a/data/joints.tsv
+++ b/data/joints.tsv
@@ -1,21 +1,21 @@
-label	x	y	z	length	model	visible	lower	parent
-0	0.2390	0.2002	-2.2577	1.4112	0	true	false	1
-1	0.4964	0.2002	-0.8546	0.9459	1	false	false	6
-2	1.2820	0.2002	-0.5709	0.0000	0	false	false	-1
-3	1.0220	0.2002	0.6092	1.2048	3	true	false	2
-4	0.1480	0.2002	0.9330	0.9321	4	true	false	3
-5	-0.1378	0.2002	1.0711	0.3174	5	true	false	4
-6	-0.4220	0.2002	-1.1863	1.8730	0	false	false	2
-7	-1.5911	0.2002	-1.3499	1.1803	3	true	false	6
-8	-2.5230	0.2002	-1.3332	0.9321	4	true	false	7
-9	-2.8692	0.2002	-1.2356	0.3597	5	true	false	8
-10	0.0644	0.2002	0.1555	1.4178	2	false	true	2
-11	0.3856	0.2002	1.4386	1.3227	6	false	true	10
-12	-0.8438	0.2002	0.9086	1.1798	6	false	true	10
-13	-0.2474	0.2002	1.1657	0.5090	6	false	true	12
-14	-0.5556	0.2002	2.9636	1.5648	6	true	true	-1
-15	-1.0848	0.2002	4.4175	1.5473	7	true	true	14
-16	-1.2397	0.2002	4.5773	0.2226	8	true	true	15
-17	-2.5112	0.2002	0.5712	1.4597	7	true	true	18
-18	-3.8366	0.2002	1.1826	0.6836	8	true	true	-1
-19	-4.0869	0.2002	1.1576	0.2515	8	true	true	18
+x	y	z	length	model	visible	lower	parent
+0.2390	0.2002	-2.2577	1.4112	0	true	false	1
+0.4964	0.2002	-0.8546	0.9459	1	false	false	6
+1.2820	0.2002	-0.5709	0.0000	0	false	false	-1
+1.0220	0.2002	0.6092	1.2048	3	true	false	2
+0.1480	0.2002	0.9330	0.9321	4	true	false	3
+-0.1378	0.2002	1.0711	0.3174	5	true	false	4
+-0.4220	0.2002	-1.1863	1.8730	0	false	false	2
+-1.5911	0.2002	-1.3499	1.1803	3	true	false	6
+-2.5230	0.2002	-1.3332	0.9321	4	true	false	7
+-2.8692	0.2002	-1.2356	0.3597	5	true	false	8
+0.0644	0.2002	0.1555	1.4178	2	false	true	2
+0.3856	0.2002	1.4386	1.3227	6	false	true	10
+-0.8438	0.2002	0.9086	1.1798	6	false	true	10
+-0.2474	0.2002	1.1657	0.5090	6	false	true	12
+-0.5556	0.2002	2.9636	1.5648	6	true	true	-1
+-1.0848	0.2002	4.4175	1.5473	7	true	true	14
+-1.2397	0.2002	4.5773	0.2226	8	true	true	15
+-2.5112	0.2002	0.5712	1.4597	7	true	true	18
+-3.8366	0.2002	1.1826	0.6836	8	true	true	-1
+-4.0869	0.2002	1.1576	0.2515	8	true	true	18
diff --git a/src/GameDraw.cpp b/src/GameDraw.cpp
index 5403d3f..c5f6ec5 100644
--- a/src/GameDraw.cpp
+++ b/src/GameDraw.cpp
@@ -614,13 +614,9 @@ void Game::DrawGLScene(void)
 		}
 
 		if(thirdperson==0&&person[0].skeleton.free==1){
-
-			glRotatef(person[0].skeleton.joints[(person[0].skeleton.jointlabels[head])].rotate3,0,1,0);
-
-			glRotatef(180-(person[0].skeleton.joints[(person[0].skeleton.jointlabels[head])].rotate2+90),0,0,1);
-
-			glRotatef(person[0].skeleton.joints[(person[0].skeleton.jointlabels[head])].rotate1+90,0,1,0);
-
+			glRotatef(person[0].skeleton.joints[head].rotate3,0,1,0);
+			glRotatef(180-(person[0].skeleton.joints[head].rotate2+90),0,0,1);
+			glRotatef(person[0].skeleton.joints[head].rotate1+90,0,1,0);
 		}
 
 		if(thirdperson==2){
@@ -1081,13 +1077,13 @@ void Game::DrawGLScene(void)
 
 			if(person[i].killtarget>-1&&person[i].killtargetvisible&&person[i].skeleton.free==0&&person[person[i].killtarget].skeleton.free==0){
 
-				sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[lefthand]].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[abdomen]].position+person[person[i].killtarget].playercoords, person[i].shotdelay*2);
+				sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, DoRotation(person[i].skeleton.joints[lefthand].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[abdomen].position+person[person[i].killtarget].playercoords, person[i].shotdelay*2);
 
 			}
 
 			if(person[i].killtarget>-1&&person[i].killtargetvisible&&person[i].skeleton.free==0&&person[person[i].killtarget].skeleton.free!=0){
 
-				sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[lefthand]].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[abdomen]].position, person[i].shotdelay*2);
+				sprites.MakeSprite(bulletinstant, (shotdelayamount/difficulty-person[i].shotdelay)/shotdelayamount/difficulty/2, 1, person[i].shotdelay/shotdelayamount/difficulty, person[i].shotdelay/shotdelayamount/difficulty, DoRotation(person[i].skeleton.joints[lefthand].position,0,person[i].playerrotation,0)+person[i].playercoords, person[person[i].killtarget].skeleton.joints[abdomen].position, person[i].shotdelay*2);
 
 			}
 
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index f3ce015..4182c71 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -60,9 +60,9 @@ void Game::Splat(int k)
 	person[k].DoAnimations(k);
 
 	auto& joints = skeleton.joints;
-	auto& head_joint = joints[skeleton.jointlabels[head]];
+	auto& head_joint = joints[head];
 	person[k].bjoint1 = &head_joint;
-	person[k].bjoint2 = joints + skeleton.jointlabels[neck];
+	person[k].bjoint2 = joints + neck;
 
 	for (auto& joint : joints) {
 		joint.position = DoRotation(joint.position + joint.offset, 0,
@@ -269,7 +269,7 @@ void click(Game* game, int button, int action, int mods)
 	if (weapon == grenade && player.ammo > 0
 	    && player.reloading <= 0 && player.attackframe < 0) {
 		auto& skeleton = player.skeleton;
-		auto& hand = skeleton.joints[skeleton.jointlabels[righthand]];
+		auto& hand = skeleton.joints[righthand];
 		auto soundsrc = DoRotation(hand.position, 0, player.playerrotation, 0)
 			+ player.playercoords - camera.position;
 		if (player.grenphase) {
@@ -356,9 +356,7 @@ void Game::setListener(XYZ& facing)
 XYZ Game::aimPlayer()
 {
 	auto& joints = person[0].skeleton.joints;
-	auto& jointlabels = person[0].skeleton.jointlabels;
-	auto point = joints[jointlabels[lefthand]].position
-		- joints[jointlabels[righthand]].position;
+	auto point = joints[lefthand].position - joints[righthand].position;
 	float aimrot = 0.0f, aimrot2 = 0.0f;
 
 	switch (person[0].whichgun) {
@@ -376,9 +374,9 @@ XYZ Game::aimPlayer()
 		case handgun2:
 			aimrot = -0.9f;
 			auto k = thirdperson ? 0.35 : 0.65;
-			point = joints[jointlabels[righthand]].position
-				- joints[jointlabels[head]].position * k
-				- joints[jointlabels[neck]].position * (1 - k);
+			point = joints[righthand].position
+				- joints[head].position * k
+				- joints[neck].position * (1 - k);
 		break;
 	}
 
@@ -407,15 +405,14 @@ XYZ Game::aimBot(int j)
 
 	auto& target = person[person[j].killtarget];
 	auto& joints = target.skeleton.joints;
-	auto& jointlabels = target.skeleton.jointlabels;
-	XYZ aim = joints[jointlabels[abdomen]].position;
+	XYZ aim = joints[abdomen].position;
 	if (target.skeleton.free)
 		inaccuracy *= 3;
 	else
 		aim = DoRotation(aim, 0, target.playerrotation, 0)
 			+ target.playercoords;
 
-	auto& lefthandpos = joints[jointlabels[lefthand]].position;
+	auto& lefthandpos = joints[lefthand].position;
 	aim -= person[j].playercoords
 		+ DoRotation(lefthandpos, 0, person[j].playerrotation, 0);
 	return DoRotation(
@@ -974,9 +971,9 @@ void Game::Tick()
 	for(int i=0;i<numpeople;i++){
 		if(person[i].health<0&&person[i].longdead<0&&person[i].firstlongdead==0){
 			if(person[i].type!=zombietype){
-				overpoint=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
+				overpoint=person[i].skeleton.joints[abdomen].position;
 				overpoint.y+=3000;
-				underpoint=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
+				underpoint=person[i].skeleton.joints[abdomen].position;
 				underpoint.y-=3000;
 
 				move=0;
@@ -994,7 +991,7 @@ void Game::Tick()
 					decals.MakeDecal(bloodpool,temp,12,normish, whichtri, &sidewalkcollide, move, cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
 				}
 				if(whichtri==-1){
-					temp=person[i].skeleton.joints[person[i].skeleton.jointlabels[abdomen]].position;
+					temp=person[i].skeleton.joints[abdomen].position;
 					temp.y=-.5;
 					move=0;
 					decals.MakeDecal(bloodpool,temp,12,normish, 0, &sidewalkcollide, move, 0);
@@ -1103,20 +1100,20 @@ void Game::Tick()
 			if(i > 0
 			   && person[i].targetanimation == zombieeatanim
 			   && person[person[i].killtarget].eaten == i) {
-				person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].locked=1;
-				person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].locked=1;
+				person[person[i].killtarget].skeleton.joints[head].locked=1;
+				person[person[i].killtarget].skeleton.joints[rightshoulder].locked=1;
 
 				for(int k=0;k<2;k++){
-					person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].position=DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[righthand]].position,0,person[i].playerrotation,0)+person[i].playercoords;
-					person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].velocity=0;
-					person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].position=DoRotation(person[i].skeleton.joints[person[i].skeleton.jointlabels[lefthand]].position,0,person[i].playerrotation,0)+person[i].playercoords;
-					person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].velocity=0;
+					person[person[i].killtarget].skeleton.joints[head].position=DoRotation(person[i].skeleton.joints[righthand].position,0,person[i].playerrotation,0)+person[i].playercoords;
+					person[person[i].killtarget].skeleton.joints[head].velocity=0;
+					person[person[i].killtarget].skeleton.joints[rightshoulder].position=DoRotation(person[i].skeleton.joints[lefthand].position,0,person[i].playerrotation,0)+person[i].playercoords;
+					person[person[i].killtarget].skeleton.joints[rightshoulder].velocity=0;
 					person[person[i].killtarget].skeleton.DoConstraints();
 					person[person[i].killtarget].skeleton.DoConstraints(&blocksimplecollide[citytype[person[i].whichblockx][person[i].whichblocky]],&move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
 				}
 
-				person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[head]].locked=0;
-				person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[rightshoulder]].locked=0;
+				person[person[i].killtarget].skeleton.joints[head].locked=0;
+				person[person[i].killtarget].skeleton.joints[rightshoulder].locked=0;
 				person[person[i].killtarget].longdead=1;
 			}
 
@@ -1482,8 +1479,8 @@ void Game::Tick()
 												auto stabpos = person[i].playercoords + flatfacing - camera.position;
 												playSound(gSourceID[knifeslashsound],
 													stabpos.x, stabpos.y, stabpos.z);
-												person[person[i].killtarget].bjoint1=&person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[neck]];
-												person[person[i].killtarget].bjoint2=&person[person[i].killtarget].skeleton.joints[person[person[i].killtarget].skeleton.jointlabels[neck]];
+												person[person[i].killtarget].bjoint1=&person[person[i].killtarget].skeleton.joints[neck];
+												person[person[i].killtarget].bjoint2=&person[person[i].killtarget].skeleton.joints[neck];
 												person[person[i].killtarget].bleeding=1;
 												person[person[i].killtarget].bleeddelay=1;
 												person[person[i].killtarget].health-=20;
@@ -1608,7 +1605,7 @@ void Game::Tick()
 					person[i].playercoords.y = joint.position.y;
 
 			//Find orientation
-			XYZ firsttop=person[i].skeleton.joints[person[i].skeleton.jointlabels[neck]].position-person[i].skeleton.joints[person[i].skeleton.jointlabels[groin]].position;
+			XYZ firsttop=person[i].skeleton.joints[neck].position-person[i].skeleton.joints[groin].position;
 			Normalise(&firsttop);
 			person[i].playerrotation=acos(0-firsttop.z);
 			person[i].playerrotation*=360/6.28;
@@ -1639,21 +1636,21 @@ void Game::Tick()
 					playSound(gSourceID[knifeslashsound],
 						soundpos.x, soundpos.y, soundpos.z);
 
-					person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
-					person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
+					person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[neck];
+					person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[neck];
 					person[person[0].killtarget].bleeding=1;
 					person[person[0].killtarget].bleeddelay=1;
-					person[0].bjoint1=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
-					person[0].bjoint2=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
+					person[0].bjoint1=&person[0].skeleton.joints[righthand];
+					person[0].bjoint2=&person[0].skeleton.joints[righthand];
 
 					person[0].bleeding=1;
 					person[0].bleeddelay=1;
 
 					velocity=DoRotation(flatfacing,0,70,0)*50+person[0].velocity*2;
 					velocity.y+=30;
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
 				}
 
 				person[person[0].killtarget].health-=100;
@@ -1672,8 +1669,8 @@ void Game::Tick()
 				}
 
 				if(person[0].whichgun!=knife){
-					person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=DoRotation(flatfacing,0,40,0)*50;
-					person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=person[0].velocity*2;
+					person[person[0].killtarget].skeleton.joints[head].velocity+=DoRotation(flatfacing,0,40,0)*50;
+					person[person[0].killtarget].skeleton.joints[head].velocity+=person[0].velocity*2;
 				}
 			} else if (!whacked) {
 				whacked = true;
@@ -1684,13 +1681,13 @@ void Game::Tick()
 					playSound(gSourceID[knifeslashsound],
 						soundpos.x, soundpos.y, soundpos.z);
 
-					person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
-					person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]];
+					person[person[0].killtarget].bjoint1=&person[person[0].killtarget].skeleton.joints[neck];
+					person[person[0].killtarget].bjoint2=&person[person[0].killtarget].skeleton.joints[neck];
 
 					person[person[0].killtarget].bleeddelay=1;
 
-					person[0].bjoint1=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
-					person[0].bjoint2=&person[0].skeleton.joints[person[0].skeleton.jointlabels[righthand]];
+					person[0].bjoint1=&person[0].skeleton.joints[righthand];
+					person[0].bjoint2=&person[0].skeleton.joints[righthand];
 
 					person[0].bleeding=1;
 					person[0].bleeddelay=1;
@@ -1698,9 +1695,9 @@ void Game::Tick()
 					velocity=DoRotation(flatfacing,0,70,0)*50+person[0].velocity*2;
 					velocity.y+=30;
 
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
-					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[neck]].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.3, 2);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.2, 3);
+					sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,DoRotation(person[person[0].killtarget].skeleton.joints[neck].position,0,person[person[0].killtarget].playerrotation,0)+person[person[0].killtarget].playercoords, velocity*.1, 4);
 				}
 
 				person[person[0].killtarget].health-=200;
@@ -1720,8 +1717,8 @@ void Game::Tick()
 				}
 
 				if(person[0].whichgun!=knife){
-					person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=DoRotation(flatfacing,0,40,0)*50;
-					person[person[0].killtarget].skeleton.joints[person[person[0].killtarget].skeleton.jointlabels[head]].velocity+=person[0].velocity*2;
+					person[person[0].killtarget].skeleton.joints[head].velocity+=DoRotation(flatfacing,0,40,0)*50;
+					person[person[0].killtarget].skeleton.joints[head].velocity+=person[0].velocity*2;
 				}
 			}
 		}
@@ -1846,10 +1843,10 @@ void Game::Tick()
 			switch (person[j].whichgun) {
 			case handgun1:
 			case handgun2:
-				aimjoint = person[j].skeleton.jointlabels[rightwrist];
+				aimjoint = rightwrist;
 				break;
 			default:
-				aimjoint = person[j].skeleton.jointlabels[lefthand];
+				aimjoint = lefthand;
 			}
 			start = person[j].playercoords
 				+ DoRotation(person[j].skeleton.joints[aimjoint].position,
@@ -2260,7 +2257,7 @@ void Game::Tick()
 
 							if(&person[whichhit].skeleton.joints[j]==hitstruct.joint1||&person[whichhit].skeleton.joints[j]==hitstruct.joint2){
 
-								if(j!=person[whichhit].skeleton.jointlabels[abdomen]&&j!=person[whichhit].skeleton.jointlabels[groin]&&j!=person[whichhit].skeleton.jointlabels[neck]){
+								if (j != abdomen && j != groin && j != neck) {
 
 									sprites.MakeSprite(bloodspritedown, .8, 1, .2, .2,person[whichhit].skeleton.joints[j].position, person[whichhit].skeleton.joints[j].velocity/3, 9);
 
@@ -2469,19 +2466,19 @@ void Game::Tick()
 
 				if(!zoom||j!=0){
 
-					if(person[j].whichgun==assaultrifle)aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position-person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position,0,person[j].playerrotation-2.5,0);
+					if(person[j].whichgun==assaultrifle)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation-2.5,0);
 
-					if(person[j].whichgun==sniperrifle)aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position-person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position,0,person[j].playerrotation+4,0);
+					if(person[j].whichgun==sniperrifle)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation+4,0);
 
-					if(person[j].whichgun==shotgun)aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position-person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position,0,person[j].playerrotation+4,0);
+					if(person[j].whichgun==shotgun)aim=DoRotation(person[j].skeleton.joints[lefthand].position-person[j].skeleton.joints[righthand].position,0,person[j].playerrotation+4,0);
 
-					if(person[j].whichgun==handgun1&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position-(person[j].skeleton.joints[person[j].skeleton.jointlabels[head]].position*.65+person[j].skeleton.joints[person[j].skeleton.jointlabels[neck]].position*.35),0,person[j].playerrotation-.9,0);
+					if(person[j].whichgun==handgun1&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.65+person[j].skeleton.joints[neck].position*.35),0,person[j].playerrotation-.9,0);
 
-					if(person[j].whichgun==handgun1&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position-(person[j].skeleton.joints[person[j].skeleton.jointlabels[head]].position*.35+person[j].skeleton.joints[person[j].skeleton.jointlabels[neck]].position*.65),0,person[j].playerrotation-.9,0);
+					if(person[j].whichgun==handgun1&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.35+person[j].skeleton.joints[neck].position*.65),0,person[j].playerrotation-.9,0);
 
-					if(person[j].whichgun==handgun2&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position-(person[j].skeleton.joints[person[j].skeleton.jointlabels[head]].position*.65+person[j].skeleton.joints[person[j].skeleton.jointlabels[neck]].position*.35),0,person[j].playerrotation-.9,0);
+					if(person[j].whichgun==handgun2&&!thirdperson&&j==0)aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.65+person[j].skeleton.joints[neck].position*.35),0,person[j].playerrotation-.9,0);
 
-					if(person[j].whichgun==handgun2&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[righthand])].position-(person[j].skeleton.joints[person[j].skeleton.jointlabels[head]].position*.35+person[j].skeleton.joints[person[j].skeleton.jointlabels[neck]].position*.65),0,person[j].playerrotation-.9,0);
+					if(person[j].whichgun==handgun2&&(thirdperson||j!=0))aim=DoRotation(person[j].skeleton.joints[righthand].position-(person[j].skeleton.joints[head].position*.35+person[j].skeleton.joints[neck].position*.65),0,person[j].playerrotation-.9,0);
 
 				}
 
@@ -2497,7 +2494,7 @@ void Game::Tick()
 
 				if(person[j].whichgun==sniperrifle){
 
-					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position,0,person[j].playerrotation,0);
+					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
 
 					start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(0-.4);
 
@@ -2505,7 +2502,7 @@ void Game::Tick()
 
 				if(person[j].whichgun==shotgun){
 
-					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position,0,person[j].playerrotation,0);
+					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
 
 					start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(0-.4);
 
@@ -2513,7 +2510,7 @@ void Game::Tick()
 
 				if(person[j].whichgun==handgun1){
 
-					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[rightwrist])].position,0,person[j].playerrotation,0);
+					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[rightwrist].position,0,person[j].playerrotation,0);
 
 					start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.55-.4);
 
@@ -2521,7 +2518,7 @@ void Game::Tick()
 
 				if(person[j].whichgun==handgun2){
 
-					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[rightwrist])].position,0,person[j].playerrotation,0);
+					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[rightwrist].position,0,person[j].playerrotation,0);
 
 					start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.55-.4);
 
@@ -2529,7 +2526,7 @@ void Game::Tick()
 
 				if(person[j].whichgun==assaultrifle){
 
-					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[(person[j].skeleton.jointlabels[lefthand])].position,0,person[j].playerrotation,0);
+					start=person[j].playercoords+DoRotation(person[j].skeleton.joints[lefthand].position,0,person[j].playerrotation,0);
 
 					start-=DoRotation(DoRotation(DoRotation(aim,0,-person[j].playerrotation,0),90,0,0),0,person[j].playerrotation,0)*(.25-.4);
 
@@ -2985,8 +2982,8 @@ void Game::Tick()
 						person[k].longdead = 1;
 						person[k].bleeddelay = 1;
 
-						person[k].bjoint1 = &person[k].skeleton.joints[person[k].skeleton.jointlabels[head]];
-						person[k].bjoint2 = &person[k].skeleton.joints[person[k].skeleton.jointlabels[neck]];
+						person[k].bjoint1 = &person[k].skeleton.joints[head];
+						person[k].bjoint2 = &person[k].skeleton.joints[neck];
 
 						for (auto& joint : person[k].skeleton.joints) {
 							joint.position = DoRotation(joint.position, 0, person[k].playerrotation, 0);
@@ -3035,9 +3032,9 @@ void Game::Tick()
 	//camera position
 	XYZ average;
 
-	if(!zoom)average=person[0].skeleton.joints[(person[0].skeleton.jointlabels[head])].position*(person[0].aimamount/2+.5)+person[0].skeleton.joints[(person[0].skeleton.jointlabels[neck])].position*((1-person[0].aimamount)/2);
+	if(!zoom)average=person[0].skeleton.joints[head].position*(person[0].aimamount/2+.5)+person[0].skeleton.joints[neck].position*((1-person[0].aimamount)/2);
 
-	if(zoom)average=person[0].skeleton.joints[(person[0].skeleton.jointlabels[righthand])].position;
+	if(zoom)average=person[0].skeleton.joints[righthand].position;
 
 	if(person[0].skeleton.free==0&&thirdperson!=2)camera.position=person[0].playercoords+DoRotation(average,0,person[0].playerrotation,0);
 
diff --git a/src/Person.cpp b/src/Person.cpp
index fb05907..888ea8f 100644
--- a/src/Person.cpp
+++ b/src/Person.cpp
@@ -218,8 +218,7 @@ void Person::DoAnimations(int who)
 
 		if (targetanimation == zombieeatanim && targetframe == 3) {
 			auto& joints = skeleton.joints;
-			auto& jointlabels = skeleton.jointlabels;
-			auto head_joint = joints[jointlabels[head]];
+			auto head_joint = joints[head];
 			auto soundsrc = (DoRotation(head_joint.position,
 				0, playerrotation, 0) + playercoords
 				- camera.position) / soundscalefactor;
@@ -228,7 +227,7 @@ void Person::DoAnimations(int who)
 			bleeding = 1;
 			bleeddelay = 1;
 			bjoint1 = &head_joint;
-			bjoint2 = joints + jointlabels[neck];
+			bjoint2 = joints + neck;
 		}
 
 		currentanimation = targetanimation;
@@ -247,8 +246,7 @@ void Person::DoAnimations(int who)
 		    && currentanimation == diveanim && targetframe == 0) {
 			targetanimation = getupfrontanim;
 			auto& joints = skeleton.joints;
-			auto& jointlabels = skeleton.jointlabels;
-			auto head_joint = joints[jointlabels[head]];
+			auto head_joint = joints[head];
 			auto soundsrc = (DoRotation(head_joint.position,
 				0, playerrotation, 0) + playercoords
 				- camera.position) / soundscalefactor;
@@ -360,8 +358,8 @@ void Person::DoAnimations(int who)
 					skeleton.joints[i].position = animation[rifleholdanim].position[i][0];
 					if (currentanimation == crouchanim
 					    || targetanimation == crouchanim)
-						skeleton.joints[i].position += skeleton.joints[skeleton.jointlabels[neck]].position
-							- animation[idleanim].position[skeleton.jointlabels[neck]][0];
+						skeleton.joints[i].position += skeleton.joints[neck].position
+							- animation[idleanim].position[neck][0];
 				}
 		}
 
@@ -381,7 +379,7 @@ void Person::DoAnimations(int who)
 				if(grenamount>0)grenamount-=multiplier*4;
 				if(grenamount<0)grenamount=0;
 			}
-			rotatearound=skeleton.joints[skeleton.jointlabels[neck]].position;
+			rotatearound=skeleton.joints[neck].position;
 			for (int i = 0; i < max_joints; ++i){
 				if(skeleton.joints[i].label!=righthand&&skeleton.joints[i].label!=rightelbow&&skeleton.joints[i].label!=rightwrist&&skeleton.joints[i].label!=lefthand&&skeleton.joints[i].label!=leftelbow&&skeleton.joints[i].label!=leftwrist){
 				}else{
@@ -389,7 +387,7 @@ void Person::DoAnimations(int who)
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[rifleaimanim].position[i][0];
 						if(currentanimation==crouchanim||targetanimation==crouchanim){
-							skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+							skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						}
 						skeleton.joints[i].position+=facingright*0.1;
 						skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2-10)*aimamount,0,0);
@@ -398,27 +396,27 @@ void Person::DoAnimations(int who)
 					if(whichgun==shotgun){
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[assaultrifleaimanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0);
 						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position+=facingdown*.2;
 						else skeleton.joints[i].position-=facingdown*.02;
-						if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[skeleton.jointlabels[lefthand]].position-facinghalf*2;
+						if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[lefthand].position-facinghalf*2;
 						skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount);
 					}
 					if(whichgun==assaultrifle){
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[assaultrifleaimanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0);
 						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position+=facingdown*.2;
 						else skeleton.joints[i].position-=facingdown*.02;
-						if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[skeleton.jointlabels[lefthand]].position-facinghalf*2;
+						if(skeleton.joints[i].label==righthand)skeleton.joints[i].position=skeleton.joints[lefthand].position-facinghalf*2;
 						skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount);
 					}
 					if(whichgun==handgun1){
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[pistolaimanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0);
 						if(currentanimation==crouchanim||targetanimation==crouchanim){skeleton.joints[i].position+=facingright*.15;skeleton.joints[i].position+=facingdown*.3;}
 						else skeleton.joints[i].position-=facingdown*.1;
@@ -427,7 +425,7 @@ void Person::DoAnimations(int who)
 					if(whichgun==handgun2){
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[pistolaimanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=rotatearound+DoRotation(skeleton.joints[i].position-rotatearound,(playerrotation2/2)*aimamount,0,0);
 						if(currentanimation==crouchanim||targetanimation==crouchanim){skeleton.joints[i].position+=facingright*.15;skeleton.joints[i].position+=facingdown*.3;}
 						else skeleton.joints[i].position-=facingdown*.1;
@@ -437,13 +435,13 @@ void Person::DoAnimations(int who)
 						aimamount=1;
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[grenadeaimanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=skeleton.joints[i].position*(aimamount)+oldpos*(1-aimamount);
 					}
 					if(whichgun==grenade&&grenamount>0){
 						oldpos=skeleton.joints[i].position;
 						skeleton.joints[i].position=animation[grenadechargeanim].position[i][0];
-						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[skeleton.jointlabels[neck]][0]-skeleton.joints[skeleton.jointlabels[neck]].position);
+						if(currentanimation==crouchanim||targetanimation==crouchanim)skeleton.joints[i].position-=(animation[idleanim].position[neck][0]-skeleton.joints[neck].position);
 						skeleton.joints[i].position=skeleton.joints[i].position*(grenamount)+oldpos*(1-grenamount);
 					}
 					if(thirdperson||who!=0)skeleton.joints[i].position+=facingdown*.4;
@@ -488,11 +486,11 @@ void Person::DoAnimations(int who)
 				}
 				if(attackframe==animation[grenadethrowanim].numframes-1&&ammo>0){
 					ammo=-1;
-					sprites.MakeSprite(grenadesprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*30+velocity, 1);
-					sprites.MakeSprite(spoonsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*10+velocity, 1);
-					sprites.MakeSprite(pinsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[skeleton.jointlabels[lefthand]].position,0,playerrotation,0)+playercoords, facing*.1+velocity, 1);
+					sprites.MakeSprite(grenadesprite, 1, 1, 1, 1, DoRotation(skeleton.joints[righthand].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*30+velocity, 1);
+					sprites.MakeSprite(spoonsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[righthand].position,0,playerrotation,0)+playercoords, DoRotation(facing,0,playerrotation,0)*10+velocity, 1);
+					sprites.MakeSprite(pinsprite, 1, 1, 1, 1, DoRotation(skeleton.joints[lefthand].position,0,playerrotation,0)+playercoords, facing*.1+velocity, 1);
 
-					XYZ soundsrc = (DoRotation(skeleton.joints[skeleton.jointlabels[righthand]].position, 0, playerrotation, 0)
+					XYZ soundsrc = (DoRotation(skeleton.joints[righthand].position, 0, playerrotation, 0)
 						+ playercoords - camera.position) / soundscalefactor;
 					ALfloat gLoc[] {soundsrc.x, soundsrc.y, soundsrc.z};
 					alSourcefv(gSourceID[grenadethrowsound], AL_POSITION, gLoc);
@@ -501,7 +499,7 @@ void Person::DoAnimations(int who)
 			}
 		}
 
-		rotatearound=skeleton.joints[skeleton.jointlabels[abdomen]].position;
+		rotatearound=skeleton.joints[abdomen].position;
 		if (who == 0) {
 			for (auto& joint : skeleton.joints)
 				if (!joint.lower)
@@ -509,9 +507,9 @@ void Person::DoAnimations(int who)
 						+ DoRotation(joint.position - rotatearound, playerrotation2 / 2, 0, 0);
 				else if (joint.label != groin)
 					joint.position = DoRotation(joint.position, 0, playerlowrotation - playerrotation, 0);
-			rotatearound = skeleton.joints[skeleton.jointlabels[neck]].position;
-			skeleton.joints[skeleton.jointlabels[head]].position = rotatearound
-				+ DoRotation(skeleton.joints[skeleton.jointlabels[head]].position - rotatearound, playerrotation2 / 2, 0, 0);
+			rotatearound = skeleton.joints[neck].position;
+			skeleton.joints[head].position = rotatearound
+				+ DoRotation(skeleton.joints[head].position - rotatearound, playerrotation2 / 2, 0, 0);
 		}
 
 		skeleton.DoConstraints();
@@ -582,8 +580,7 @@ void Person::DoAnimationslite(int who)
 
 		if (targetanimation == zombieeatanim && targetframe == 3) {
 			auto& joints = skeleton.joints;
-			auto& jointlabels = skeleton.jointlabels;
-			auto head_joint = joints[jointlabels[head]];
+			auto head_joint = joints[head];
 			auto soundsrc = (DoRotation(head_joint.position,
 				0, playerrotation, 0) + playercoords
 				- camera.position) / soundscalefactor;
@@ -592,7 +589,7 @@ void Person::DoAnimationslite(int who)
 			bleeding = 1;
 			bleeddelay = 1;
 			bjoint1 = &head_joint;
-			bjoint2 = joints + jointlabels[neck];
+			bjoint2 = joints + neck;
 		}
 
 		currentanimation = targetanimation;
@@ -830,12 +827,10 @@ void draw_muscle(Muscle& mus, int who, int whichcostume)
 
 int Person::DrawSkeleton(int who)
 {
-	auto& left_hand = skeleton.jointlabels[lefthand];
-	auto& left_wrist = skeleton.joints[left_hand].position;
-	auto& right_hand = skeleton.jointlabels[righthand];
-	auto& right_wrist = skeleton.joints[right_hand].position;
-	auto& head_pos = skeleton.joints[skeleton.jointlabels[head]].position;
-	auto& neck_pos = skeleton.joints[skeleton.jointlabels[neck]].position;
+	auto& left_wrist = skeleton.joints[lefthand].position;
+	auto& right_wrist = skeleton.joints[righthand].position;
+	auto& head_pos = skeleton.joints[head].position;
+	auto& neck_pos = skeleton.joints[neck].position;
 
 	switch (whichgun) {
 	case sniperrifle:
@@ -920,7 +915,7 @@ int Person::DrawSkeleton(int who)
 		glPopMatrix();
 		break;
 	case knife:
-		auto& wrist = skeleton.joints[skeleton.jointlabels[righthand]];
+		auto& wrist = skeleton.joints[righthand];
 		glPushMatrix();
 		glTranslatef(wrist.position.x,
 			wrist.position.y, wrist.position.z);
@@ -936,8 +931,7 @@ int Person::DrawSkeleton(int who)
 	if (litup) {
 		GLfloat LightAmbient[] {0, 0, 0, 1.0f};
 		GLfloat LightDiffuse[] {1, 1, 1, 1.0f};
-		auto& hand = skeleton.jointlabels[lefthand];
-		XYZ lightpoint = skeleton.joints[hand].position;
+		XYZ lightpoint = skeleton.joints[lefthand].position;
 		GLfloat LightPosition[] {lightpoint.x,
 			lightpoint.y, lightpoint.z, 0};
 		glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);
@@ -994,17 +988,13 @@ int Person::DrawSkeleton(int who)
 			auto specialfwd = skeleton.specialforward;
 			*specialfwd++ = skeleton.forward;
 
-			auto& right_shoulder = skeleton.jointlabels[rightshoulder];
-			auto& right_elbow = skeleton.jointlabels[rightelbow];
-			*specialfwd = skeleton.joints[right_elbow].position
-				- skeleton.joints[right_shoulder].position / 2
+			*specialfwd = skeleton.joints[rightelbow].position
+				- skeleton.joints[rightshoulder].position / 2
 				- right_wrist / 2 + skeleton.forward * 0.2;
 			Normalise(specialfwd++);
 
-			auto& left_shoulder = skeleton.jointlabels[leftshoulder];
-			auto& left_elbow = skeleton.jointlabels[leftelbow];
-			*specialfwd = skeleton.joints[left_elbow].position
-				- skeleton.joints[left_shoulder].position / 2
+			*specialfwd = skeleton.joints[leftelbow].position
+				- skeleton.joints[leftshoulder].position / 2
 				- left_wrist / 2 + skeleton.forward * 0.2;
 			Normalise(specialfwd++);
 
@@ -1022,21 +1012,15 @@ int Person::DrawSkeleton(int who)
 				skeleton.specialforward[2] += facingdown * aimamount;
 			}
 
-			auto& right_hip = skeleton.jointlabels[righthip];
-			auto& right_ankle = skeleton.jointlabels[rightankle];
-			auto& right_knee = skeleton.jointlabels[rightknee];
-			*specialfwd = skeleton.joints[right_hip].position / 2
-				+ skeleton.joints[right_ankle].position / 2
-				- skeleton.joints[right_knee].position
+			*specialfwd = skeleton.joints[righthip].position / 2
+				+ skeleton.joints[rightankle].position / 2
+				- skeleton.joints[rightknee].position
 				+ skeleton.lowforward * 0.2;
 			Normalise(specialfwd++);
 
-			auto& left_hip = skeleton.jointlabels[lefthip];
-			auto& left_ankle = skeleton.jointlabels[leftankle];
-			auto& left_knee = skeleton.jointlabels[leftknee];
-			*specialfwd = skeleton.joints[left_hip].position / 2
-				+ skeleton.joints[left_ankle].position / 2
-				- skeleton.joints[left_knee].position
+			*specialfwd = skeleton.joints[lefthip].position / 2
+				+ skeleton.joints[leftankle].position / 2
+				- skeleton.joints[leftknee].position
 				+ skeleton.lowforward * 0.2;
 			Normalise(specialfwd++);
 
diff --git a/src/Skeleton.cpp b/src/Skeleton.cpp
index 6aa3508..58f6035 100644
--- a/src/Skeleton.cpp
+++ b/src/Skeleton.cpp
@@ -98,9 +98,7 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation)
 	numrepeats = 2;
 	for (int j = 0; j < numrepeats; j++) {
 		for (int i = 0; i < max_joints; i++) {
-			if (!joints[i].existing
-			    && i != jointlabels[lefthand]
-			    && i != jointlabels[righthand])
+			if (!joints[i].existing && i != lefthand && i != righthand)
 				continue;
 
 			// Length constraints
@@ -181,9 +179,7 @@ void Skeleton::DoConstraints(Model *collide, XYZ *move, float rotation)
 	for (int i = 0; i < max_joints; i++) {
 		joints[i].realoldposition = joints[i].position;
 		//Add velocity
-		if (joints[i].existing
-		    || i == jointlabels[lefthand]
-		    || i == jointlabels[righthand])
+		if (joints[i].existing || i == lefthand || i == righthand)
 			joints[i].position += joints[i].velocity * multiplier;
 	}
 }
@@ -420,21 +416,21 @@ void Animation::load(const char* name)
 		//Special forwards
 		testskeleton.specialforward[0]=testskeleton.forward;
 
-		testskeleton.specialforward[1]=testskeleton.joints[testskeleton.jointlabels[rightshoulder]].position+testskeleton.joints[testskeleton.jointlabels[rightwrist]].position;
-		testskeleton.specialforward[1]=testskeleton.joints[testskeleton.jointlabels[rightelbow]].position-testskeleton.specialforward[1]/2;
+		testskeleton.specialforward[1]=testskeleton.joints[rightshoulder].position+testskeleton.joints[rightwrist].position;
+		testskeleton.specialforward[1]=testskeleton.joints[rightelbow].position-testskeleton.specialforward[1]/2;
 		testskeleton.specialforward[1]+=testskeleton.forward*.2;
 		Normalise(&testskeleton.specialforward[1]);
-		testskeleton.specialforward[2]=testskeleton.joints[testskeleton.jointlabels[leftshoulder]].position+testskeleton.joints[testskeleton.jointlabels[leftwrist]].position;
-		testskeleton.specialforward[2]=testskeleton.joints[testskeleton.jointlabels[leftelbow]].position-testskeleton.specialforward[2]/2;
+		testskeleton.specialforward[2]=testskeleton.joints[leftshoulder].position+testskeleton.joints[leftwrist].position;
+		testskeleton.specialforward[2]=testskeleton.joints[leftelbow].position-testskeleton.specialforward[2]/2;
 		testskeleton.specialforward[2]+=testskeleton.forward*.2;
 		Normalise(&testskeleton.specialforward[2]);
 
-		testskeleton.specialforward[3]=testskeleton.joints[testskeleton.jointlabels[righthip]].position+testskeleton.joints[testskeleton.jointlabels[rightankle]].position;
-		testskeleton.specialforward[3]=testskeleton.specialforward[3]/2-testskeleton.joints[testskeleton.jointlabels[rightknee]].position;
+		testskeleton.specialforward[3]=testskeleton.joints[righthip].position+testskeleton.joints[rightankle].position;
+		testskeleton.specialforward[3]=testskeleton.specialforward[3]/2-testskeleton.joints[rightknee].position;
 		testskeleton.specialforward[3]+=testskeleton.lowforward*.2;
 		Normalise(&testskeleton.specialforward[3]);
-		testskeleton.specialforward[4]=testskeleton.joints[testskeleton.jointlabels[lefthip]].position+testskeleton.joints[testskeleton.jointlabels[leftankle]].position;
-		testskeleton.specialforward[4]=testskeleton.specialforward[4]/2-testskeleton.joints[testskeleton.jointlabels[leftknee]].position;
+		testskeleton.specialforward[4]=testskeleton.joints[lefthip].position+testskeleton.joints[leftankle].position;
+		testskeleton.specialforward[4]=testskeleton.specialforward[4]/2-testskeleton.joints[leftknee].position;
 		testskeleton.specialforward[4]+=testskeleton.lowforward*.2;
 		Normalise(&testskeleton.specialforward[4]);
 
@@ -513,7 +509,7 @@ void Skeleton::reload()
 	JointData joints_data[max_joints];
 	loadJoints(joints_data);
 	for (int i = 0; i < max_joints; ++i) {
-		joints[i].label = joints_data[i].label;
+		joints[i].label = i;
 		joints[i].position.x = joints_data[i].x;
 		joints[i].position.y = joints_data[i].y;
 		joints[i].position.z = joints_data[i].z;
@@ -534,7 +530,6 @@ void Skeleton::reload()
 		joints[i].locked = false;
 		joints[i].velocity = 0;
 		joints[i].oldposition = joints[i].position;
-		jointlabels[joints[i].label] = i;
 	}
 
 	forwardjoints[0] = 7;
diff --git a/src/Skeleton.h b/src/Skeleton.h
index c8c41df..487c3c8 100644
--- a/src/Skeleton.h
+++ b/src/Skeleton.h
@@ -101,7 +101,6 @@ class Skeleton
 {
 	public:
 		Joint joints[max_joints];
-		int jointlabels[max_joints];
 		Muscle muscles[max_muscles];
 		int num_muscles;
 
diff --git a/src/misc.h b/src/misc.h
index 7a377f6..36880ff 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -16,7 +16,6 @@ struct AnimationData {
 };
 
 struct JointData {
-	signed char label;
 	float x, y, z;
 	float length;
 	unsigned char model;
diff --git a/src/misc.zig b/src/misc.zig
index 359c914..f61fc2d 100644
--- a/src/misc.zig
+++ b/src/misc.zig
@@ -119,7 +119,6 @@ pub fn parseBool(s: []const u8) !bool {
 }
 
 const Joint = extern struct {
-    label: i8,
     x: f32,
     y: f32,
     z: f32,
@@ -131,7 +130,6 @@ const Joint = extern struct {
 
     pub fn load(self: *Joint, row: []const u8) !void {
         var values = tokenize(row, "\t");
-        self.label = try parseInt(i8, values.next().?, 10);
         self.x = try parseFloat(f32, values.next().?);
         self.y = try parseFloat(f32, values.next().?);
         self.z = try parseFloat(f32, values.next().?);