aboutsummaryrefslogtreecommitdiff
path: root/src/GameTick.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r--src/GameTick.cpp68
1 files changed, 31 insertions, 37 deletions
diff --git a/src/GameTick.cpp b/src/GameTick.cpp
index 64d8614..dfc84de 100644
--- a/src/GameTick.cpp
+++ b/src/GameTick.cpp
@@ -736,14 +736,41 @@ void tackle(Game* game, XYZ flatfacing)
}
}
-void renderBloodSprite(Game* game, size_t i)
+void bleed(Game* game, size_t i)
{
auto& person = game->person[i];
- if (person.bleeding <= 0)
+ if (person.health < 0.0f && person.longdead < 0.0f
+ && !person.firstlongdead && person.type != zombietype) {
+ int x = person.whichblockx, y = person.whichblocky;
+ auto rot = game->cityrotation[x][y] * 90;
+ auto overpoint = person.skeleton.joints[abdomen].position;
+ overpoint.y += 3000;
+ auto underpoint = person.skeleton.joints[abdomen].position;
+ underpoint.y -= 3000;
+ XYZ temp;
+ XYZ move {(float) x * block_spacing, 0.0f, (float) y * block_spacing, };
+ auto whichtri = game->sidewalkcollide.LineCheck2(overpoint,
+ underpoint, &temp, move, rot);
+
+ XYZ normish {0.0f, 1.0f, 0.0f};
+ if (whichtri >= 0) {
+ decals.MakeDecal(bloodpool, temp, 12, normish,
+ whichtri, &game->sidewalkcollide, move, rot);
+ } else {
+ temp = person.skeleton.joints[abdomen].position;
+ temp.y = -0.5f;
+ decals.MakeDecal(bloodpool, temp, 12, normish,
+ 0, &game->sidewalkcollide, {}, 0);
+ }
+ person.firstlongdead = true;
+ return;
+ }
+
+ if (person.bleeding <= 0.0f)
return;
person.bleeding -= multiplier;
person.bleeddelay -= multiplier * 10;
- if (person.bleeddelay > 0)
+ if (person.bleeddelay > 0.0f)
return;
person.bleeddelay = 1.0f;
XYZ loc = (person.bjoint1->position + person.bjoint2->position) / 2.0f;
@@ -942,39 +969,6 @@ void Game::Tick()
//People
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[abdomen].position;
- overpoint.y+=3000;
- underpoint=person[i].skeleton.joints[abdomen].position;
- underpoint.y-=3000;
-
- move = {
- (float) person[i].whichblockx * block_spacing,
- 0.0f,
- (float) person[i].whichblocky * block_spacing,
- };
-
- XYZ temp;
- whichtri=sidewalkcollide.LineCheck2(overpoint,underpoint,&temp,move,cityrotation[person[i].whichblockx][person[i].whichblocky]*90);
-
- XYZ normish {0.0f, 1.0f, 0.0f};
- if(whichtri>=0){
- 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[abdomen].position;
- temp.y=-.5;
- move = {};
- decals.MakeDecal(bloodpool,temp,12,normish, 0, &sidewalkcollide, move, 0);
- }
-
- person[i].firstlongdead=1;
-
- }
-
- }
-
if(person[i].health<100&&person[i].type!=zombietype){
person[i].health-=multiplier*120;
}
@@ -1010,7 +1004,7 @@ void Game::Tick()
if(person[i].maxhealth>100)person[i].maxhealth=100;
}
- renderBloodSprite(this, i);
+ bleed(this, i);
if (!person[i].skeleton.free) {
recoil(this, i);