X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FObjects%2FWeapons.cpp;h=89ad19d536ac644174ce899d2d062d70ce82f883;hb=0aab437dc560d2afa982e61cc2547756ad7b0761;hp=31ea8c16f4f76edcb3c8bb2948183ed14cb23baa;hpb=188b251d145503cab17680a22cbabf58b24358d5;p=lugaru.git diff --git a/Source/Objects/Weapons.cpp b/Source/Objects/Weapons.cpp index 31ea8c1..89ad19d 100644 --- a/Source/Objects/Weapons.cpp +++ b/Source/Objects/Weapons.cpp @@ -1,6 +1,6 @@ /* Copyright (C) 2003, 2010 - Wolfire Games -Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file) +Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file) This file is part of Lugaru. @@ -23,8 +23,8 @@ along with Lugaru. If not, see . #include "Objects/Weapons.hpp" #include "Animation/Animation.hpp" -#include "Audio/openal_wrapper.hpp" #include "Audio/Sounds.hpp" +#include "Audio/openal_wrapper.hpp" #include "Game.hpp" #include "Level/Awards.hpp" #include "Tutorial.hpp" @@ -64,7 +64,8 @@ Texture Weapon::bloodswordtextureptr; Model Weapon::staffmodel; Texture Weapon::stafftextureptr; -Weapon::Weapon(int t, int o) : owner(o) +Weapon::Weapon(int t, int o) + : owner(o) { setType(t); bloody = 0; @@ -134,7 +135,7 @@ void Weapon::Load() staffmodel.CalculateNormals(1); } -void Weapon::DoStuff(int i) +void Weapon::doStuff(int i) { static int whichpatchx, whichpatchz, whichhit; static XYZ start, end, colpoint, normalrot, footvel, footpoint; @@ -174,8 +175,9 @@ void Weapon::DoStuff(int i) Person::players[owner]->num_weapons--; if (Person::players[owner]->num_weapons) { Person::players[owner]->weaponids[0] = Person::players[owner]->weaponids[Person::players[owner]->num_weapons]; - if (Person::players[owner]->weaponstuck == Person::players[owner]->num_weapons) + if (Person::players[owner]->weaponstuck == Person::players[owner]->num_weapons) { Person::players[owner]->weaponstuck = 0; + } } } owner = -1; @@ -194,57 +196,57 @@ void Weapon::DoStuff(int i) whichpatchx = position.x / (terrain.size / subdivision * terrain.scale); whichpatchz = position.z / (terrain.size / subdivision * terrain.scale); if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) { - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { // if there are Object::objects where the weapon is - for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { // check for collision - int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; - start = oldtippoint; - end = tippoint; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - if (Object::objects[k]->type == treetrunktype) { - Object::objects[k]->model.MakeDecal(breakdecal, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), .1, 1, Random() % 360); - normalrot = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0); - velocity = 0; - if (type == knife) - position = colpoint - normalrot * .1; - else if (type == sword) - position = colpoint - normalrot * .2; - else if (type == staff) - position = colpoint - normalrot * .2; - XYZ temppoint1, temppoint2; - float distance; - - temppoint1 = 0; - temppoint2 = normalrot; - distance = findDistance(&temppoint1, &temppoint2); - rotation2 = asin((temppoint1.y - temppoint2.y) / distance); - rotation2 *= 360 / 6.28; - temppoint1.y = 0; - temppoint2.y = 0; - rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2)); - rotation1 *= 360 / 6.28; - if (temppoint1.x > temppoint2.x) - rotation1 = 360 - rotation1; - - rotation3 = 0; - smallrotation = 90; - smallrotation2 = 0; - bigtilt = 0; - bigtilt2 = 0; - bigrotation = 0; - - emit_sound_at(knifesheathesound, position, 128.); - - bloody = 0; - - Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3); - } else { - physics = 1; - firstfree = 1; - position -= velocity * multiplier; - tippoint -= velocity * multiplier; - tipvelocity = velocity; + for (unsigned int j = 0; j < terrain.patchobjects[whichpatchx][whichpatchz].size(); j++) { // check for collision + unsigned int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + start = oldtippoint; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + if (Object::objects[k]->type == treetrunktype) { + Object::objects[k]->model.MakeDecal(breakdecal, DoRotation(colpoint - Object::objects[k]->position, 0, -Object::objects[k]->yaw, 0), .1, 1, Random() % 360); + normalrot = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0); + velocity = 0; + if (type == knife) { + position = colpoint - normalrot * .1; + } else if (type == sword) { + position = colpoint - normalrot * .2; + } else if (type == staff) { + position = colpoint - normalrot * .2; + } + XYZ temppoint1, temppoint2; + float distance; + + temppoint1 = 0; + temppoint2 = normalrot; + distance = findDistance(&temppoint1, &temppoint2); + rotation2 = asin((temppoint1.y - temppoint2.y) / distance); + rotation2 *= 360 / 6.28; + temppoint1.y = 0; + temppoint2.y = 0; + rotation1 = acos((temppoint1.z - temppoint2.z) / findDistance(&temppoint1, &temppoint2)); + rotation1 *= 360 / 6.28; + if (temppoint1.x > temppoint2.x) { + rotation1 = 360 - rotation1; } + + rotation3 = 0; + smallrotation = 90; + smallrotation2 = 0; + bigtilt = 0; + bigtilt2 = 0; + bigrotation = 0; + + emit_sound_at(knifesheathesound, position, 128.); + + bloody = 0; + + Sprite::MakeSprite(cloudimpactsprite, position, velocity, 1, 1, 1, .8, .3); + } else { + physics = 1; + firstfree = 1; + position -= velocity * multiplier; + tippoint -= velocity * multiplier; + tipvelocity = velocity; } } } @@ -255,11 +257,11 @@ void Weapon::DoStuff(int i) footvel = 0; footpoint = DoRotation((Person::players[j]->jointPos(abdomen) + Person::players[j]->jointPos(neck)) / 2, 0, Person::players[j]->yaw, 0) * Person::players[j]->scale + Person::players[j]->coords; if (owner == -1 && distsqflat(&position, &Person::players[j]->coords) < 1.5 && - distsq(&position, &Person::players[j]->coords) < 4 && Person::players[j]->weaponstuck == -1 && - !Person::players[j]->skeleton.free && (int(j) != oldowner)) { + distsq(&position, &Person::players[j]->coords) < 4 && Person::players[j]->weaponstuck == -1 && + !Person::players[j]->skeleton.free && (int(j) != oldowner)) { if ((Person::players[j]->aitype != attacktypecutoff || abs(Random() % 6) == 0 || (Person::players[j]->animTarget != backhandspringanim && Person::players[j]->animTarget != rollanim && Person::players[j]->animTarget != flipanim && Random() % 2 == 0)) && !missed) { - if ( (Person::players[j]->creature == wolftype && Random() % 3 != 0 && Person::players[j]->weaponactive == -1 && (Person::players[j]->isIdle() || Person::players[j]->isRun() || Person::players[j]->animTarget == walkanim)) || - (Person::players[j]->creature == rabbittype && Random() % 2 == 0 && Person::players[j]->aitype == attacktypecutoff && Person::players[j]->weaponactive == -1)) { + if ((Person::players[j]->creature == wolftype && Random() % 3 != 0 && Person::players[j]->weaponactive == -1 && (Person::players[j]->isIdle() || Person::players[j]->isRun() || Person::players[j]->animTarget == walkanim)) || + (Person::players[j]->creature == rabbittype && Random() % 2 == 0 && Person::players[j]->aitype == attacktypecutoff && Person::players[j]->weaponactive == -1)) { emit_sound_at(knifedrawsound, Person::players[j]->coords, 128.); Person::players[j]->animTarget = removeknifeanim; @@ -269,14 +271,16 @@ void Weapon::DoStuff(int i) Person::players[j]->aitype = attacktypecutoff; } else { - if (j != 0) + if (j != 0) { numthrowkill++; + } Person::players[j]->num_weapons++; Person::players[j]->weaponstuck = Person::players[j]->num_weapons - 1; - if (normaldotproduct(Person::players[j]->facing, velocity) > 0) + if (normaldotproduct(Person::players[j]->facing, velocity) > 0) { Person::players[j]->weaponstuckwhere = 1; - else + } else { Person::players[j]->weaponstuckwhere = 0; + } Person::players[j]->weaponids[Person::players[j]->num_weapons - 1] = i; @@ -285,20 +289,25 @@ void Weapon::DoStuff(int i) Person::players[j]->jointVel(neck) += velocity * 2; Person::players[j]->jointVel(rightshoulder) += velocity * 2; Person::players[j]->jointVel(leftshoulder) += velocity * 2; - if (bloodtoggle && !Tutorial::active) + if (bloodtoggle && !Tutorial::active) { Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 0, 0, .8, .3); - if (Tutorial::active) + } + if (Tutorial::active) { Sprite::MakeSprite(cloudimpactsprite, footpoint, footvel, 1, 1, 1, .8, .3); + } footvel = tippoint - position; Normalise(&footvel); - if (bloodtoggle && !Tutorial::active) + if (bloodtoggle && !Tutorial::active) { Sprite::MakeSprite(bloodflamesprite, footpoint, footvel * -1, 1, 0, 0, .6, 1); + } if (!Tutorial::active) { - if (Person::players[j]->weaponstuckwhere == 0) + if (Person::players[j]->weaponstuckwhere == 0) { Person::players[j]->DoBloodBig(2, 205); - if (Person::players[j]->weaponstuckwhere == 1) + } + if (Person::players[j]->weaponstuckwhere == 1) { Person::players[j]->DoBloodBig(2, 200); + } Person::players[j]->damage += 200 / Person::players[j]->armorhigh; Person::players[j]->deathbleeding = 1; Person::players[j]->bloodloss += (200 + abs((float)(Random() % 40)) - 20) / Person::players[j]->armorhigh; @@ -309,10 +318,11 @@ void Weapon::DoStuff(int i) emit_sound_at(fleshstabsound, position, 128.); - if (Animation::animations[Person::players[0]->animTarget].height == highheight) + if (Animation::animations[Person::players[0]->animTarget].height == highheight) { award_bonus(0, ninja); - else + } else { award_bonus(0, Bullseyebonus); + } } } else { missed = 1; @@ -365,14 +375,17 @@ void Weapon::DoStuff(int i) XYZ terrainlight; terrainlight = terrain.getLighting(position.x, position.z); if (environment == snowyenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7); + } } else if (environment == grassyenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5); + } } else if (environment == desertenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7); + } } bloody = 0; @@ -405,10 +418,10 @@ void Weapon::DoStuff(int i) bigtilt = 0; bigtilt2 = 0; bigrotation = 0; - if (temppoint1.x > temppoint2.x) + if (temppoint1.x > temppoint2.x) { rotation1 = 360 - rotation1; + } } - } //Sword physics @@ -439,330 +452,354 @@ void Weapon::DoStuff(int i) position = newpoint1; tippoint = newpoint2; - //Object collisions whichpatchx = (position.x) / (terrain.size / subdivision * terrain.scale); whichpatchz = (position.z) / (terrain.size / subdivision * terrain.scale); - if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) - if (terrain.patchobjectnum[whichpatchx][whichpatchz]) { - for (int j = 0; j < terrain.patchobjectnum[whichpatchx][whichpatchz]; j++) { - int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + if (whichpatchx > 0 && whichpatchz > 0 && whichpatchx < subdivision && whichpatchz < subdivision) { + for (unsigned int j = 0; j < terrain.patchobjects[whichpatchx][whichpatchz].size(); j++) { + unsigned int k = terrain.patchobjects[whichpatchx][whichpatchz][j]; + + if (firstfree) { + if (type == staff) { + start = tippoint - (position - tippoint) / 5; + end = position + (position - tippoint) / 30; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + XYZ diff; + diff = (colpoint - position); + Normalise(&diff); + hitsomething = 1; - if (firstfree) { - if (type == staff) { - start = tippoint - (position - tippoint) / 5; - end = position + (position - tippoint) / 30; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - XYZ diff; - diff = (colpoint - position); - Normalise(&diff); - hitsomething = 1; - - tippoint += (colpoint - position) + diff * .05; - position = colpoint + diff * .05; - oldtippoint = tippoint; - oldposition = tippoint; - } - } else { - start = position - (tippoint - position) / 5; - end = tippoint + (tippoint - position) / 30; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - XYZ diff; - diff = (colpoint - tippoint); - Normalise(&diff); - hitsomething = 1; - - position += (colpoint - tippoint) + diff * .05; - tippoint = colpoint + diff * .05; - oldposition = position; - oldtippoint = tippoint; - } + tippoint += (colpoint - position) + diff * .05; + position = colpoint + diff * .05; + oldtippoint = tippoint; + oldposition = tippoint; + } + } else { + start = position - (tippoint - position) / 5; + end = tippoint + (tippoint - position) / 30; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + XYZ diff; + diff = (colpoint - tippoint); + Normalise(&diff); + hitsomething = 1; + + position += (colpoint - tippoint) + diff * .05; + tippoint = colpoint + diff * .05; + oldposition = position; + oldtippoint = tippoint; } } + } - start = oldposition; - end = position; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - position = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&velocity, &terrainnormal); - position += terrainnormal * .002; - - bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(velocity, terrainnormal)); - velocity -= bounceness; - if (1 - friction * frictionness > 0) - velocity *= 1 - friction * frictionness; - else - velocity = 0; - velocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); + start = oldposition; + end = position; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + position = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&velocity, &terrainnormal); + position += terrainnormal * .002; + + bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) { + bounceness = 0; + } + frictionness = abs(normaldotproduct(velocity, terrainnormal)); + velocity -= bounceness; + if (1 - friction * frictionness > 0) { + velocity *= 1 - friction * frictionness; + } else { + velocity = 0; + } + velocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) { + whichsound = footstepsound3 + abs(Random() % 2); + } else { + whichsound = clank1sound + abs(Random() % 4); } + emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); } - start = oldtippoint; - end = tippoint; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - tippoint = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&tipvelocity, &terrainnormal); - tippoint += terrainnormal * .002; - - bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); - tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) - tipvelocity *= 1 - friction * frictionness; - else - tipvelocity = 0; - tipvelocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); + } + start = oldtippoint; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + tippoint = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&tipvelocity, &terrainnormal); + tippoint += terrainnormal * .002; + + bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) { + bounceness = 0; + } + frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); + tipvelocity -= bounceness; + if (1 - friction * frictionness > 0) { + tipvelocity *= 1 - friction * frictionness; + } else { + tipvelocity = 0; + } + tipvelocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) { + whichsound = footstepsound3 + abs(Random() % 2); + } else { + whichsound = clank1sound + abs(Random() % 4); } + emit_sound_at(whichsound, position, 128 * findLengthfast(&bounceness)); } + } - if ((Object::objects[k]->type != boxtype && Object::objects[k]->type != platformtype && Object::objects[k]->type != walltype && Object::objects[k]->type != weirdtype) || Object::objects[k]->pitch != 0) - for (int m = 0; m < 2; m++) { - mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40; - oldmid2 = mid; - oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40; - - start = oldmid; - end = mid; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - mid = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&velocity, &terrainnormal); - - bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(velocity, terrainnormal)); - velocity -= bounceness; - if (1 - friction * frictionness > 0) - velocity *= 1 - friction * frictionness; - else - velocity = 0; - velocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); - } - position += (mid - oldmid2) * (20 / (1 + (float)m * 10)); - } + if ((Object::objects[k]->type != boxtype && Object::objects[k]->type != platformtype && Object::objects[k]->type != walltype && Object::objects[k]->type != weirdtype) || Object::objects[k]->pitch != 0) { + for (int m = 0; m < 2; m++) { + mid = (position * (21 + (float)m * 10) + tippoint * (19 - (float)m * 10)) / 40; + oldmid2 = mid; + oldmid = (oldposition * (21 + (float)m * 10) + oldtippoint * (19 - (float)m * 10)) / 40; - mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40; - oldmid2 = mid; - oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40; - - start = oldmid; - end = mid; - whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); - if (whichhit != -1) { - hitsomething = 1; - mid = colpoint; - terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; - ReflectVector(&tipvelocity, &terrainnormal); - - bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) - bounceness = 0; - frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); - tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) - tipvelocity *= 1 - friction * frictionness; - else - tipvelocity = 0; - tipvelocity += bounceness * elasticity; - - if (findLengthfast(&bounceness) > 1) { - int whichsound; - if (type == staff) - whichsound = footstepsound3 + abs(Random() % 2); - else - whichsound = clank1sound + abs(Random() % 4); - emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); + start = oldmid; + end = mid; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + mid = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&velocity, &terrainnormal); + + bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) { + bounceness = 0; + } + frictionness = abs(normaldotproduct(velocity, terrainnormal)); + velocity -= bounceness; + if (1 - friction * frictionness > 0) { + velocity *= 1 - friction * frictionness; + } else { + velocity = 0; + } + velocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) { + whichsound = footstepsound3 + abs(Random() % 2); + } else { + whichsound = clank1sound + abs(Random() % 4); } - tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10)); + emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); } + position += (mid - oldmid2) * (20 / (1 + (float)m * 10)); } - else { - start = position; - end = tippoint; + + mid = (position * (19 - (float)m * 10) + tippoint * (21 + (float)m * 10)) / 40; + oldmid2 = mid; + oldmid = (oldposition * (19 - (float)m * 10) + oldtippoint * (21 + (float)m * 10)) / 40; + + start = oldmid; + end = mid; whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); if (whichhit != -1) { hitsomething = 1; - closestdistance = -1; - closestswordpoint = colpoint; //(position+tippoint)/2; - point[0] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[0]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - point[1] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[1]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - point[2] = DoRotation(Object::objects[k]->model.vertex[Object::objects[k]->model.Triangles[whichhit].vertex[2]], 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; - if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; - } + mid = colpoint; + terrainnormal = DoRotation(Object::objects[k]->model.Triangles[whichhit].facenormal, 0, Object::objects[k]->yaw, 0) * -1; + ReflectVector(&tipvelocity, &terrainnormal); + + bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) { + bounceness = 0; } - if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; - } + frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); + tipvelocity -= bounceness; + if (1 - friction * frictionness > 0) { + tipvelocity *= 1 - friction * frictionness; + } else { + tipvelocity = 0; } - if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint )) { - if (distance < closestdistance || closestdistance == -1) { - closestpoint = colpoint; - closestdistance = distance; + tipvelocity += bounceness * elasticity; + + if (findLengthfast(&bounceness) > 1) { + int whichsound; + if (type == staff) { + whichsound = footstepsound3 + abs(Random() % 2); + } else { + whichsound = clank1sound + abs(Random() % 4); } + emit_sound_at(whichsound, mid, 128 * findLengthfast(&bounceness)); } - if (closestdistance != -1 && isnormal(closestdistance)) { - if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint )) { - closestswordpoint = colpoint; - velocity += (closestpoint - closestswordpoint); - tipvelocity += (closestpoint - closestswordpoint); - position += (closestpoint - closestswordpoint); - tippoint += (closestpoint - closestswordpoint); - } + tippoint += (mid - oldmid2) * (20 / (1 + (float)m * 10)); + } + } + } else { + start = position; + end = tippoint; + whichhit = Object::objects[k]->model.LineCheck(&start, &end, &colpoint, &Object::objects[k]->position, &Object::objects[k]->yaw); + if (whichhit != -1) { + hitsomething = 1; + closestdistance = -1; + closestswordpoint = colpoint; + point[0] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 0), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + point[1] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 1), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + point[2] = DoRotation(Object::objects[k]->model.getTriangleVertex(whichhit, 2), 0, Object::objects[k]->yaw, 0) + Object::objects[k]->position; + if (DistancePointLine(&closestswordpoint, &point[0], &point[1], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; + } + } + if (DistancePointLine(&closestswordpoint, &point[1], &point[2], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; + } + } + if (DistancePointLine(&closestswordpoint, &point[2], &point[0], &distance, &colpoint)) { + if (distance < closestdistance || closestdistance == -1) { + closestpoint = colpoint; + closestdistance = distance; + } + } + if (closestdistance != -1 && isnormal(closestdistance)) { + if (DistancePointLine(&closestpoint, &position, &tippoint, &distance, &colpoint)) { + closestswordpoint = colpoint; + velocity += (closestpoint - closestswordpoint); + tipvelocity += (closestpoint - closestswordpoint); + position += (closestpoint - closestswordpoint); + tippoint += (closestpoint - closestswordpoint); } } } } } + } //Terrain collisions whichhit = terrain.lineTerrain(oldposition, position, &colpoint); if (whichhit != -1 || position.y < terrain.getHeight(position.x, position.z)) { hitsomething = 1; - if (whichhit != -1) + if (whichhit != -1) { position = colpoint * terrain.scale; - else + } else { position.y = terrain.getHeight(position.x, position.z); + } terrainnormal = terrain.getNormal(position.x, position.z); ReflectVector(&velocity, &terrainnormal); position += terrainnormal * .002; bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) { bounceness = 0; + } frictionness = abs(normaldotproduct(velocity, terrainnormal)); velocity -= bounceness; - if (1 - friction * frictionness > 0) + if (1 - friction * frictionness > 0) { velocity *= 1 - friction * frictionness; - else + } else { velocity = 0; - if (terrain.getOpacity(position.x, position.z) < .2) + } + if (terrain.getOpacity(position.x, position.z) < .2) { velocity += bounceness * elasticity * .3; - else + } else { velocity += bounceness * elasticity; + } if (findLengthfast(&bounceness) > 1) { int whichsound; if (terrain.getOpacity(position.x, position.z) > .2) { - if (type == staff) + if (type == staff) { whichsound = footstepsound3 + abs(Random() % 2); - else + } else { whichsound = clank1sound + abs(Random() % 4); + } } else { whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, position, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 ? 128. : 32.)); if (terrain.getOpacity(position.x, position.z) < .2) { XYZ terrainlight; terrainlight = terrain.getLighting(position.x, position.z); if (environment == snowyenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7); + } } else if (environment == grassyenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5); + } } else if (environment == desertenvironment) { - if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&position, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, position, velocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7); + } } } } } whichhit = terrain.lineTerrain(oldtippoint, tippoint, &colpoint); if (whichhit != -1 || tippoint.y < terrain.getHeight(tippoint.x, tippoint.z)) { - if (whichhit != -1) + if (whichhit != -1) { tippoint = colpoint * terrain.scale; - else + } else { tippoint.y = terrain.getHeight(tippoint.x, tippoint.z); + } terrainnormal = terrain.getNormal(tippoint.x, tippoint.z); ReflectVector(&tipvelocity, &terrainnormal); tippoint += terrainnormal * .002; bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) { bounceness = 0; + } frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) + if (1 - friction * frictionness > 0) { tipvelocity *= 1 - friction * frictionness; - else + } else { tipvelocity = 0; - if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) + } + if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) { tipvelocity += bounceness * elasticity * .3; - else + } else { tipvelocity += bounceness * elasticity; + } if (findLengthfast(&bounceness) > 1) { int whichsound; if (terrain.getOpacity(tippoint.x, tippoint.z) > .2) { - if (type == staff) + if (type == staff) { whichsound = footstepsound3 + abs(Random() % 2); - else + } else { whichsound = clank1sound + abs(Random() % 4); + } } else { whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, tippoint, - findLengthfast(&bounceness) - * (terrain.getOpacity(tippoint.x, tippoint.z) > .2 ? 128. : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(tippoint.x, tippoint.z) > .2 ? 128. : 32.)); if (terrain.getOpacity(tippoint.x, tippoint.z) < .2) { XYZ terrainlight; terrainlight = terrain.getLighting(tippoint.x, tippoint.z); if (environment == snowyenvironment) { - if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x, terrainlight.y, terrainlight.z, .5, .7); + } } else if (environment == grassyenvironment) { - if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 90 / 255, terrainlight.y * 70 / 255, terrainlight.z * 8 / 255, .5, .5); + } } else if (environment == desertenvironment) { - if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) + if (distsq(&tippoint, &viewer) < viewdistance * viewdistance / 4) { Sprite::MakeSprite(cloudsprite, tippoint, tipvelocity, terrainlight.x * 190 / 255, terrainlight.y * 170 / 255, terrainlight.z * 108 / 255, .5, .7); + } } } } @@ -781,34 +818,38 @@ void Weapon::DoStuff(int i) ReflectVector(&velocity, &terrainnormal); //mid+=terrainnormal*.002; bounceness = terrainnormal * findLength(&velocity) * (abs(normaldotproduct(velocity, terrainnormal))); - if (findLengthfast(&velocity) < findLengthfast(&bounceness)) + if (findLengthfast(&velocity) < findLengthfast(&bounceness)) { bounceness = 0; + } frictionness = abs(normaldotproduct(velocity, terrainnormal)); velocity -= bounceness; - if (1 - friction * frictionness > 0) + if (1 - friction * frictionness > 0) { velocity *= 1 - friction * frictionness; - else + } else { velocity = 0; - if (terrain.getOpacity(mid.x, mid.z) < .2) + } + if (terrain.getOpacity(mid.x, mid.z) < .2) { velocity += bounceness * elasticity * .3; - else + } else { velocity += bounceness * elasticity; + } if (findLengthfast(&bounceness) > 1) { int whichsound; if (terrain.getOpacity(mid.x, mid.z) > .2) { - if (type == staff) + if (type == staff) { whichsound = footstepsound3 + abs(Random() % 2); - if (type != staff) + } + if (type != staff) { whichsound = clank1sound + abs(Random() % 4); + } } else { whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, mid, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 - ? 128. - : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 + ? 128. + : 32.)); } position += (mid - oldmid) * 20; } @@ -825,34 +866,38 @@ void Weapon::DoStuff(int i) ReflectVector(&tipvelocity, &terrainnormal); //mid+=terrainnormal*.002; bounceness = terrainnormal * findLength(&tipvelocity) * (abs(normaldotproduct(tipvelocity, terrainnormal))); - if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) + if (findLengthfast(&tipvelocity) < findLengthfast(&bounceness)) { bounceness = 0; + } frictionness = abs(normaldotproduct(tipvelocity, terrainnormal)); tipvelocity -= bounceness; - if (1 - friction * frictionness > 0) + if (1 - friction * frictionness > 0) { tipvelocity *= 1 - friction * frictionness; - else + } else { tipvelocity = 0; - if (terrain.getOpacity(mid.x, mid.z) < .2) + } + if (terrain.getOpacity(mid.x, mid.z) < .2) { tipvelocity += bounceness * elasticity * .3; - else + } else { tipvelocity += bounceness * elasticity; + } if (findLengthfast(&bounceness) > 1) { int whichsound; if (terrain.getOpacity(mid.x, mid.z) > .2) { - if (type == staff) + if (type == staff) { whichsound = footstepsound3 + abs(Random() % 2); - if (type != staff) + } + if (type != staff) { whichsound = clank1sound + abs(Random() % 4); + } } else { whichsound = footstepsound + abs(Random() % 2); } emit_sound_at(whichsound, mid, - findLengthfast(&bounceness) - * (terrain.getOpacity(position.x, position.z) > .2 - ? 128. - : 32.)); + findLengthfast(&bounceness) * (terrain.getOpacity(position.x, position.z) > .2 + ? 128. + : 32.)); } tippoint += (mid - oldmid) * 20; } @@ -879,8 +924,9 @@ void Weapon::DoStuff(int i) bigtilt = 0; bigtilt2 = 0; bigrotation = 0; - if (temppoint1.x > temppoint2.x) + if (temppoint1.x > temppoint2.x) { rotation1 = 360 - rotation1; + } //Stop moving if (findLengthfast(&velocity) < .3 && findLengthfast(&tipvelocity) < .3 && hitsomething) { @@ -898,10 +944,12 @@ void Weapon::DoStuff(int i) if (blooddrip && bloody) { blooddripdelay -= blooddrip * multiplier / 2; blooddrip -= multiplier; - if (blooddrip < 0) + if (blooddrip < 0) { blooddrip = 0; - if (blooddrip > 5) + } + if (blooddrip > 5) { blooddrip = 5; + } if (blooddripdelay < 0 && bloodtoggle) { blooddripdelay = 1; XYZ bloodvel; @@ -957,28 +1005,31 @@ void Weapons::DoStuff() //Move int i = 0; for (std::vector::iterator weapon = begin(); weapon != end(); ++weapon) { - weapon->DoStuff(i++); + weapon->doStuff(i++); } } -void Weapon::Draw() +void Weapon::draw() { static XYZ terrainlight; static GLfloat M[16]; if ((frustum.SphereInFrustum(position.x, position.y, position.z, 1) && - distsq(&viewer, &position) < viewdistance * viewdistance)) { + distsq(&viewer, &position) < viewdistance * viewdistance)) { bool draw = false; if (owner == -1) { draw = true; - if (velocity.x && !physics) + if (velocity.x && !physics) { drawhowmany = 10; - else + } else { drawhowmany = 1; + } } else { - if (Person::players[owner]->occluded < 25) - if ((frustum.SphereInFrustum(Person::players[owner]->coords.x, Person::players[owner]->coords.y + Person::players[owner]->scale * 3, Person::players[owner]->coords.z, Person::players[owner]->scale * 8) && distsq(&viewer, &Person::players[owner]->coords) < viewdistance * viewdistance) || Person::players[owner]->skeleton.free == 3) + if (Person::players[owner]->occluded < 25) { + if ((frustum.SphereInFrustum(Person::players[owner]->coords.x, Person::players[owner]->coords.y + Person::players[owner]->scale * 3, Person::players[owner]->coords.z, Person::players[owner]->scale * 8) && distsq(&viewer, &Person::players[owner]->coords) < viewdistance * viewdistance) || Person::players[owner]->skeleton.free == 3) { draw = true; + } + } if ( (Person::players[owner]->animTarget == knifeslashstartanim || Person::players[owner]->animTarget == swordsneakattackanim || @@ -995,8 +1046,7 @@ void Weapon::Draw() Person::players[owner]->animTarget == swordgroundstabanim || Person::players[owner]->animTarget == knifethrowanim) && Person::players[owner]->animTarget == lastdrawnanim && - !Person::players[owner]->skeleton.free - ) { + !Person::players[owner]->skeleton.free) { drawhowmany = 10; } else { drawhowmany = 1; @@ -1021,10 +1071,11 @@ void Weapon::Draw() glMatrixMode(GL_MODELVIEW); glPushMatrix(); glColor4f(terrainlight.x, terrainlight.y, terrainlight.z, j / drawhowmany); - if (owner == -1) + if (owner == -1) { glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany)); - else + } else { glTranslatef(position.x * (((float)(j)) / drawhowmany) + lastdrawnposition.x * (1 - ((float)(j)) / drawhowmany), position.y * (((float)(j)) / drawhowmany) - .02 + lastdrawnposition.y * (1 - ((float)(j)) / drawhowmany), position.z * (((float)(j)) / drawhowmany) + lastdrawnposition.z * (1 - ((float)(j)) / drawhowmany)); + } glRotatef(bigrotation * (((float)(j)) / drawhowmany) + lastdrawnbigrotation * (1 - ((float)(j)) / drawhowmany), 0, 1, 0); glRotatef(bigtilt2 * (((float)(j)) / drawhowmany) + lastdrawnbigtilt2 * (1 - ((float)(j)) / drawhowmany), 1, 0, 0); glRotatef(bigtilt * (((float)(j)) / drawhowmany) + lastdrawnbigtilt * (1 - ((float)(j)) / drawhowmany), 0, 0, 1); @@ -1045,29 +1096,35 @@ void Weapon::Draw() glEnable(GL_LIGHTING); switch (type) { - case knife: - if (!bloody || !bloodtoggle) - throwingknifemodel.drawdifftex(knifetextureptr); - if (bloodtoggle) { - if (bloody == 1) - throwingknifemodel.drawdifftex(lightbloodknifetextureptr); - if (bloody == 2) - throwingknifemodel.drawdifftex(bloodknifetextureptr); - } - break; - case sword: - if (!bloody || !bloodtoggle) - swordmodel.drawdifftex(swordtextureptr); - if (bloodtoggle) { - if (bloody == 1) - swordmodel.drawdifftex(lightbloodswordtextureptr); - if (bloody == 2) - swordmodel.drawdifftex(bloodswordtextureptr); - } - break; - case staff: - staffmodel.drawdifftex(stafftextureptr); - break; + case knife: + if (!bloody || !bloodtoggle) { + throwingknifemodel.drawdifftex(knifetextureptr); + } + if (bloodtoggle) { + if (bloody == 1) { + throwingknifemodel.drawdifftex(lightbloodknifetextureptr); + } + if (bloody == 2) { + throwingknifemodel.drawdifftex(bloodknifetextureptr); + } + } + break; + case sword: + if (!bloody || !bloodtoggle) { + swordmodel.drawdifftex(swordtextureptr); + } + if (bloodtoggle) { + if (bloody == 1) { + swordmodel.drawdifftex(lightbloodswordtextureptr); + } + if (bloody == 2) { + swordmodel.drawdifftex(bloodswordtextureptr); + } + } + break; + case staff: + staffmodel.drawdifftex(stafftextureptr); + break; } glPopMatrix(); @@ -1083,8 +1140,9 @@ void Weapon::Draw() lastdrawnbigtilt2 = bigtilt2; lastdrawnsmallrotation = smallrotation; lastdrawnsmallrotation2 = smallrotation2; - if (owner != -1) + if (owner != -1) { lastdrawnanim = Person::players[owner]->animCurrent; + } } if (owner != -1) { glMatrixMode(GL_MODELVIEW); @@ -1140,7 +1198,7 @@ int Weapons::Draw() glDepthMask(1); for (std::vector::iterator weapon = begin(); weapon != end(); ++weapon) { - weapon->Draw(); + weapon->draw(); } return 0; }