diff options
Diffstat (limited to 'src/GameTick.cpp')
-rw-r--r-- | src/GameTick.cpp | 68 |
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); |