diff options
-rw-r--r-- | src/Game.h | 1 | ||||
-rw-r--r-- | src/GameTick.cpp | 290 | ||||
-rw-r--r-- | src/Person.cpp | 1 |
3 files changed, 81 insertions, 211 deletions
diff --git a/src/Game.h b/src/Game.h index 7e663ab..88683d9 100644 --- a/src/Game.h +++ b/src/Game.h @@ -71,7 +71,6 @@ struct Game { float flashr,flashg,flashb; int enemystate; - int cycle; bool whacked; float losedelay; struct XYZ bodycoords; diff --git a/src/GameTick.cpp b/src/GameTick.cpp index 071993b..3c2a1d8 100644 --- a/src/GameTick.cpp +++ b/src/GameTick.cpp @@ -547,6 +547,86 @@ void checkPersonCollisions(Game* game, int k) } } +void spawnNpc(Game* game) +{ + if ((game->spawndelay -= multiplier) > 0) + return; + game->spawndelay = 0.1f; + if (game->numpeople >= max_people) + return; + auto& npc = game->person[game->numpeople++]; + + // Pick a random unfull block close to the player + int blockspawnx, blockspawny; + auto& player = game->person[0]; + auto block = player.playercoords / block_spacing; + for (auto cyclenum = 0; cyclenum < 10; ++cyclenum) { + blockspawnx = block.x + 0.5f + randInt(-1, 1); + blockspawny = block.z + 0.5f + randInt(-1, 1); + if (game->citypeoplenum[blockspawnx][blockspawny] + < max_people_block) + break; + } + if (game->citypeoplenum[blockspawnx][blockspawny] >= max_people_block) + return; + game->citypeoplenum[blockspawnx][blockspawny]++; + + npc.whichblockx = blockspawnx; + npc.whichblocky = blockspawny; + npc.whichcostume = casualcostumes + randUint(numcasual); + if (npc.type == viptype) { + npc.existing = true; + npc.pathsize = 0.98f + 0.04f * randFloat(); + npc.speedmult = 0.8f + 0.4f * randFloat(); + npc.targetanimation = walkanim; + } else if (game->type == zombie_type) { + npc.type = zombietype; + npc.aiming = false; + npc.existing = true; + npc.pathsize = 1.04; + npc.speedmult = 0.7f + 0.2f * game->difficulty; + npc.targetanimation = zombiewalkanim; + } else if (randUint(game->evilprobability)) { + npc.type = civiliantype; + npc.aiming = false; + npc.existing = false; + npc.pathsize = 0.98f + 0.04f * randFloat(); + npc.speedmult = 0.8f + 0.4f * randFloat(); + npc.targetanimation = walkanim; + } else { + npc.type = eviltype; + npc.aiming = true; + npc.existing = true; + npc.pathsize = 1.04; + npc.speedmult = 1.0f + 0.3f * game->difficulty; + npc.targetanimation = walkanim; + } + + npc.pathnum = -1; + while (npc.pathnum < 0 + || npc.pathnum == 1 + || npc.pathnum >= game->path.vertexNum) + npc.pathnum = randUint(game->path.vertexNum); + npc.oldoldoldpathnum = npc.oldoldpathnum = npc.oldpathnum = -1; + + npc.pathtarget.x = game->path.vertex[npc.pathnum].x; + npc.pathtarget.z = game->path.vertex[npc.pathnum].z; + npc.pathtarget *= npc.pathsize; + npc.pathtarget.x += npc.whichblockx * block_spacing; + npc.pathtarget.z += npc.whichblocky * block_spacing; + npc.oldplayercoords = npc.playercoords = npc.pathtarget; + + npc.skeleton.free = false; + npc.speed = 1; + npc.health = npc.maxhealth = 100; + npc.playerrotation = 0; + npc.playerrotation2 = 0; + npc.lastdistancevictim = 200000; + npc.whichgun = nogun; + npc.killtarget = (game->enemystate == 2 + && (npc.type == zombietype || npc.type == eviltype)) ? 1 : -1; +} + void Game::Tick() { if (person[1].health <= 0 || person[0].health <= 0 || killedinnocent) @@ -568,6 +648,7 @@ void Game::Tick() initGame(this); } + spawnNpc(this); sprites.DoStuff(); decals.DoStuff(); @@ -593,215 +674,6 @@ void Game::Tick() camera.oldposition = camera.position; camera.targetoffset = {0.0f, 0.0f, -5.0f}; - // Spawn people - int cyclenum = 0; - int blockspawnx = 0, blockspawny = 0; - do { - auto block = person[0].playercoords / block_spacing; - blockspawnx = block.x + 0.5f + randInt(-1, 1); - blockspawny = block.z + 0.5f + randInt(-1, 1); - - auto& people = citypeoplenum[blockspawnx][blockspawny]; - if (people < max_people_block) - break; - } while (++cyclenum < 10); - - spawndelay -= multiplier; - if(cyclenum<10){ - - if (spawndelay < 0 && numpeople < max_people) { - if (type == zombie_type) - person[numpeople].type = zombietype; - else if (randUint(evilprobability)) - person[numpeople].type = civiliantype; - else - person[numpeople].type = eviltype; - - if(person[numpeople].type!=civiliantype&&blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky){ - while((citypeoplenum[blockspawnx][blockspawny]>=max_people_block&&cyclenum<10)||blockspawnx==0||(blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky)){ - blockspawnx = (person[0].playercoords.x + block_spacing / 2) / block_spacing + randInt(-1, 1); - blockspawny = (person[0].playercoords.z + block_spacing / 2) / block_spacing + randInt(-1, 1); - cyclenum++; - } - } - - person[numpeople].playerrotation=0; - person[numpeople].whichcostume = casualcostumes + randUint(numcasual); - person[numpeople].whichblockx=blockspawnx; - person[numpeople].whichblocky=blockspawny; - person[numpeople].pathnum=-1; - person[numpeople].oldpathnum=-1; - person[numpeople].oldoldpathnum=-1; - person[numpeople].oldoldoldpathnum=-1; - - while(person[numpeople].pathnum<0||person[numpeople].pathnum>=path.vertexNum||person[numpeople].pathnum==1){ - - person[numpeople].pathnum = randUint(path.vertexNum); - - } - - person[numpeople].pathtarget.x=path.vertex[person[numpeople].pathnum].x; - - person[numpeople].pathtarget.z=path.vertex[person[numpeople].pathnum].z; - - person[numpeople].pathsize = 0.98f + 0.04f * randFloat(); - - person[numpeople].pathtarget*=person[numpeople].pathsize; - - person[numpeople].pathtarget.x+=person[numpeople].whichblockx*block_spacing; - - person[numpeople].pathtarget.z+=person[numpeople].whichblocky*block_spacing; - - person[numpeople].playercoords=person[numpeople].pathtarget; - - person[numpeople].oldplayercoords=person[numpeople].playercoords; - - person[numpeople].skeleton.free=0; - - person[numpeople].targetanimation=walkanim; - - if(person[numpeople].type==zombietype)person[numpeople].targetanimation=zombiewalkanim; - - person[numpeople].speed=1; - - person[numpeople].existing=0; - - person[numpeople].speedmult = 0.8f + 0.4f * randFloat(); - - person[numpeople].health=100; - - person[numpeople].maxhealth=100; - - person[numpeople].playerrotation2=0; - - person[numpeople].lastdistancevictim=200000; - - if(numpeople==1)person[numpeople].type=viptype; - - person[numpeople].killtarget=-1; - - if(person[numpeople].type==eviltype){person[numpeople].existing=1; person[numpeople].pathsize=1.04; person[numpeople].whichgun=nogun; person[numpeople].aiming=1; person[numpeople].killtarget=-1; person[numpeople].speedmult=1+.3*difficulty;} - - if(person[numpeople].type==zombietype){person[numpeople].existing=1; person[numpeople].pathsize=1.04; person[numpeople].whichgun=nogun; person[numpeople].aiming=0; person[numpeople].killtarget=-1; person[numpeople].speedmult=0.7+.2*difficulty;} - - else {person[numpeople].whichgun=nogun; person[numpeople].aiming=0; person[numpeople].killtarget=-1;} - - if(person[numpeople].type==viptype){person[numpeople].existing=1;} - - if(enemystate==2)person[numpeople].killtarget=1; - - numpeople++; - - citypeoplenum[blockspawnx][blockspawny]++; - - spawndelay=.1; - - } - - if(spawndelay<0&&numpeople>=max_people){ - - if(cycle>=max_people)cycle=0; - - cyclenum=0; - - while(cyclenum<max_people&&(person[cycle].type==playertype||person[cycle].type==viptype||(abs(person[cycle].whichblockx-((person[0].playercoords.x+block_spacing/2)/block_spacing))<2&&abs(person[cycle].whichblocky-((person[0].playercoords.z+block_spacing/2)/block_spacing))<2))){ - - cycle++; - - cyclenum++; - - if(cycle>=max_people)cycle=0; - - } - - if(cycle<max_people&&cyclenum<max_people){ - if (type == zombie_type) - person[cycle].type = zombietype; - else if (randUint(evilprobability)) - person[cycle].type = civiliantype; - else - person[cycle].type = eviltype; - - if(person[cycle].type!=civiliantype&&blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky){ - while((citypeoplenum[blockspawnx][blockspawny]>=max_people_block&&cyclenum<10)||blockspawnx==0||(blockspawnx==person[1].whichblockx&&blockspawny==person[1].whichblocky)){ - blockspawnx = (person[0].playercoords.x + block_spacing / 2) / block_spacing + randInt(-1, 1); - blockspawny = (person[0].playercoords.z + block_spacing / 2) / block_spacing + randInt(-1, 1); - cyclenum++; - } - } - - person[cycle].playerrotation=0; - person[cycle].whichcostume = casualcostumes + randUint(numcasual); - citypeoplenum[person[cycle].whichblockx][person[cycle].whichblocky]--; - person[cycle].whichblockx=blockspawnx; - person[cycle].whichblocky=blockspawny; - person[cycle].pathnum=-1; - person[cycle].oldpathnum=-1; - person[cycle].oldoldpathnum=-1; - person[cycle].oldoldoldpathnum=-1; - - while(person[cycle].pathnum<0||person[cycle].pathnum>=path.vertexNum||person[cycle].pathnum==1){ - person[cycle].pathnum = randUint(path.vertexNum); - } - - person[cycle].pathtarget.x=path.vertex[person[cycle].pathnum].x; - - person[cycle].pathtarget.z=path.vertex[person[cycle].pathnum].z; - - person[cycle].pathsize= 0.98f + 0.04f * randFloat(); - - person[cycle].pathtarget*=person[cycle].pathsize; - - person[cycle].pathtarget.x+=person[cycle].whichblockx*block_spacing; - - person[cycle].pathtarget.z+=person[cycle].whichblocky*block_spacing; - - person[cycle].playercoords=person[cycle].pathtarget; - - person[cycle].oldplayercoords=person[cycle].playercoords; - - person[cycle].skeleton.free=0; - - person[cycle].targetanimation=walkanim; - - if(person[cycle].type==zombietype)person[cycle].targetanimation=zombiewalkanim; - - person[cycle].speed=1; - - person[cycle].existing=0; - - person[cycle].speedmult = 0.8f + 0.4f * randFloat(); - - person[cycle].health=100; - - person[cycle].maxhealth=100; - - person[cycle].playerrotation2=0; - - if(enemystate==1)person[cycle].killtarget=-1; - - if(person[cycle].type==eviltype){person[cycle].existing=1; person[cycle].pathsize=1.04; person[cycle].whichgun=nogun; person[cycle].aiming=1; person[cycle].killtarget=-1; person[cycle].speedmult=1+.3*difficulty;} - - if(person[cycle].type==zombietype){person[cycle].existing=1; person[cycle].pathsize=1.04; person[cycle].whichgun=nogun; person[cycle].aiming=0; person[cycle].killtarget=-1; person[cycle].speedmult=.7+.2*difficulty;} - - else {person[cycle].whichgun=nogun; person[cycle].aiming=0; person[cycle].killtarget=-1;} - - person[cycle].lastdistancevictim=200000; - - if(enemystate==2)person[cycle].killtarget=1; - - if(numpeople<max_people)numpeople++; - - citypeoplenum[blockspawnx][blockspawny]++; - - cycle++; - - spawndelay=.1; - - } - - }} - XYZ towards; XYZ finaltarget; XYZ blah; diff --git a/src/Person.cpp b/src/Person.cpp index 4097aa5..2007857 100644 --- a/src/Person.cpp +++ b/src/Person.cpp @@ -201,7 +201,6 @@ HitStruct Person::BulletCollideWithPlayer(int who, XYZ start, XYZ end){ } extern float camerashake; -extern int cycle; void Person::DoAnimations(int who) { if (target > 1 && !skeleton.free) { |