- LOGFUNC;
-
- LOG(std::string("Loading level...") + name);
-
- if (!gameon)
- visibleloading = 1;
- if (stealthloading)
- visibleloading = 0;
- if (!stillloading)
- loadtime = 0;
- gamestarted = 1;
-
- numenvsounds = 0;
-
- if (tutoriallevel != -1)
- tutoriallevel = 0;
- else
- tutoriallevel = 1;
-
- if (tutoriallevel == 1)
- tutorialstage = 0;
- if (tutorialstage == 0) {
- tutorialstagetime = 0;
- tutorialmaxtime = 1;
- }
- loadingstuff = 1;
- pause_sound(whooshsound);
- pause_sound(stream_firesound);
-
- // Change the map filename into something that is os specific
- buf = (char*) alloca(strlen(pfx) + strlen(name) + 1);
- sprintf(buf, "%s%s", pfx, name);
- const char *FixedFN = ConvertFileName(buf);
-
- int mapvers;
- FILE *tfile;
- //~ char* buff=getcwd(NULL,0);
- //~ cout << buff << " " << FixedFN << endl;
- //~ free(buff);
- tfile = fopen( FixedFN, "rb" );
- if (tfile) {
- pause_sound(stream_firesound);
- scoreadded = 0;
- windialogue = false;
- hostiletime = 0;
- won = 0;
-
- animation[bounceidleanim].Load((char *)"Idle", middleheight, neutral);
-
- numdialogues = 0;
-
- for (int i = 0; i < 20; i++)
- dialoguegonethrough[i] = 0;
-
- indialogue = -1;
- cameramode = 0;
-
- damagedealt = 0;
- damagetaken = 0;
-
- if (accountactive)
- difficulty = accountactive->getDifficulty();
-
- numhotspots = 0;
- currenthotspot = -1;
- bonustime = 1;
-
- skyboxtexture = 1;
- skyboxr = 1;
- skyboxg = 1;
- skyboxb = 1;
-
- freeze = 0;
- winfreeze = 0;
-
- for (int i = 0; i < 100; i++)
- bonusnum[i] = 0;
-
- numfalls = 0;
- numflipfail = 0;
- numseen = 0;
- numstaffattack = 0;
- numswordattack = 0;
- numknifeattack = 0;
- numunarmedattack = 0;
- numescaped = 0;
- numflipped = 0;
- numwallflipped = 0;
- numthrowkill = 0;
- numafterkill = 0;
- numreversals = 0;
- numattacks = 0;
- maxalarmed = 0;
- numresponded = 0;
-
- bonustotal = startbonustotal;
- bonus = 0;
- gameon = 1;
- changedelay = 0;
- if (console) {
- emit_sound_np(consolesuccesssound);
- freeze = 0;
- console = false;
- }
-
- if (!stealthloading) {
- terrain.numdecals = 0;
- Sprite::deleteSprites();
- for (int i = 0; i < objects.numobjects; i++)
- objects.model[i].numdecals = 0;
-
- int j = objects.numobjects;
- for (int i = 0; i < j; i++) {
- objects.DeleteObject(0);
- if (visibleloading)
- LoadingScreen();
- }
-
- for (int i = 0; i < subdivision; i++)
- for (int j = 0; j < subdivision; j++)
- terrain.patchobjectnum[i][j] = 0;
- if (visibleloading)
- LoadingScreen();
- }
-
- weapons.clear();
-
- funpackf(tfile, "Bi", &mapvers);
- if (mapvers >= 15)
- funpackf(tfile, "Bi", &indemo);
- else
- indemo = 0;
- if (mapvers >= 5)
- funpackf(tfile, "Bi", &maptype);
- else
- maptype = mapkilleveryone;
- if (mapvers >= 6)
- funpackf(tfile, "Bi", &hostile);
- else
- hostile = 1;
- if (mapvers >= 4)
- funpackf(tfile, "Bf Bf", &viewdistance, &fadestart);
- else {
- viewdistance = 100;
- fadestart = .6;
- }
- if (mapvers >= 2)
- funpackf(tfile, "Bb Bf Bf Bf", &skyboxtexture, &skyboxr, &skyboxg, &skyboxb);
- else {
- skyboxtexture = 1;
- skyboxr = 1;
- skyboxg = 1;
- skyboxb = 1;
- }
- if (mapvers >= 10)
- funpackf(tfile, "Bf Bf Bf", &skyboxlightr, &skyboxlightg, &skyboxlightb);
- else {
- skyboxlightr = skyboxr;
- skyboxlightg = skyboxg;
- skyboxlightb = skyboxb;
- }
- if (!stealthloading)
- funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &player[0].coords.x, &player[0].coords.y, &player[0].coords.z, &player[0].yaw, &player[0].targetyaw, &player[0].num_weapons);
- if (stealthloading)
- funpackf(tfile, "Bf Bf Bf Bf Bf Bi", &lamefloat, &lamefloat, &lamefloat, &lamefloat, &lamefloat, &player[0].num_weapons);
- player[0].originalcoords = player[0].coords;
- if (player[0].num_weapons > 0 && player[0].num_weapons < 5)
- for (int j = 0; j < player[0].num_weapons; j++) {
- player[0].weaponids[j] = weapons.size();
- int type;
- funpackf(tfile, "Bi", &type);
- weapons.push_back(Weapon(type, 0));
- }
-
- if (visibleloading)
- LoadingScreen();
-
- funpackf(tfile, "Bf Bf Bf", &player[0].armorhead, &player[0].armorhigh, &player[0].armorlow);
- funpackf(tfile, "Bf Bf Bf", &player[0].protectionhead, &player[0].protectionhigh, &player[0].protectionlow);
- funpackf(tfile, "Bf Bf Bf", &player[0].metalhead, &player[0].metalhigh, &player[0].metallow);
- funpackf(tfile, "Bf Bf", &player[0].power, &player[0].speedmult);
-
- funpackf(tfile, "Bi", &player[0].numclothes);
-
- if (mapvers >= 9)
- funpackf(tfile, "Bi Bi", &player[0].whichskin, &player[0].creature);
- else {
- player[0].whichskin = 0;
- player[0].creature = rabbittype;
- }
-
- player[0].lastattack = -1;
- player[0].lastattack2 = -1;
- player[0].lastattack3 = -1;
-
- //dialogues
- if (mapvers >= 8) {
- funpackf(tfile, "Bi", &numdialogues);
- for (int k = 0; k < numdialogues; k++) {
- funpackf(tfile, "Bi", &numdialogueboxes[k]);
- funpackf(tfile, "Bi", &dialoguetype[k]);
- for (int l = 0; l < 10; l++) {
- funpackf(tfile, "Bf Bf Bf", &participantlocation[k][l].x, &participantlocation[k][l].y, &participantlocation[k][l].z);
- funpackf(tfile, "Bf", &participantyaw[k][l]);
- }
- for (int l = 0; l < numdialogueboxes[k]; l++) {
- funpackf(tfile, "Bi", &dialogueboxlocation[k][l]);
- funpackf(tfile, "Bf", &dialogueboxcolor[k][l][0]);
- funpackf(tfile, "Bf", &dialogueboxcolor[k][l][1]);
- funpackf(tfile, "Bf", &dialogueboxcolor[k][l][2]);
- funpackf(tfile, "Bi", &dialogueboxsound[k][l]);
-
- funpackf(tfile, "Bi", &templength);
- if (templength > 128 || templength <= 0)
- templength = 128;
- int m;
- for (m = 0; m < templength; m++) {
- funpackf(tfile, "Bb", &dialoguetext[k][l][m]);
- if (dialoguetext[k][l][m] == '\0')
- break;
- }
- dialoguetext[k][l][m] = 0;
-
- funpackf(tfile, "Bi", &templength);
- if (templength > 64 || templength <= 0)
- templength = 64;
- for (m = 0; m < templength; m++) {
- funpackf(tfile, "Bb", &dialoguename[k][l][m]);
- if (dialoguename[k][l][m] == '\0')
- break;
- }
- dialoguename[k][l][m] = 0;
- funpackf(tfile, "Bf Bf Bf", &dialoguecamera[k][l].x, &dialoguecamera[k][l].y, &dialoguecamera[k][l].z);
- funpackf(tfile, "Bi", &participantfocus[k][l]);
- funpackf(tfile, "Bi", &participantaction[k][l]);
-
- for (m = 0; m < 10; m++)
- funpackf(tfile, "Bf Bf Bf", &participantfacing[k][l][m].x, &participantfacing[k][l][m].y, &participantfacing[k][l][m].z);
-
- funpackf(tfile, "Bf Bf", &dialoguecamerayaw[k][l], &dialoguecamerapitch[k][l]);
- }
- }
- } else
- numdialogues = 0;
-
- for (int k = 0; k < player[0].numclothes; k++) {
- funpackf(tfile, "Bi", &templength);
- for (int l = 0; l < templength; l++)
- funpackf(tfile, "Bb", &player[0].clothes[k][l]);
- player[0].clothes[k][templength] = '\0';
- funpackf(tfile, "Bf Bf Bf", &player[0].clothestintr[k], &player[0].clothestintg[k], &player[0].clothestintb[k]);
- }
-
- funpackf(tfile, "Bi", &environment);
-
- funpackf(tfile, "Bi", &objects.numobjects);
- for (int i = 0; i < objects.numobjects; i++) {
- funpackf(tfile, "Bi Bf Bf Bf Bf Bf Bf", &objects.type[i], &objects.yaw[i], &objects.pitch[i], &objects.position[i].x, &objects.position[i].y, &objects.position[i].z, &objects.scale[i]);
- if (objects.type[i] == treeleavestype)
- objects.scale[i] = objects.scale[i - 1];
- }
-
- if (mapvers >= 7) {
- funpackf(tfile, "Bi", &numhotspots);
- for (int i = 0; i < numhotspots; i++) {
- funpackf(tfile, "Bi Bf Bf Bf Bf", &hotspottype[i], &hotspotsize[i], &hotspot[i].x, &hotspot[i].y, &hotspot[i].z);
- funpackf(tfile, "Bi", &templength);
- if (templength)
- for (int l = 0; l < templength; l++)
- funpackf(tfile, "Bb", &hotspottext[i][l]);
- hotspottext[i][templength] = '\0';
- if (hotspottype[i] == -111)
- indemo = 1;
- }
- } else
- numhotspots = 0;
-
- if (visibleloading)
- LoadingScreen();
-
- if (!stealthloading) {
- objects.center = 0;
- for (int i = 0; i < objects.numobjects; i++)
- objects.center += objects.position[i];
- objects.center /= objects.numobjects;
-
-
- if (visibleloading)
- LoadingScreen();
-
- float maxdistance = 0;
- float tempdist;
- //~ int whichclosest;
- for (int i = 0; i < objects.numobjects; i++) {
- tempdist = distsq(&objects.center, &objects.position[i]);
- if (tempdist > maxdistance) {
- //~ whichclosest=i;
- maxdistance = tempdist;
- }
- }
- objects.radius = fast_sqrt(maxdistance);
- }
-
- if (visibleloading)
- LoadingScreen();
- //mapcenter=objects.center;
- //mapradius=objects.radius;
-
- funpackf(tfile, "Bi", &numplayers);
- int howmanyremoved = 0;
- bool removeanother = 0;
- if (numplayers > 1 && numplayers < maxplayers) {
- for (int i = 1; i < numplayers; i++) {
- if (visibleloading)
- LoadingScreen();
- removeanother = 0;
-
- funpackf(tfile, "Bi Bi Bf Bf Bf Bi", &player[i - howmanyremoved].whichskin, &player[i - howmanyremoved].creature, &player[i - howmanyremoved].coords.x, &player[i - howmanyremoved].coords.y, &player[i - howmanyremoved].coords.z, &player[i - howmanyremoved].num_weapons);
- if (mapvers >= 5)
- funpackf(tfile, "Bi", &player[i - howmanyremoved].howactive);
- else
- player[i - howmanyremoved].howactive = typeactive;
- if (mapvers >= 3)
- funpackf(tfile, "Bf", &player[i - howmanyremoved].scale);
- else
- player[i - howmanyremoved].scale = -1;
- if (mapvers >= 11)
- funpackf(tfile, "Bb", &player[i - howmanyremoved].immobile);
- else
- player[i - howmanyremoved].immobile = 0;
- if (mapvers >= 12)
- funpackf(tfile, "Bf", &player[i - howmanyremoved].yaw);
- else
- player[i - howmanyremoved].yaw = 0;
- player[i - howmanyremoved].targetyaw = player[i - howmanyremoved].yaw;
- if (player[i - howmanyremoved].num_weapons < 0 || player[i - howmanyremoved].num_weapons > 5) {
- removeanother = 1;
- howmanyremoved++;
- }
- if (!removeanother) {
- if (player[i - howmanyremoved].num_weapons > 0 && player[i - howmanyremoved].num_weapons < 5) {
- for (int j = 0; j < player[i - howmanyremoved].num_weapons; j++) {
- player[i - howmanyremoved].weaponids[j] = weapons.size();
- int type;
- funpackf(tfile, "Bi", &type);
- weapons.push_back(Weapon(type, i));
- }
- }
- funpackf(tfile, "Bi", &player[i - howmanyremoved].numwaypoints);
- //player[i-howmanyremoved].numwaypoints=10;
- for (int j = 0; j < player[i - howmanyremoved].numwaypoints; j++) {
- funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].x);
- funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].y);
- funpackf(tfile, "Bf", &player[i - howmanyremoved].waypoints[j].z);
- if (mapvers >= 5)
- funpackf(tfile, "Bi", &player[i - howmanyremoved].waypointtype[j]);
- else
- player[i - howmanyremoved].waypointtype[j] = wpkeepwalking;
- }
-
- funpackf(tfile, "Bi", &player[i - howmanyremoved].waypoint);
- if (player[i - howmanyremoved].waypoint > player[i - howmanyremoved].numwaypoints - 1)
- player[i - howmanyremoved].waypoint = 0;
-
- funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].armorhead, &player[i - howmanyremoved].armorhigh, &player[i - howmanyremoved].armorlow);
- funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].protectionhead, &player[i - howmanyremoved].protectionhigh, &player[i - howmanyremoved].protectionlow);
- funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].metalhead, &player[i - howmanyremoved].metalhigh, &player[i - howmanyremoved].metallow);
- funpackf(tfile, "Bf Bf", &player[i - howmanyremoved].power, &player[i - howmanyremoved].speedmult);
-
- if (mapvers >= 4)
- funpackf(tfile, "Bf Bf Bf Bf", &headprop, &bodyprop, &armprop, &legprop);
- else {
- headprop = 1;
- bodyprop = 1;
- armprop = 1;
- legprop = 1;
- }
- if (player[i - howmanyremoved].creature == wolftype) {
- player[i - howmanyremoved].proportionhead = 1.1 * headprop;
- player[i - howmanyremoved].proportionbody = 1.1 * bodyprop;
- player[i - howmanyremoved].proportionarms = 1.1 * armprop;
- player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
- }
-
- if (player[i - howmanyremoved].creature == rabbittype) {
- player[i - howmanyremoved].proportionhead = 1.2 * headprop;
- player[i - howmanyremoved].proportionbody = 1.05 * bodyprop;
- player[i - howmanyremoved].proportionarms = 1.00 * armprop;
- player[i - howmanyremoved].proportionlegs = 1.1 * legprop;
- player[i - howmanyremoved].proportionlegs.y = 1.05 * legprop;
- }
-
- funpackf(tfile, "Bi", &player[i - howmanyremoved].numclothes);
- if (player[i - howmanyremoved].numclothes) {
- for (int k = 0; k < player[i - howmanyremoved].numclothes; k++) {
- int templength;
- funpackf(tfile, "Bi", &templength);
- for (int l = 0; l < templength; l++)
- funpackf(tfile, "Bb", &player[i - howmanyremoved].clothes[k][l]);
- player[i - howmanyremoved].clothes[k][templength] = '\0';
- funpackf(tfile, "Bf Bf Bf", &player[i - howmanyremoved].clothestintr[k], &player[i - howmanyremoved].clothestintg[k], &player[i - howmanyremoved].clothestintb[k]);
- }
- }
- }
- }
- }
- if (visibleloading)
- LoadingScreen();
-
- numplayers -= howmanyremoved;
- funpackf(tfile, "Bi", &numpathpoints);
- if (numpathpoints > 30 || numpathpoints < 0)
- numpathpoints = 0;
- for (int j = 0; j < numpathpoints; j++) {
- funpackf(tfile, "Bf Bf Bf Bi", &pathpoint[j].x, &pathpoint[j].y, &pathpoint[j].z, &numpathpointconnect[j]);
- for (int k = 0; k < numpathpointconnect[j]; k++) {
- funpackf(tfile, "Bi", &pathpointconnect[j][k]);
- }
- }
- if (visibleloading)
- LoadingScreen();
-
- funpackf(tfile, "Bf Bf Bf Bf", &mapcenter.x, &mapcenter.y, &mapcenter.z, &mapradius);
-
- SetUpLighting();
- if (environment != oldenvironment)
- Setenvironment(environment);
- oldenvironment = environment;
-
- if (!stealthloading) {
- int j = objects.numobjects;
- objects.numobjects = 0;
- for (int i = 0; i < j; i++) {
- objects.MakeObject(objects.type[i], objects.position[i], objects.yaw[i], objects.pitch[i], objects.scale[i]);
- if (visibleloading)
- LoadingScreen();
- }
-
- terrain.DoShadows();
- if (visibleloading)
- LoadingScreen();
- objects.DoShadows();
- if (visibleloading)
- LoadingScreen();
- }
-
- fclose(tfile);
-
- if (numplayers > maxplayers - 1)
- numplayers = maxplayers - 1;
- for (int i = 0; i < numplayers; i++) {
- if (visibleloading)
- LoadingScreen();
- player[i].burnt = 0;
- player[i].bled = 0;
- player[i].onfire = 0;
- if (i == 0 || player[i].scale < 0)
- player[i].scale = .2;
- player[i].skeleton.free = 0;
- player[i].skeleton.id = i;
- if (i == 0 && mapvers < 9)
- player[i].creature = rabbittype;
- if (player[i].creature != wolftype) {
- player[i].skeleton.Load(
- (char *)":Data:Skeleton:Basic Figure",
- (char *)":Data:Skeleton:Basic Figurelow",
- (char *)":Data:Skeleton:Rabbitbelt",
- (char *)":Data:Models:Body.solid",
- (char *)":Data:Models:Body2.solid",
- (char *)":Data:Models:Body3.solid",
- (char *)":Data:Models:Body4.solid",
- (char *)":Data:Models:Body5.solid",
- (char *)":Data:Models:Body6.solid",
- (char *)":Data:Models:Body7.solid",
- (char *)":Data:Models:Bodylow.solid",
- (char *)":Data:Models:Belt.solid", 0);
- } else {
- if (player[i].creature != wolftype) {
- player[i].skeleton.Load(
- (char *)":Data:Skeleton:Basic Figure",
- (char *)":Data:Skeleton:Basic Figurelow",
- (char *)":Data:Skeleton:Rabbitbelt",
- (char *)":Data:Models:Body.solid",
- (char *)":Data:Models:Body2.solid",
- (char *)":Data:Models:Body3.solid",
- (char *)":Data:Models:Body4.solid",
- (char *)":Data:Models:Body5.solid",
- (char *)":Data:Models:Body6.solid",
- (char *)":Data:Models:Body7.solid",
- (char *)":Data:Models:Bodylow.solid",
- (char *)":Data:Models:Belt.solid", 1);
- player[i].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
- }
- if (player[i].creature == wolftype) {
- player[i].skeleton.Load(
- (char *)":Data:Skeleton:Basic Figure Wolf",
- (char *)":Data:Skeleton:Basic Figure Wolf Low",
- (char *)":Data:Skeleton:Rabbitbelt",
- (char *)":Data:Models:Wolf.solid",
- (char *)":Data:Models:Wolf2.solid",
- (char *)":Data:Models:Wolf3.solid",
- (char *)":Data:Models:Wolf4.solid",
- (char *)":Data:Models:Wolf5.solid",
- (char *)":Data:Models:Wolf6.solid",
- (char *)":Data:Models:Wolf7.solid",
- (char *)":Data:Models:Wolflow.solid",
- (char *)":Data:Models:Belt.solid", 0);
- }
- }
-
-
- //~ int texsize;
- //~ texsize=512*512*3/texdetail/texdetail;
-
- player[i].skeleton.drawmodel.textureptr.load(creatureskin[player[i].creature][player[i].whichskin], 1, &player[i].skeleton.skinText[0], &player[i].skeleton.skinsize);
-
- if (player[i].numclothes) {
- for (int j = 0; j < player[i].numclothes; j++) {
- tintr = player[i].clothestintr[j];
- tintg = player[i].clothestintg[j];
- tintb = player[i].clothestintb[j];
- AddClothes((char *)player[i].clothes[j], &player[i].skeleton.skinText[0]);
- }
- player[i].DoMipmaps();
- }
-
- player[i].animCurrent = bounceidleanim;
- player[i].animTarget = bounceidleanim;
- player[i].frameCurrent = 0;
- player[i].frameTarget = 1;
- player[i].target = 0;
- player[i].speed = 1 + (float)(Random() % 100) / 1000;
- if (difficulty == 0)
- player[i].speed -= .2;
- if (difficulty == 1)
- player[i].speed -= .1;
-
- player[i].velocity = 0;
- player[i].oldcoords = player[i].coords;
- player[i].realoldcoords = player[i].coords;
-
- player[i].id = i;
- player[i].skeleton.id = i;
- player[i].updatedelay = 0;
- player[i].normalsupdatedelay = 0;
-
- player[i].aitype = passivetype;
- player[i].madskills = 0;
-
- if (i == 0) {
- player[i].proportionhead = 1.2;
- player[i].proportionbody = 1.05;
- player[i].proportionarms = 1.00;
- player[i].proportionlegs = 1.1;
- player[i].proportionlegs.y = 1.05;
- }
- player[i].headless = 0;
- player[i].currentoffset = 0;
- player[i].targetoffset = 0;
-
- player[i].damagetolerance = 200;
-
- if (player[i].creature == wolftype) {
- if (i == 0 || player[i].scale < 0)
- player[i].scale = .23;
- player[i].damagetolerance = 300;
- }
-
- if (visibleloading)
- LoadingScreen();
- if (cellophane) {
- player[i].proportionhead.z = 0;
- player[i].proportionbody.z = 0;
- player[i].proportionarms.z = 0;
- player[i].proportionlegs.z = 0;
- }
-
- player[i].tempanimation.Load((char *)"Tempanim", 0, 0);
-
- player[i].headmorphness = 0;
- player[i].targetheadmorphness = 1;
- player[i].headmorphstart = 0;
- player[i].headmorphend = 0;
-
- player[i].pausetime = 0;
-
- player[i].dead = 0;
- player[i].jumppower = 5;
- player[i].damage = 0;
- player[i].permanentdamage = 0;
- player[i].superpermanentdamage = 0;
-
- player[i].forwardkeydown = 0;
- player[i].leftkeydown = 0;
- player[i].backkeydown = 0;
- player[i].rightkeydown = 0;
- player[i].jumpkeydown = 0;
- player[i].crouchkeydown = 0;
- player[i].throwkeydown = 0;
-
- player[i].collided = -10;
- player[i].loaded = 1;
- player[i].bloodloss = 0;
- player[i].weaponactive = -1;
- player[i].weaponstuck = -1;
- player[i].bleeding = 0;
- player[i].deathbleeding = 0;
- player[i].stunned = 0;
- player[i].hasvictim = 0;
- player[i].wentforweapon = 0;
- }
-
- player[0].aitype = playercontrolled;
- player[0].weaponactive = -1;
-
- if (difficulty == 1)
- player[0].power = 1 / .9;
-
- if (difficulty == 0)
- player[0].power = 1 / .8;
-
- if (difficulty == 1)
- player[0].damagetolerance = 250;
- if (difficulty == 0)
- player[0].damagetolerance = 300;
- if (difficulty == 0)
- player[0].armorhead *= 1.5;
- if (difficulty == 0)
- player[0].armorhigh *= 1.5;
- if (difficulty == 0)
- player[0].armorlow *= 1.5;
- cameraloc = player[0].coords;
- cameraloc.y += 5;
- yaw = player[0].yaw;
-
- hawkcoords = player[0].coords;
- hawkcoords.y += 30;
-
- if (visibleloading)
- LoadingScreen();
- //~ for(int i=0;i<weapons.size();i++){
- //~ }
-
- LOG("Starting background music...");
-
- OPENAL_StopSound(OPENAL_ALL);
- if (environment == snowyenvironment) {
- if (ambientsound)
- emit_stream_np(stream_wind);
- } else if (environment == desertenvironment) {
- if (ambientsound)
- emit_stream_np(stream_desertambient);
- } else if (environment == grassyenvironment) {
- if (ambientsound)
- emit_stream_np(stream_wind, 100.);
- }
- oldmusicvolume[0] = 0;
- oldmusicvolume[1] = 0;
- oldmusicvolume[2] = 0;
- oldmusicvolume[3] = 0;
-
- if (!firstload)
- firstload = 1;
- } else {
- perror("Problem");
- }
- leveltime = 0;
- loadingstuff = 0;
- visibleloading = 0;
-}
-
-void doTutorial()
-{
- if (tutorialstagetime > tutorialmaxtime) {
- tutorialstage++;
- tutorialsuccess = 0;
- if (tutorialstage <= 1) {
- canattack = 0;
- cananger = 0;
- reversaltrain = 0;
- }
- switch (tutorialstage) {
- case 1:
- tutorialmaxtime = 5;
- break;
- case 2:
- tutorialmaxtime = 2;
- break;
- case 3:
- tutorialmaxtime = 600;
- break;
- case 4:
- tutorialmaxtime = 1000;
- break;
- case 5:
- tutorialmaxtime = 600;
- break;
- case 6:
- tutorialmaxtime = 600;
- break;
- case 7:
- tutorialmaxtime = 600;
- break;
- case 8:
- tutorialmaxtime = 600;
- break;
- case 9:
- tutorialmaxtime = 600;
- break;
- case 10:
- tutorialmaxtime = 2;
- break;
- case 11:
- tutorialmaxtime = 1000;
- break;
- case 12:
- tutorialmaxtime = 1000;
- break;
- case 13:
- tutorialmaxtime = 2;
- break;
- case 14: {
- tutorialmaxtime = 3;
-
- XYZ temp, temp2;
-
- temp.x = 1011;
- temp.y = 84;
- temp.z = 491;
- temp2.x = 1025;
- temp2.y = 75;
- temp2.z = 447;
-
- player[1].coords = (temp + temp2) / 2;
-
- emit_sound_at(fireendsound, player[1].coords);
-
- for (int i = 0; i < player[1].skeleton.num_joints; i++) {
- if (Random() % 2 == 0) {
- if (!player[1].skeleton.free)
- temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
- if (player[1].skeleton.free)
- temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
- if (!player[1].skeleton.free)
- temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
- if (player[1].skeleton.free)
- temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
- Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
- }
- }
- }
- break;
- case 15:
- tutorialmaxtime = 500;
- break;
- case 16:
- tutorialmaxtime = 500;
- break;
- case 17:
- tutorialmaxtime = 500;
- break;
- case 18:
- tutorialmaxtime = 500;
- break;
- case 19:
- tutorialstage = 20;
- //tutorialmaxtime=500;
- break;
- case 20:
- tutorialmaxtime = 500;
- break;
- case 21:
- tutorialmaxtime = 500;
- if (bonus == cannon) {
- bonus = Slicebonus;
- againbonus = 1;
- } else
- againbonus = 0;
- break;
- case 22:
- tutorialmaxtime = 500;
- break;
- case 23:
- tutorialmaxtime = 500;
- break;
- case 24:
- tutorialmaxtime = 500;
- break;
- case 25:
- tutorialmaxtime = 500;
- break;
- case 26:
- tutorialmaxtime = 2;
- break;
- case 27:
- tutorialmaxtime = 4;
- reversaltrain = 1;
- cananger = 1;
- player[1].aitype = attacktypecutoff;
- break;
- case 28:
- tutorialmaxtime = 400;
- break;
- case 29:
- tutorialmaxtime = 400;
- player[0].escapednum = 0;
- break;
- case 30:
- tutorialmaxtime = 4;
- reversaltrain = 0;
- cananger = 0;
- player[1].aitype = passivetype;
- break;
- case 31:
- tutorialmaxtime = 13;
- break;
- case 32:
- tutorialmaxtime = 8;
- break;
- case 33:
- tutorialmaxtime = 400;
- cananger = 1;
- canattack = 1;
- player[1].aitype = attacktypecutoff;
- break;
- case 34:
- tutorialmaxtime = 400;
- break;
- case 35:
- tutorialmaxtime = 400;
- break;
- case 36:
- tutorialmaxtime = 2;
- reversaltrain = 0;
- cananger = 0;
- player[1].aitype = passivetype;
- break;
- case 37:
- damagedealt = 0;
- damagetaken = 0;
- tutorialmaxtime = 50;
- cananger = 1;
- canattack = 1;
- player[1].aitype = attacktypecutoff;
- break;
- case 38:
- tutorialmaxtime = 4;
- canattack = 0;
- cananger = 0;
- player[1].aitype = passivetype;
- break;
- case 39: {
- XYZ temp, temp2;
-
- temp.x = 1011;
- temp.y = 84;
- temp.z = 491;
- temp2.x = 1025;
- temp2.y = 75;
- temp2.z = 447;
-
- Weapon w(knife, -1);
- w.position = (temp + temp2) / 2;
- w.tippoint = (temp + temp2) / 2;
-
- w.velocity = 0.1;
- w.tipvelocity = 0.1;
- w.missed = 1;
- w.hitsomething = 0;
- w.freetime = 0;
- w.firstfree = 1;
- w.physics = 1;
-
- weapons.push_back(w);
- }
- break;
- case 40:
- tutorialmaxtime = 300;
- break;
- case 41:
- tutorialmaxtime = 300;
- break;
- case 42:
- tutorialmaxtime = 8;
- break;
- case 43:
- tutorialmaxtime = 300;
- break;
- case 44:
- weapons[0].owner = 1;
- player[0].weaponactive = -1;
- player[0].num_weapons = 0;
- player[1].weaponactive = 0;
- player[1].num_weapons = 1;
- player[1].weaponids[0] = 0;
-
- cananger = 1;
- canattack = 1;
- player[1].aitype = attacktypecutoff;
-
- tutorialmaxtime = 300;
- break;
- case 45:
- weapons[0].owner = 1;
- player[0].weaponactive = -1;
- player[0].num_weapons = 0;
- player[1].weaponactive = 0;
- player[1].num_weapons = 1;
- player[1].weaponids[0] = 0;
-
- tutorialmaxtime = 300;
- break;
- case 46:
- weapons[0].owner = 1;
- player[0].weaponactive = -1;
- player[0].num_weapons = 0;
- player[1].weaponactive = 0;
- player[1].num_weapons = 1;
- player[1].weaponids[0] = 0;
-
- weapons[0].setType(sword);
-
- tutorialmaxtime = 300;
- break;
- case 47: {
- tutorialmaxtime = 10;
-
- XYZ temp, temp2;
-
- temp.x = 1011;
- temp.y = 84;
- temp.z = 491;
- temp2.x = 1025;
- temp2.y = 75;
- temp2.z = 447;
-
- Weapon w(sword, -1);
- w.position = (temp + temp2) / 2;
- w.tippoint = (temp + temp2) / 2;
-
- w.velocity = 0.1;
- w.tipvelocity = 0.1;
- w.missed = 1;
- w.hitsomething = 0;
- w.freetime = 0;
- w.firstfree = 1;
- w.physics = 1;
-
- weapons.push_back(w);
-
- weapons[0].owner = 1;
- weapons[1].owner = 0;
- player[0].weaponactive = 0;
- player[0].num_weapons = 1;
- player[0].weaponids[0] = 1;
- player[1].weaponactive = 0;
- player[1].num_weapons = 1;
- player[1].weaponids[0] = 0;
-
- }
- break;
- case 48:
- canattack = 0;
- cananger = 0;
- player[1].aitype = passivetype;
-
- tutorialmaxtime = 15;
-
- weapons[0].owner = 1;
- weapons[1].owner = 0;
- player[0].weaponactive = 0;
- player[0].num_weapons = 1;
- player[0].weaponids[0] = 1;
- player[1].weaponactive = 0;
- player[1].num_weapons = 1;
- player[1].weaponids[0] = 0;
-
- if (player[0].weaponactive != -1)
- weapons[player[0].weaponids[player[0].weaponactive]].setType(staff);
- else
- weapons[0].setType(staff);
- break;
- case 49:
- canattack = 0;
- cananger = 0;
- player[1].aitype = passivetype;
-
- tutorialmaxtime = 200;
-
- weapons[1].position = 1000;
- weapons[1].tippoint = 1000;
-
- weapons[0].setType(knife);
-
- weapons[0].owner = 0;
- player[1].weaponactive = -1;
- player[1].num_weapons = 0;
- player[0].weaponactive = 0;
- player[0].num_weapons = 1;
- player[0].weaponids[0] = 0;
-
- break;
- case 50: {
- tutorialmaxtime = 8;
-
- XYZ temp, temp2;
- emit_sound_at(fireendsound, player[1].coords);
-
- for (int i = 0; i < player[1].skeleton.num_joints; i++) {
- if (Random() % 2 == 0) {
- if (!player[1].skeleton.free)
- temp2 = (player[1].coords - player[1].oldcoords) / multiplier / 2; //velocity/2;
- if (player[1].skeleton.free)
- temp2 = player[1].skeleton.joints[i].velocity * player[1].scale / 2;
- if (!player[1].skeleton.free)
- temp = DoRotation(DoRotation(DoRotation(player[1].skeleton.joints[i].position, 0, 0, player[1].tilt), player[1].tilt2, 0, 0), 0, player[1].yaw, 0) * player[1].scale + player[1].coords;
- if (player[1].skeleton.free)
- temp = player[1].skeleton.joints[i].position * player[1].scale + player[1].coords;
- Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
- }
- }
-
- player[1].num_weapons = 0;
- player[1].weaponstuck = -1;
- player[1].weaponactive = -1;
-
- weapons.clear();
- }
- break;
- case 51:
- tutorialmaxtime = 80000;
- break;
- default:
- break;
- }
- if (tutorialstage <= 51)
- tutorialstagetime = 0;
- }
-
- //Tutorial success
- if (tutorialstagetime < tutorialmaxtime - 3) {
- switch (tutorialstage) {
- case 3:
- if (deltah || deltav)
- tutorialsuccess += multiplier;
- break;
- case 4:
- if (player[0].forwardkeydown || player[0].backkeydown || player[0].leftkeydown || player[0].rightkeydown)
- tutorialsuccess += multiplier;
- break;
- case 5:
- if (player[0].jumpkeydown)
- tutorialsuccess = 1;
- break;
- case 6:
- if (player[0].isCrouch())
- tutorialsuccess = 1;
- break;
- case 7:
- if (player[0].animTarget == rollanim)
- tutorialsuccess = 1;
- break;
- case 8:
- if (player[0].animTarget == sneakanim)
- tutorialsuccess += multiplier;
- break;
- case 9:
- if (player[0].animTarget == rabbitrunninganim || player[0].animTarget == wolfrunninganim)
- tutorialsuccess += multiplier;
- break;
- case 11:
- if (player[0].isWallJump())
- tutorialsuccess = 1;
- break;
- case 12:
- if (player[0].animTarget == flipanim)
- tutorialsuccess = 1;
- break;
- case 15:
- if (player[0].animTarget == upunchanim || player[0].animTarget == winduppunchanim)
- tutorialsuccess = 1;
- break;
- case 16:
- if (player[0].animTarget == winduppunchanim)
- tutorialsuccess = 1;
- break;
- case 17:
- if (player[0].animTarget == spinkickanim)
- tutorialsuccess = 1;
- break;
- case 18:
- if (player[0].animTarget == sweepanim)
- tutorialsuccess = 1;
- break;
- case 19:
- if (player[0].animTarget == dropkickanim)
- tutorialsuccess = 1;
- break;
- case 20:
- if (player[0].animTarget == rabbitkickanim)
- tutorialsuccess = 1;
- break;
- case 21:
- if (bonus == cannon)
- tutorialsuccess = 1;
- break;
- case 22:
- if (bonus == spinecrusher)
- tutorialsuccess = 1;
- break;
- case 23:
- if (player[0].animTarget == walljumprightkickanim || player[0].animTarget == walljumpleftkickanim)
- tutorialsuccess = 1;
- break;
- case 24:
- if (player[0].animTarget == rabbittacklinganim)
- tutorialsuccess = 1;
- break;
- case 25:
- if (player[0].animTarget == backhandspringanim)
- tutorialsuccess = 1;
- break;
- case 28:
- if (animation[player[0].animTarget].attack == reversed && player[0].feint)
- tutorialsuccess = 1;
- break;
- case 29:
- if (player[0].escapednum == 2) {
- tutorialsuccess = 1;
- reversaltrain = 0;
- cananger = 0;
- player[1].aitype = passivetype;
- }
- break;
- case 33:
- if (animation[player[0].animTarget].attack == reversal)
- tutorialsuccess = 1;
- break;
- case 34:
- if (animation[player[0].animTarget].attack == reversal)
- tutorialsuccess = 1;
- break;
- case 35:
- if (animation[player[0].animTarget].attack == reversal) {
- tutorialsuccess = 1;
- reversaltrain = 0;
- cananger = 0;
- player[1].aitype = passivetype;
- }
- break;
- case 40:
- if (player[0].num_weapons > 0)
- tutorialsuccess = 1;
- break;
- case 41:
- if (player[0].weaponactive == -1 && player[0].num_weapons > 0)
- tutorialsuccess = 1;
- break;
- case 43:
- if (player[0].animTarget == knifeslashstartanim)
- tutorialsuccess = 1;
- break;
- case 44:
- if (animation[player[0].animTarget].attack == reversal)
- tutorialsuccess = 1;
- break;
- case 45:
- if (animation[player[0].animTarget].attack == reversal)
- tutorialsuccess = 1;
- break;
- case 46:
- if (animation[player[0].animTarget].attack == reversal)
- tutorialsuccess = 1;
- break;
- case 49:
- if (player[1].weaponstuck != -1)
- tutorialsuccess = 1;
- break;
- default:
- break;
- }
- if (tutorialsuccess >= 1)
- tutorialstagetime = tutorialmaxtime - 3;
-
-
- if (tutorialstagetime == tutorialmaxtime - 3) {
- emit_sound_np(consolesuccesssound);
- }
-
- if (tutorialsuccess >= 1) {
- if (tutorialstage == 34 || tutorialstage == 35)
- tutorialstagetime = tutorialmaxtime - 1;
- }
- }
-
- if (tutorialstage < 14 || tutorialstage >= 50) {
- player[1].coords.y = 300;
- player[1].velocity = 0;
- }
-}
-
-void doDebugKeys()
-{
- float headprop, bodyprop, armprop, legprop;
- if (debugmode) {
- if (Input::isKeyPressed(SDLK_h)) {
- player[0].damagetolerance = 200000;
- player[0].damage = 0;
- player[0].burnt = 0;
- player[0].permanentdamage = 0;
- player[0].superpermanentdamage = 0;
- }
-
- if (Input::isKeyPressed(SDLK_j)) {
- environment++;
- if (environment > 2)
- environment = 0;
- Setenvironment(environment);
- }
-
- if (Input::isKeyPressed(SDLK_c)) {
- cameramode = 1 - cameramode;
- }
-
- if (Input::isKeyPressed(SDLK_x) && !Input::isKeyDown(SDLK_LSHIFT)) {
- if (player[0].num_weapons > 0) {
- if (weapons[player[0].weaponids[0]].getType() == sword)
- weapons[player[0].weaponids[0]].setType(staff);
- else if (weapons[player[0].weaponids[0]].getType() == staff)
- weapons[player[0].weaponids[0]].setType(knife);
- else
- weapons[player[0].weaponids[0]].setType(sword);
- }
- }
-
- if (Input::isKeyPressed(SDLK_x) && Input::isKeyDown(SDLK_LSHIFT)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- if (player[closest].num_weapons) {
- if (weapons[player[closest].weaponids[0]].getType() == sword)
- weapons[player[closest].weaponids[0]].setType(staff);
- else if (weapons[player[closest].weaponids[0]].getType() == staff)
- weapons[player[closest].weaponids[0]].setType(knife);
- else
- weapons[player[closest].weaponids[0]].setType(sword);
- }
- if (!player[closest].num_weapons) {
- player[closest].weaponids[0] = weapons.size();
-
- weapons.push_back(Weapon(knife, closest));
-
- player[closest].num_weapons = 1;
- }
- }
- }
-
- if (Input::isKeyDown(SDLK_u)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- player[closest].yaw += multiplier * 50;
- player[closest].targetyaw = player[closest].yaw;
- }
- }
-
-
- if (Input::isKeyPressed(SDLK_o) && !Input::isKeyDown(SDLK_LSHIFT)) {
- int closest = findClosestPlayer();
- if (Input::isKeyDown(SDLK_LCTRL))
- closest = 0;
-
- if (closest >= 0) {
- player[closest].whichskin++;
- if (player[closest].whichskin > 9)
- player[closest].whichskin = 0;
- if (player[closest].whichskin > 2 && player[closest].creature == wolftype)
- player[closest].whichskin = 0;
-
- player[closest].skeleton.drawmodel.textureptr.load(creatureskin[player[closest].creature][player[closest].whichskin], 1,
- &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
- }
-
- if (player[closest].numclothes) {
- for (int i = 0; i < player[closest].numclothes; i++) {
- tintr = player[closest].clothestintr[i];
- tintg = player[closest].clothestintg[i];
- tintb = player[closest].clothestintb[i];
- AddClothes((char *)player[closest].clothes[i], &player[closest].skeleton.skinText[0]);
- }
- player[closest].DoMipmaps();
- }
- }
-
- if (Input::isKeyPressed(SDLK_o) && Input::isKeyDown(SDLK_LSHIFT)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- if (player[closest].creature == wolftype) {
- headprop = player[closest].proportionhead.x / 1.1;
- bodyprop = player[closest].proportionbody.x / 1.1;
- armprop = player[closest].proportionarms.x / 1.1;
- legprop = player[closest].proportionlegs.x / 1.1;
- }
-
- if (player[closest].creature == rabbittype) {
- headprop = player[closest].proportionhead.x / 1.2;
- bodyprop = player[closest].proportionbody.x / 1.05;
- armprop = player[closest].proportionarms.x / 1.00;
- legprop = player[closest].proportionlegs.x / 1.1;
- }
-
-
- if (player[closest].creature == rabbittype) {
- player[closest].skeleton.id = closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure Wolf", (char *)":Data:Skeleton:Basic Figure Wolf Low", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Wolf.solid", (char *)":Data:Models:Wolf2.solid", (char *)":Data:Models:Wolf3.solid", (char *)":Data:Models:Wolf4.solid", (char *)":Data:Models:Wolf5.solid", (char *)":Data:Models:Wolf6.solid", (char *)":Data:Models:Wolf7.solid", (char *)":Data:Models:Wolflow.solid", (char *)":Data:Models:Belt.solid", 0);
- player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Wolf.jpg", 1, &player[closest].skeleton.skinText[closest], &player[closest].skeleton.skinsize);
- player[closest].whichskin = 0;
- player[closest].creature = wolftype;
-
- player[closest].proportionhead = 1.1;
- player[closest].proportionbody = 1.1;
- player[closest].proportionarms = 1.1;
- player[closest].proportionlegs = 1.1;
- player[closest].proportionlegs.y = 1.1;
- player[closest].scale = .23 * 5 * player[0].scale;
-
- player[closest].damagetolerance = 300;
- } else {
- player[closest].skeleton.id = closest;
- player[closest].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
- player[closest].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[closest].skeleton.skinText[0], &player[closest].skeleton.skinsize);
- player[closest].whichskin = 0;
- player[closest].creature = rabbittype;
-
- player[closest].proportionhead = 1.2;
- player[closest].proportionbody = 1.05;
- player[closest].proportionarms = 1.00;
- player[closest].proportionlegs = 1.1;
- player[closest].proportionlegs.y = 1.05;
- player[closest].scale = .2 * 5 * player[0].scale;
-
- player[closest].damagetolerance = 200;
- }
-
- if (player[closest].creature == wolftype) {
- player[closest].proportionhead = 1.1 * headprop;
- player[closest].proportionbody = 1.1 * bodyprop;
- player[closest].proportionarms = 1.1 * armprop;
- player[closest].proportionlegs = 1.1 * legprop;
- }
-
- if (player[closest].creature == rabbittype) {
- player[closest].proportionhead = 1.2 * headprop;
- player[closest].proportionbody = 1.05 * bodyprop;
- player[closest].proportionarms = 1.00 * armprop;
- player[closest].proportionlegs = 1.1 * legprop;
- player[closest].proportionlegs.y = 1.05 * legprop;
- }
-
- }
- }
-
- if (Input::isKeyPressed(SDLK_b) && !Input::isKeyDown(SDLK_LSHIFT)) {
- slomo = 1 - slomo;
- slomodelay = 1000;
- }
-
-
- if (((Input::isKeyPressed(SDLK_i) && !Input::isKeyDown(SDLK_LSHIFT)))) {
- int closest = -1;
- float closestdist = std::numeric_limits<float>::max();
-
- for (int i = 1; i < numplayers; i++) {
- float distance = distsq(&player[i].coords, &player[0].coords);
- if (!player[i].headless)
- if (distance < closestdist) {
- closestdist = distance;
- closest = i;
- }
- }
-
- XYZ flatfacing2, flatvelocity2;
- XYZ blah;
- if (closest != -1 && distsq(&player[closest].coords, &player[0].coords) < 144) {
- blah = player[closest].coords;
- XYZ headspurtdirection;
- //int i = player[closest].skeleton.jointlabels[head];
- Joint& headjoint = player[closest].joint(head);
- for (int k = 0; k < player[closest].skeleton.num_joints; k++) {
- if (!player[closest].skeleton.free)
- flatvelocity2 = player[closest].velocity;
- if (player[closest].skeleton.free)
- flatvelocity2 = headjoint.velocity;
- if (!player[closest].skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(headjoint.position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
- if (player[closest].skeleton.free)
- flatfacing2 = headjoint.position * player[closest].scale + player[closest].coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- headspurtdirection = headjoint.position - player[closest].jointPos(neck);
- Normalise(&headspurtdirection);
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, .6, 1);
- flatvelocity2 += headspurtdirection * 8;
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 / 2, 1, 1, 1, .16, 1);
- }
- Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
-
- emit_sound_at(splattersound, blah);
- emit_sound_at(breaksound2, blah, 100.);
-
- if (player[closest].skeleton.free == 2)
- player[closest].skeleton.free = 0;
- player[closest].RagDoll(0);
- player[closest].dead = 2;
- player[closest].headless = 1;
- player[closest].DoBloodBig(3, 165);
-
- camerashake += .3;
- }
- }
-
- if (((Input::isKeyPressed(SDLK_i) && Input::isKeyDown(SDLK_LSHIFT)))) {
- int closest = findClosestPlayer();
- XYZ flatfacing2, flatvelocity2;
- XYZ blah;
- if (closest >= 0 && distsq(&player[closest].coords, &player[0].coords) < 144) {
- blah = player[closest].coords;
- emit_sound_at(splattersound, blah);
- emit_sound_at(breaksound2, blah);
-
- for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
- if (!player[closest].skeleton.free)
- flatvelocity2 = player[closest].velocity;
- if (player[closest].skeleton.free)
- flatvelocity2 = player[closest].skeleton.joints[i].velocity;
- if (!player[closest].skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
- if (player[closest].skeleton.free)
- flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .3, 1);
- Sprite::MakeSprite(cloudsprite, flatfacing2, flatvelocity2 * 0, .6, 0, 0, 1, .5);
- }
-
- for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
- if (!player[closest].skeleton.free)
- flatvelocity2 = player[closest].velocity;
- if (player[closest].skeleton.free)
- flatvelocity2 = player[closest].skeleton.joints[i].velocity;
- if (!player[closest].skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
- if (player[closest].skeleton.free)
- flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2, 1, 1, 1, .4, 1);
- }
-
- for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
- if (!player[closest].skeleton.free)
- flatvelocity2 = player[closest].velocity;
- if (player[closest].skeleton.free)
- flatvelocity2 = player[closest].skeleton.joints[i].velocity;
- if (!player[closest].skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
- if (player[closest].skeleton.free)
- flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
- }
-
- for (int i = 0; i < player[closest].skeleton.num_joints; i++) {
- if (!player[closest].skeleton.free)
- flatvelocity2 = player[closest].velocity;
- if (player[closest].skeleton.free)
- flatvelocity2 = player[closest].skeleton.joints[i].velocity;
- if (!player[closest].skeleton.free)
- flatfacing2 = DoRotation(DoRotation(DoRotation(player[closest].skeleton.joints[i].position, 0, 0, player[closest].tilt), player[closest].tilt2, 0, 0), 0, player[closest].yaw, 0) * player[closest].scale + player[closest].coords;
- if (player[closest].skeleton.free)
- flatfacing2 = player[closest].skeleton.joints[i].position * player[closest].scale + player[closest].coords;
- flatvelocity2.x += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.y += (float)(abs(Random() % 100) - 50) / 10;
- flatvelocity2.z += (float)(abs(Random() % 100) - 50) / 10;
- Sprite::MakeSprite(bloodflamesprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, 3, 1);
- Sprite::MakeSprite(bloodsprite, flatfacing2, flatvelocity2 * 2, 1, 1, 1, .4, 1);
- }
-
- XYZ temppos;
- for (int j = 0; j < numplayers; j++) {
- if (j != closest) {
- if (distsq(&player[j].coords, &player[closest].coords) < 25) {
- player[j].DoDamage((25 - distsq(&player[j].coords, &player[closest].coords)) * 60);
- if (player[j].skeleton.free == 2)
- player[j].skeleton.free = 1;
- player[j].skeleton.longdead = 0;
- player[j].RagDoll(0);
- for (int i = 0; i < player[j].skeleton.num_joints; i++) {
- temppos = player[j].skeleton.joints[i].position + player[j].coords;
- if (distsq(&temppos, &player[closest].coords) < 25) {
- flatvelocity2 = temppos - player[closest].coords;
- Normalise(&flatvelocity2);
- player[j].skeleton.joints[i].velocity += flatvelocity2 * ((20 - distsq(&temppos, &player[closest].coords)) * 20);
- }
- }
- }
- }
- }
-
- player[closest].DoDamage(10000);
- player[closest].RagDoll(0);
- player[closest].dead = 2;
- player[closest].coords = 20;
- player[closest].skeleton.free = 2;
-
- camerashake += .6;
-
- }
- }
-
- if (Input::isKeyPressed(SDLK_f)) {
- player[0].onfire = 1 - player[0].onfire;
- if (player[0].onfire) {
- player[0].CatchFire();
- }
- if (!player[0].onfire) {
- emit_sound_at(fireendsound, player[0].coords);
- pause_sound(stream_firesound);
- }
- }
-
- if (Input::isKeyPressed(SDLK_n) && !Input::isKeyDown(SDLK_LCTRL)) {
- //if(!player[0].skeleton.free)player[0].damage+=500;
- player[0].RagDoll(0);
- //player[0].spurt=1;
- //player[0].DoDamage(1000);
-
- emit_sound_at(whooshsound, player[0].coords, 128.);
- }
-
- if (Input::isKeyPressed(SDLK_n) && Input::isKeyDown(SDLK_LCTRL)) {
- for (int i = 0; i < objects.numobjects; i++) {
- if (objects.type[i] == treeleavestype) {
- objects.scale[i] *= .9;
- }
- }
- }
-
- if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
- editorenabled = 1 - editorenabled;
- if (editorenabled) {
- player[0].damagetolerance = 100000;
- } else {
- player[0].damagetolerance = 200;
- }
- player[0].damage = 0; // these lines were in both if and else, but I think they would better fit in the if
- player[0].permanentdamage = 0;
- player[0].superpermanentdamage = 0;
- player[0].bloodloss = 0;
- player[0].deathbleeding = 0;
- }
-
- //skip level
- if (whichlevel != -2 && Input::isKeyPressed(SDLK_k) && Input::isKeyDown(SDLK_LSHIFT) && !editorenabled) {
- targetlevel++;
- if (targetlevel > numchallengelevels - 1)
- targetlevel = 0;
- loading = 1;
- leveltime = 5;
- }
-
- if (editorenabled) {
- if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LSHIFT)) {
- int closest = findClosestPlayer();
- if (closest >= 0) {
- //player[closest]=player[numplayers-1];
- //player[closest].skeleton=player[numplayers-1].skeleton;
- numplayers--;
- }
- }
-
- if (Input::isKeyPressed(SDLK_DELETE) && Input::isKeyDown(SDLK_LCTRL)) {
- int closest = findClosestObject();
- if (closest >= 0)
- objects.position[closest].y -= 500;
- }
-
- if (Input::isKeyPressed(SDLK_m) && Input::isKeyDown(SDLK_LSHIFT)) {
- //drawmode++;
- //if(drawmode>2)drawmode=0;
- if (objects.numobjects < max_objects - 1) {
- XYZ boxcoords;
- boxcoords.x = player[0].coords.x;
- boxcoords.z = player[0].coords.z;
- boxcoords.y = player[0].coords.y - 3;
- if (editortype == bushtype)
- boxcoords.y = player[0].coords.y - .5;
- if (editortype == firetype)
- boxcoords.y = player[0].coords.y - .5;
- //objects.MakeObject(abs(Random()%3),boxcoords,Random()%360);
- float temprotat, temprotat2;
- temprotat = editoryaw;
- temprotat2 = editorpitch;
- if (temprotat < 0 || editortype == bushtype)
- temprotat = Random() % 360;
- if (temprotat2 < 0)
- temprotat2 = Random() % 360;
-
- objects.MakeObject(editortype, boxcoords, (int)temprotat - ((int)temprotat) % 30, (int)temprotat2, editorsize);
- if (editortype == treetrunktype)
- objects.MakeObject(treeleavestype, boxcoords, Random() % 360 * (temprotat2 < 2) + (int)editoryaw - ((int)editoryaw) % 30, editorpitch, editorsize);
- }
- }
-
- if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
- if (numplayers < maxplayers - 1) {
- player[numplayers].scale = .2 * 5 * player[0].scale;
- player[numplayers].creature = rabbittype;
- player[numplayers].howactive = editoractive;
- player[numplayers].skeleton.id = numplayers;
- player[numplayers].skeleton.Load((char *)":Data:Skeleton:Basic Figure", (char *)":Data:Skeleton:Basic Figurelow", (char *)":Data:Skeleton:Rabbitbelt", (char *)":Data:Models:Body.solid", (char *)":Data:Models:Body2.solid", (char *)":Data:Models:Body3.solid", (char *)":Data:Models:Body4.solid", (char *)":Data:Models:Body5.solid", (char *)":Data:Models:Body6.solid", (char *)":Data:Models:Body7.solid", (char *)":Data:Models:Bodylow.solid", (char *)":Data:Models:Belt.solid", 1);
-
- //texsize=512*512*3/texdetail/texdetail;
- //if(!player[numplayers].loaded)player[numplayers].skeleton.skinText = new GLubyte[texsize];
- //player[numplayers].skeleton.skinText.resize(texsize);
-
- int k = abs(Random() % 2) + 1;
- if (k == 0) {
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur3.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin = 0;
- } else if (k == 1) {
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin = 1;
- } else {
- player[numplayers].skeleton.drawmodel.textureptr.load(":Data:Textures:Fur2.jpg", 1, &player[numplayers].skeleton.skinText[0], &player[numplayers].skeleton.skinsize);
- player[numplayers].whichskin = 2;
- }
-
- player[numplayers].skeleton.drawmodelclothes.textureptr.load(":Data:Textures:Belt.png", 1, 1);
- player[numplayers].power = 1;
- player[numplayers].speedmult = 1;
- player[numplayers].animCurrent = bounceidleanim;
- player[numplayers].animTarget = bounceidleanim;
- player[numplayers].frameCurrent = 0;
- player[numplayers].frameTarget = 1;
- player[numplayers].target = 0;
- player[numplayers].bled = 0;
- player[numplayers].speed = 1 + (float)(Random() % 100) / 1000;
-
- player[numplayers].targetyaw = player[0].targetyaw;
- player[numplayers].yaw = player[0].yaw;
-
- player[numplayers].velocity = 0;
- player[numplayers].coords = player[0].coords;
- player[numplayers].oldcoords = player[numplayers].coords;
- player[numplayers].realoldcoords = player[numplayers].coords;
-
- player[numplayers].id = numplayers;
- player[numplayers].skeleton.id = numplayers;
- player[numplayers].updatedelay = 0;
- player[numplayers].normalsupdatedelay = 0;
-
- player[numplayers].aitype = passivetype;
-
- if (player[0].creature == wolftype) {
- headprop = player[0].proportionhead.x / 1.1;
- bodyprop = player[0].proportionbody.x / 1.1;
- armprop = player[0].proportionarms.x / 1.1;
- legprop = player[0].proportionlegs.x / 1.1;
- }
-
- if (player[0].creature == rabbittype) {
- headprop = player[0].proportionhead.x / 1.2;
- bodyprop = player[0].proportionbody.x / 1.05;
- armprop = player[0].proportionarms.x / 1.00;
- legprop = player[0].proportionlegs.x / 1.1;
- }
-
- if (player[numplayers].creature == wolftype) {
- player[numplayers].proportionhead = 1.1 * headprop;
- player[numplayers].proportionbody = 1.1 * bodyprop;
- player[numplayers].proportionarms = 1.1 * armprop;
- player[numplayers].proportionlegs = 1.1 * legprop;
- }
-
- if (player[numplayers].creature == rabbittype) {
- player[numplayers].proportionhead = 1.2 * headprop;
- player[numplayers].proportionbody = 1.05 * bodyprop;
- player[numplayers].proportionarms = 1.00 * armprop;
- player[numplayers].proportionlegs = 1.1 * legprop;
- player[numplayers].proportionlegs.y = 1.05 * legprop;
- }
-
- player[numplayers].headless = 0;
- player[numplayers].onfire = 0;
-
- if (cellophane) {
- player[numplayers].proportionhead.z = 0;
- player[numplayers].proportionbody.z = 0;
- player[numplayers].proportionarms.z = 0;
- player[numplayers].proportionlegs.z = 0;
- }
-
- player[numplayers].tempanimation.Load((char *)"Tempanim", 0, 0);
-
- player[numplayers].damagetolerance = 200;
-
- player[numplayers].protectionhead = player[0].protectionhead;
- player[numplayers].protectionhigh = player[0].protectionhigh;
- player[numplayers].protectionlow = player[0].protectionlow;
- player[numplayers].armorhead = player[0].armorhead;
- player[numplayers].armorhigh = player[0].armorhigh;
- player[numplayers].armorlow = player[0].armorlow;
- player[numplayers].metalhead = player[0].metalhead;
- player[numplayers].metalhigh = player[0].metalhigh;
- player[numplayers].metallow = player[0].metallow;
-
- player[numplayers].immobile = player[0].immobile;
-
- player[numplayers].numclothes = player[0].numclothes;
- if (player[numplayers].numclothes)
- for (int i = 0; i < player[numplayers].numclothes; i++) {
- strcpy(player[numplayers].clothes[i], player[0].clothes[i]);
- player[numplayers].clothestintr[i] = player[0].clothestintr[i];
- player[numplayers].clothestintg[i] = player[0].clothestintg[i];
- player[numplayers].clothestintb[i] = player[0].clothestintb[i];
- tintr = player[numplayers].clothestintr[i];
- tintg = player[numplayers].clothestintg[i];
- tintb = player[numplayers].clothestintb[i];
- AddClothes((char *)player[numplayers].clothes[i], &player[numplayers].skeleton.skinText[0]);
- }
- if (player[numplayers].numclothes) {
- player[numplayers].DoMipmaps();
- }
-
- player[numplayers].power = player[0].power;
- player[numplayers].speedmult = player[0].speedmult;
-
- player[numplayers].damage = 0;
- player[numplayers].permanentdamage = 0;
- player[numplayers].superpermanentdamage = 0;
- player[numplayers].deathbleeding = 0;
- player[numplayers].bleeding = 0;
- player[numplayers].numwaypoints = 0;
- player[numplayers].waypoint = 0;
- player[numplayers].jumppath = 0;
- player[numplayers].weaponstuck = -1;
- player[numplayers].weaponactive = -1;
- player[numplayers].num_weapons = 0;
- player[numplayers].bloodloss = 0;
- player[numplayers].dead = 0;
-
- player[numplayers].loaded = 1;
-
- numplayers++;
- }
- }
-
- if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LSHIFT)) {
- if (player[numplayers - 1].numwaypoints < 90) {
- player[numplayers - 1].waypoints[player[numplayers - 1].numwaypoints] = player[0].coords;
- player[numplayers - 1].waypointtype[player[numplayers - 1].numwaypoints] = editorpathtype;
- player[numplayers - 1].numwaypoints++;
- }
- }
-
- if (Input::isKeyPressed(SDLK_p) && Input::isKeyDown(SDLK_LCTRL)) {
- if (numpathpoints < 30) {
- bool connected, alreadyconnected;
- connected = 0;
- if (numpathpoints > 1)
- for (int i = 0; i < numpathpoints; i++) {
- if (distsq(&pathpoint[i], &player[0].coords) < .5 && i != pathpointselected && !connected) {
- alreadyconnected = 0;
- for (int j = 0; j < numpathpointconnect[pathpointselected]; j++) {
- if (pathpointconnect[pathpointselected][j] == i)
- alreadyconnected = 1;
- }
- if (!alreadyconnected) {
- numpathpointconnect[pathpointselected]++;
- connected = 1;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = i;
- }
- }
- }
- if (!connected) {
- numpathpoints++;
- pathpoint[numpathpoints - 1] = player[0].coords;
- numpathpointconnect[numpathpoints - 1] = 0;
- if (numpathpoints > 1 && pathpointselected != -1) {
- numpathpointconnect[pathpointselected]++;
- pathpointconnect[pathpointselected][numpathpointconnect[pathpointselected] - 1] = numpathpoints - 1;
- }
- pathpointselected = numpathpoints - 1;
- }
- }
- }
-
- if (Input::isKeyPressed(SDLK_PERIOD)) {
- pathpointselected++;
- if (pathpointselected >= numpathpoints)
- pathpointselected = -1;
- }
- if (Input::isKeyPressed(SDLK_COMMA) && !Input::isKeyDown(SDLK_LSHIFT)) {
- pathpointselected--;
- if (pathpointselected <= -2)
- pathpointselected = numpathpoints - 1;
- }
- if (Input::isKeyPressed(SDLK_COMMA) && Input::isKeyDown(SDLK_LSHIFT)) {
- if (pathpointselected != -1) {
- numpathpoints--;
- pathpoint[pathpointselected] = pathpoint[numpathpoints];
- numpathpointconnect[pathpointselected] = numpathpointconnect[numpathpoints];
- for (int i = 0; i < numpathpointconnect[pathpointselected]; i++) {
- pathpointconnect[pathpointselected][i] = pathpointconnect[numpathpoints][i];
- }
- for (int i = 0; i < numpathpoints; i++) {
- for (int j = 0; j < numpathpointconnect[i]; j++) {
- if (pathpointconnect[i][j] == pathpointselected) {
- pathpointconnect[i][j] = pathpointconnect[i][numpathpointconnect[i] - 1];
- numpathpointconnect[i]--;
- }
- if (pathpointconnect[i][j] == numpathpoints) {
- pathpointconnect[i][j] = pathpointselected;
- }
- }
- }
- pathpointselected = numpathpoints - 1;
- }
- }
-
- if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
- editortype--;
- if (editortype == treeleavestype || editortype == 10)
- editortype--;
- if (editortype < 0)
- editortype = firetype;
- }
-
- if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
- editortype++;
- if (editortype == treeleavestype || editortype == 10)
- editortype++;
- if (editortype > firetype)
- editortype = 0;
- }
-
- if (Input::isKeyDown(SDLK_LEFT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
- editoryaw -= multiplier * 100;
- if (editoryaw < -.01)
- editoryaw = -.01;
- }
-
- if (Input::isKeyDown(SDLK_RIGHT) && !Input::isKeyDown(SDLK_LSHIFT) && !Input::isKeyDown(SDLK_LCTRL)) {
- editoryaw += multiplier * 100;
- }
-
- if (Input::isKeyDown(SDLK_UP) && !Input::isKeyDown(SDLK_LCTRL)) {
- editorsize += multiplier;
- }
-
- if (Input::isKeyDown(SDLK_DOWN) && !Input::isKeyDown(SDLK_LCTRL)) {
- editorsize -= multiplier;
- if (editorsize < .1)
- editorsize = .1;
- }
-
-
- if (Input::isKeyPressed(SDLK_LEFT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
- mapradius -= multiplier * 10;
- }
-
- if (Input::isKeyPressed(SDLK_RIGHT) && Input::isKeyDown(SDLK_LSHIFT) && Input::isKeyDown(SDLK_LCTRL)) {
- mapradius += multiplier * 10;
- }
- if (Input::isKeyDown(SDLK_UP) && Input::isKeyDown(SDLK_LCTRL)) {
- editorpitch += multiplier * 100;
- }
-
- if (Input::isKeyDown(SDLK_DOWN) && Input::isKeyDown(SDLK_LCTRL)) {
- editorpitch -= multiplier * 100;
- if (editorpitch < -.01)
- editorpitch = -.01;
- }
- if (Input::isKeyPressed(SDLK_DELETE) && objects.numobjects && Input::isKeyDown(SDLK_LSHIFT)) {
- int closest = findClosestObject();
- if (closest >= 0)
- objects.DeleteObject(closest);
- }
- }
- }
-}
-
-void doJumpReversals()
-{
- for (int k = 0; k < numplayers; k++)
- for (int i = k; i < numplayers; i++) {
- if (i == k)
- continue;
- if ( player[k].skeleton.free == 0 &&
- player[i].skeleton.oldfree == 0 &&
- (player[i].animTarget == jumpupanim ||
- player[k].animTarget == jumpupanim) &&
- (player[i].aitype == playercontrolled ||
- player[k].aitype == playercontrolled) &&
- (player[i].aitype == attacktypecutoff && player[i].stunned <= 0 ||
- player[k].aitype == attacktypecutoff && player[k].stunned <= 0)) {
- if ( distsq(&player[i].coords, &player[k].coords) < 10 * sq((player[i].scale + player[k].scale) * 2.5) &&
- distsqflat(&player[i].coords, &player[k].coords) < 2 * sq((player[i].scale + player[k].scale) * 2.5)) {
- //TODO: refactor two huge similar ifs
- if (player[i].animTarget == jumpupanim &&
- player[k].animTarget != getupfrombackanim &&
- player[k].animTarget != getupfromfrontanim &&
- animation[player[k].animTarget].height == middleheight &&
- normaldotproduct(player[i].velocity, player[k].coords - player[i].coords) < 0 &&
- (player[k].aitype == playercontrolled && player[k].attackkeydown ||
- player[k].aitype != playercontrolled)) {
- player[i].victim = &player[k];
- player[i].velocity = 0;
- player[i].animCurrent = jumpreversedanim;
- player[i].animTarget = jumpreversedanim;
- player[i].frameCurrent = 0;
- player[i].frameTarget = 1;
- player[i].targettilt2 = 0;
- player[k].victim = &player[i];
- player[k].velocity = 0;
- player[k].animCurrent = jumpreversalanim;
- player[k].animTarget = jumpreversalanim;
- player[k].frameCurrent = 0;
- player[k].frameTarget = 1;
- player[k].targettilt2 = 0;
- if (player[i].coords.y < player[k].coords.y + 1) {
- player[i].animCurrent = rabbitkickreversedanim;
- player[i].animTarget = rabbitkickreversedanim;
- player[i].frameCurrent = 1;
- player[i].frameTarget = 2;
- player[k].animCurrent = rabbitkickreversalanim;
- player[k].animTarget = rabbitkickreversalanim;
- player[k].frameCurrent = 1;
- player[k].frameTarget = 2;
- }
- player[i].target = 0;
- player[k].oldcoords = player[k].coords;
- player[i].coords = player[k].coords;
- player[k].targetyaw = player[i].targetyaw;
- player[k].yaw = player[i].targetyaw;
- if (player[k].aitype == attacktypecutoff)
- player[k].stunned = .5;
- }
- if (player[k].animTarget == jumpupanim &&
- player[i].animTarget != getupfrombackanim &&
- player[i].animTarget != getupfromfrontanim &&
- animation[player[i].animTarget].height == middleheight &&
- normaldotproduct(player[k].velocity, player[i].coords - player[k].coords) < 0 &&
- ((player[i].aitype == playercontrolled && player[i].attackkeydown) ||
- player[i].aitype != playercontrolled)) {
- player[k].victim = &player[i];
- player[k].velocity = 0;
- player[k].animCurrent = jumpreversedanim;
- player[k].animTarget = jumpreversedanim;
- player[k].frameCurrent = 0;
- player[k].frameTarget = 1;
- player[k].targettilt2 = 0;
- player[i].victim = &player[k];
- player[i].velocity = 0;
- player[i].animCurrent = jumpreversalanim;
- player[i].animTarget = jumpreversalanim;
- player[i].frameCurrent = 0;
- player[i].frameTarget = 1;
- player[i].targettilt2 = 0;
- if (player[k].coords.y < player[i].coords.y + 1) {
- player[k].animTarget = rabbitkickreversedanim;
- player[k].animCurrent = rabbitkickreversedanim;
- player[i].animCurrent = rabbitkickreversalanim;
- player[i].animTarget = rabbitkickreversalanim;
- player[k].frameCurrent = 1;
- player[k].frameTarget = 2;
- player[i].frameCurrent = 1;
- player[i].frameTarget = 2;
- }
- player[k].target = 0;
- player[i].oldcoords = player[i].coords;
- player[k].coords = player[i].coords;
- player[i].targetyaw = player[k].targetyaw;
- player[i].yaw = player[k].targetyaw;
- if (player[i].aitype == attacktypecutoff)
- player[i].stunned = .5;
- }
- }
- }
- }
-}
-
-void doAerialAcrobatics()
-{
- static XYZ facing, flatfacing;
- for (int k = 0; k < numplayers; k++) {
- player[k].turnspeed = 500;
-
- if ((player[k].isRun() &&
- ((player[k].targetyaw != rabbitrunninganim &&
- player[k].targetyaw != wolfrunninganim) ||
- player[k].frameTarget == 4)) ||
- player[k].animTarget == removeknifeanim ||
- player[k].animTarget == crouchremoveknifeanim ||
- player[k].animTarget == flipanim ||
- player[k].animTarget == fightsidestep ||
- player[k].animTarget == walkanim) {
- player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed);
- }
-
-
- if (player[k].isStop() ||
- player[k].isLanding() ||
- player[k].animTarget == staggerbackhighanim ||
- (player[k].animTarget == sneakanim && player[k].animCurrent == sneakanim) ||
- player[k].animTarget == staggerbackhardanim ||
- player[k].animTarget == backhandspringanim ||
- player[k].animTarget == dodgebackanim ||
- player[k].animTarget == rollanim ||
- (animation[player[k].animTarget].attack &&
- player[k].animTarget != rabbitkickanim &&
- (player[k].animTarget != crouchstabanim || player[k].hasvictim) &&
- (player[k].animTarget != swordgroundstabanim || player[k].hasvictim))) {
- player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 2);
- }
-
- if (player[k].animTarget == sneakanim && player[k].animCurrent != sneakanim) {
- player[k].yaw = stepTowardf(player[k].yaw, player[k].targetyaw, multiplier * player[k].turnspeed * 4);
- }
-
- /*if(player[k].aitype!=passivetype||(distsq(&player[k].coords,&viewer)<viewdistance*viewdistance))*/
- player[k].DoStuff();
- if (player[k].immobile && k != 0)
- player[k].coords = player[k].realoldcoords;
-
- //if player's position has changed (?)
- if (distsq(&player[k].coords, &player[k].realoldcoords) > 0 &&
- !player[k].skeleton.free &&
- player[k].animTarget != climbanim &&
- player[k].animTarget != hanganim) {
- XYZ lowpoint, lowpointtarget, lowpoint2, lowpointtarget2, lowpoint3, lowpointtarget3, lowpoint4, lowpointtarget4, lowpoint5, lowpointtarget5, lowpoint6, lowpointtarget6, lowpoint7, lowpointtarget7, colpoint, colpoint2;
- int whichhit;
- bool tempcollide = 0;
-
- if (player[k].collide < -.3)
- player[k].collide = -.3;
- if (player[k].collide > 1)
- player[k].collide = 1;
- player[k].collide -= multiplier * 30;
-
- //clip to terrain
- player[k].coords.y = max(player[k].coords.y, terrain.getHeight(player[k].coords.x, player[k].coords.z));
-
- for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
- int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- if (objects.type[i] != rocktype ||
- objects.scale[i] > .5 && player[k].aitype == playercontrolled ||
- objects.position[i].y > player[k].coords.y) {
- lowpoint = player[k].coords;
- if (player[k].animTarget != jumpupanim &&
- player[k].animTarget != jumpdownanim &&
- !player[k].isFlip())
- lowpoint.y += 1.25;
- else
- lowpoint.y += 1.3;
- if ( player[k].coords.y < terrain.getHeight(player[k].coords.x, player[k].coords.z) &&
- player[k].coords.y > terrain.getHeight(player[k].coords.x, player[k].coords.z) - .1)
- player[k].coords.y = terrain.getHeight(player[k].coords.x, player[k].coords.z);
- if (player[k].SphereCheck(&lowpoint, 1.3, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
- flatfacing = lowpoint - player[k].coords;
- player[k].coords = lowpoint;
- player[k].coords.y -= 1.3;
- player[k].collide = 1;
- tempcollide = 1;
- //wall jumps
- //TODO: refactor four similar blocks
- if (player[k].aitype == playercontrolled &&
- (player[k].animTarget == jumpupanim ||
- player[k].animTarget == jumpdownanim ||
- player[k].isFlip()) &&
- !player[k].jumptogglekeydown &&
- player[k].jumpkeydown) {
- lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, -90, 0) * 1.5;
- XYZ tempcoords1 = lowpoint;
- whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
- player[k].setAnimation(walljumpleftanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if (k == 0)
- pause_sound(whooshsound);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
- player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- player[k].yaw = 180 - player[k].yaw;
- player[k].targetyaw = player[k].yaw;
- player[k].lowyaw = player[k].yaw;
- if (k == 0)
- numwallflipped++;
- } else {
- lowpoint = tempcoords1;
- lowpointtarget = lowpoint + DoRotation(player[k].facing, 0, 90, 0) * 1.5;
- whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
- player[k].setAnimation(walljumprightanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if (k == 0)
- pause_sound(whooshsound);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
- player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- player[k].yaw = 180 - player[k].yaw;
- player[k].targetyaw = player[k].yaw;
- player[k].lowyaw = player[k].yaw;
- if (k == 0)
- numwallflipped++;
- } else {
- lowpoint = tempcoords1;
- lowpointtarget = lowpoint + player[k].facing * 2;
- whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
- player[k].setAnimation(walljumpbackanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if (k == 0)
- pause_sound(whooshsound);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
- player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- player[k].yaw = 180 - player[k].yaw;
- player[k].targetyaw = player[k].yaw;
- player[k].lowyaw = player[k].yaw;
- if (k == 0)
- numwallflipped++;
- } else {
- lowpoint = tempcoords1;
- lowpointtarget = lowpoint - player[k].facing * 2;
- whichhit = objects.model[i].LineCheck(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (whichhit != -1 && fabs(objects.model[i].facenormals[whichhit].y) < .3) {
- player[k].setAnimation(walljumpfrontanim);
- emit_sound_at(movewhooshsound, player[k].coords);
- if (k == 0)
- pause_sound(whooshsound);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
- player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- player[k].yaw = 180 - player[k].yaw;
- player[k].yaw += 180;
- player[k].targetyaw = player[k].yaw;
- player[k].lowyaw = player[k].yaw;
- if (k == 0)
- numwallflipped++;
- }
- }
- }
- }
- }
- }
- } else if (objects.type[i] == rocktype) {
- lowpoint2 = player[k].coords;
- lowpoint = player[k].coords;
- lowpoint.y += 2;
- if (objects.model[i].LineCheck(&lowpoint, &lowpoint2, &colpoint, &objects.position[i], &objects.yaw[i]) != -1) {
- player[k].coords = colpoint;
- player[k].collide = 1;
- tempcollide = 1;
-
- if (player[k].animTarget == jumpdownanim || player[k].isFlip()) {
- //flipped into a rock
- if (player[k].isFlip() && animation[player[k].animTarget].label[player[k].frameTarget] == 7)
- player[k].RagDoll(0);
-
- if (player[k].animTarget == jumpupanim) {
- player[k].jumppower = -4;
- player[k].animTarget = player[k].getIdle();
- }
- player[k].target = 0;
- player[k].frameTarget = 0;
- player[k].onterrain = 1;
-
- if (player[k].id == 0) {
- pause_sound(whooshsound);
- OPENAL_SetVolume(channels[whooshsound], 0);
- }
-
- //landing
- if ((player[k].animTarget == jumpdownanim || player[k].isFlip()) && !player[k].wasLanding()) {
- if (player[k].isFlip())
- player[k].jumppower = -4;
- player[k].animTarget = player[k].getLanding();
- emit_sound_at(landsound, player[k].coords, 128.);
- if (k == 0) {
- envsound[numenvsounds] = player[k].coords;
- envsoundvol[numenvsounds] = 16;
- envsoundlife[numenvsounds] = .4;
- numenvsounds++;
- }
-
- }
- }
- }
- }
- }
-
- if (tempcollide && (/*player[k].jumptogglekeydown*/1 == 1 || player[k].aitype != playercontrolled))
- for (int l = 0; l < terrain.patchobjectnum[player[k].whichpatchx][player[k].whichpatchz]; l++) {
- int i = terrain.patchobjects[player[k].whichpatchx][player[k].whichpatchz][l];
- lowpoint = player[k].coords;
- lowpoint.y += 1.35;
- if (objects.type[i] != rocktype)
- if (player[k].SphereCheck(&lowpoint, 1.33, &colpoint, &objects.position[i], &objects.yaw[i], &objects.model[i]) != -1) {
- if (player[k].animTarget != jumpupanim &&
- player[k].animTarget != jumpdownanim &&
- player[k].onterrain)
- player[k].avoidcollided = 1;
- player[k].coords = lowpoint;
- player[k].coords.y -= 1.35;
- player[k].collide = 1;
-
- if ((player[k].grabdelay <= 0 || player[k].aitype != playercontrolled) &&
- (player[k].animCurrent != climbanim &&
- player[k].animCurrent != hanganim &&
- !player[k].isWallJump() ||
- player[k].animTarget == jumpupanim ||
- player[k].animTarget == jumpdownanim)) {
- lowpoint = player[k].coords;
- objects.model[i].SphereCheckPossible(&lowpoint, 1.5, &objects.position[i], &objects.yaw[i]);
- lowpoint = player[k].coords;
- lowpoint.y += .05;
- facing = 0;
- facing.z = -1;
- facing = DoRotation(facing, 0, player[k].targetyaw + 180, 0);
- lowpointtarget = lowpoint + facing * 1.4;
- whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (whichhit != -1) {
- lowpoint = player[k].coords;
- lowpoint.y += .1;
- lowpointtarget = lowpoint + facing * 1.4;
- lowpoint2 = lowpoint;
- lowpointtarget2 = lowpointtarget;
- lowpoint3 = lowpoint;
- lowpointtarget3 = lowpointtarget;
- lowpoint4 = lowpoint;
- lowpointtarget4 = lowpointtarget;
- lowpoint5 = lowpoint;
- lowpointtarget5 = lowpointtarget;
- lowpoint6 = lowpoint;
- lowpointtarget6 = lowpointtarget;
- lowpoint7 = lowpoint;
- lowpointtarget7 = lowpoint;
- lowpoint2.x += .1;
- lowpointtarget2.x += .1;
- lowpoint3.z += .1;
- lowpointtarget3.z += .1;
- lowpoint4.x -= .1;
- lowpointtarget4.x -= .1;
- lowpoint5.z -= .1;
- lowpointtarget5.z -= .1;
- lowpoint6.y += 45 / 13;
- lowpointtarget6.y += 45 / 13;
- lowpointtarget6 += facing * .6;
- lowpointtarget7.y += 90 / 13;
- whichhit = objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget, &colpoint, &objects.position[i], &objects.yaw[i]);
- if (objects.friction[i] > .5)
- if (whichhit != -1) {
- if (whichhit != -1 && player[k].animTarget != jumpupanim && player[k].animTarget != jumpdownanim)
- player[k].collided = 1;
- if (checkcollide(lowpoint7, lowpointtarget7) == -1)
- if (checkcollide(lowpoint6, lowpointtarget6) == -1)
- if ( objects.model[i].LineCheckPossible(&lowpoint2, &lowpointtarget2,
- &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
- objects.model[i].LineCheckPossible(&lowpoint3, &lowpointtarget3,
- &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
- objects.model[i].LineCheckPossible(&lowpoint4, &lowpointtarget4,
- &colpoint, &objects.position[i], &objects.yaw[i]) != -1 &&
- objects.model[i].LineCheckPossible(&lowpoint5, &lowpointtarget5,
- &colpoint, &objects.position[i], &objects.yaw[i]) != -1)
- for (int j = 0; j < 45; j++) {
- lowpoint = player[k].coords;
- lowpoint.y += (float)j / 13;
- lowpointtarget = lowpoint + facing * 1.4;
- if (objects.model[i].LineCheckPossible(&lowpoint, &lowpointtarget,
- &colpoint2, &objects.position[i], &objects.yaw[i]) == -1) {
- if (j <= 6 || j <= 25 && player[k].animTarget == jumpdownanim)
- break;
- if (player[k].animTarget == jumpupanim || player[k].animTarget == jumpdownanim) {
- lowpoint = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0);
- lowpoint = player[k].coords;
- lowpoint.y += (float)j / 13;
- lowpointtarget = lowpoint + facing * 1.3;
- flatfacing = player[k].coords;
- player[k].coords = colpoint - DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[k], 0) * .01;
- player[k].coords.y = lowpointtarget.y - .07;
- player[k].currentoffset = (flatfacing - player[k].coords) / player[k].scale;
-
- if (j > 10 || !player[k].isRun()) {
- if (player[k].animTarget == jumpdownanim || player[k].animTarget == jumpupanim) {
- if (k == 0)
- pause_sound(whooshsound);
- }
- emit_sound_at(jumpsound, player[k].coords, 128.);
-
- lowpointtarget = DoRotation(objects.model[i].facenormals[whichhit], 0, objects.yaw[i], 0);
- player[k].yaw = -asin(0 - lowpointtarget.x) * 180 / M_PI;
- if (lowpointtarget.z < 0)
- player[k].yaw = 180 - player[k].yaw;
- player[k].targetyaw = player[k].yaw;
- player[k].lowyaw = player[k].yaw;
-
- //player[k].velocity=lowpointtarget*.03;
- player[k].velocity = 0;
-
- //climb ledge (?)
- if (player[k].animTarget == jumpupanim) {
- player[k].animTarget = climbanim;
- player[k].jumppower = 0;
- player[k].jumpclimb = 1;
- }
- player[k].transspeed = 6;
- player[k].target = 0;
- player[k].frameTarget = 1;
- //hang ledge (?)
- if (j > 25) {
- player[k].setAnimation(hanganim);
- player[k].jumppower = 0;
- }
- }
- break;
- }
- }
- }
- }
- }
- }
- }
- }
- if (player[k].collide <= 0) {
- //in the air
- if (!player[k].onterrain &&
- player[k].animTarget != jumpupanim &&
- player[k].animTarget != jumpdownanim &&
- player[k].animTarget != climbanim &&
- player[k].animTarget != hanganim &&
- !player[k].isWallJump() &&
- !player[k].isFlip()) {
- if (player[k].animCurrent != climbanim &&
- player[k].animCurrent != tempanim &&
- player[k].animTarget != backhandspringanim &&
- (player[k].animTarget != rollanim ||
- player[k].frameTarget < 2 ||
- player[k].frameTarget > 6)) {
- //stagger off ledge (?)
- if (player[k].animTarget == staggerbackhighanim || player[k].animTarget == staggerbackhardanim)
- player[k].RagDoll(0);
- player[k].setAnimation(jumpdownanim);
-
- if (!k)
- emit_sound_at(whooshsound, player[k].coords, 128.);
- }
- //gravity
- player[k].velocity.y += gravity;
- }
- }
- }
- player[k].realoldcoords = player[k].coords;
- }
-}
-
-void doAttacks()
-{
- static XYZ relative;
- static int randattack;
- static bool playerrealattackkeydown = 0;
-
- if (!Input::isKeyDown(attackkey))
- oldattackkey = 0;
- if (oldattackkey)
- player[0].attackkeydown = 0;
- if (oldattackkey)
- playerrealattackkeydown = 0;
- if (!oldattackkey)
- playerrealattackkeydown = Input::isKeyDown(attackkey);
- if ((player[0].parriedrecently <= 0 ||
- player[0].weaponactive == -1) &&
- (!oldattackkey ||
- (realthreat &&
- player[0].lastattack != swordslashanim &&
- player[0].lastattack != knifeslashstartanim &&
- player[0].lastattack != staffhitanim &&
- player[0].lastattack != staffspinhitanim)))
- player[0].attackkeydown = Input::isKeyDown(attackkey);
- if (Input::isKeyDown(attackkey) &&
- !oldattackkey &&
- !player[0].backkeydown) {
- for (int k = 0; k < numplayers; k++) {
- if ((player[k].animTarget == swordslashanim ||
- player[k].animTarget == staffhitanim ||
- player[k].animTarget == staffspinhitanim) &&
- player[0].animCurrent != dodgebackanim &&
- !player[k].skeleton.free)
- player[k].Reverse();
- }
- }
-
- if (!hostile || indialogue != -1)
- player[0].attackkeydown = 0;
-
- for (int k = 0; k < numplayers; k++) {
- if (indialogue != -1)
- player[k].attackkeydown = 0;
- if (player[k].animTarget != rabbitrunninganim && player[k].animTarget != wolfrunninganim) {
- if (player[k].aitype != playercontrolled)
- player[k].victim = &player[0];
- //attack key pressed
- if (player[k].attackkeydown) {
- //dodge backward
- if (player[k].backkeydown &&
- player[k].animTarget != backhandspringanim &&
- (player[k].isIdle() ||
- player[k].isStop() ||
- player[k].isRun() ||
- player[k].animTarget == walkanim)) {
- if (player[k].jumppower <= 1) {
- player[k].jumppower -= 2;
- } else {
- for (int i = 0; i < numplayers; i++) {
- if (i == k)
- continue;
- if (player[i].animTarget == swordslashanim ||
- player[i].animTarget == knifeslashstartanim ||
- player[i].animTarget == staffhitanim ||
- player[i].animTarget == staffspinhitanim)
- if (distsq(&player[k].coords, &player[i].coords) < 6.5 && !player[i].skeleton.free) {
- player[k].setAnimation(dodgebackanim);
- player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
- player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
- }
- }
- if (player[k].animTarget != dodgebackanim) {
- if (k == 0)
- numflipped++;
- player[k].setAnimation(backhandspringanim);
- player[k].targetyaw = -yaw + 180;
- if (player[k].leftkeydown)
- player[k].targetyaw -= 45;
- if (player[k].rightkeydown)
- player[k].targetyaw += 45;
- player[k].yaw = player[k].targetyaw;
- player[k].jumppower -= 2;
- }
- }
- }
- //attack
- if (!animation[player[k].animTarget].attack &&
- !player[k].backkeydown &&
- (player[k].isIdle() ||
- player[k].isRun() ||
- player[k].animTarget == walkanim ||
- player[k].animTarget == sneakanim ||
- player[k].isCrouch())) {
- const int attackweapon = player[k].weaponactive == -1 ? 0 : weapons[player[k].weaponids[player[k].weaponactive]].getType();
- //normal attacks (?)
- player[k].hasvictim = 0;
- if (numplayers > 1)
- for (int i = 0; i < numplayers; i++) {
- if (i == k || !(k == 0 || i == 0))
- continue;
- if (!player[k].hasvictim)
- if (animation[player[k].animTarget].attack != reversal) {
- //choose an attack
- const float distance = distsq(&player[k].coords, &player[i].coords);
- if (distance < 4.5 &&
- !player[i].skeleton.free &&
- player[i].howactive < typedead1 &&
- player[i].animTarget != jumpreversedanim &&
- player[i].animTarget != rabbitkickreversedanim &&
- player[i].animTarget != rabbitkickanim &&
- player[k].animTarget != rabbitkickanim &&
- player[i].animTarget != getupfrombackanim &&
- (player[i].animTarget != staggerbackhighanim &&
- (player[i].animTarget != staggerbackhardanim ||
- animation[staggerbackhardanim].label[player[i].frameTarget] == 6)) &&
- player[i].animTarget != jumpdownanim &&
- player[i].animTarget != jumpupanim &&
- player[i].animTarget != getupfromfrontanim) {
- player[k].victim = &player[i];
- player[k].hasvictim = 1;
- if (player[k].aitype == playercontrolled) { //human player
- //sweep
- if (distance < 2.5 * sq(player[k].scale * 5) &&
- player[k].crouchkeydown &&
- animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = sweepanim;
- //winduppunch
- else if (distance < 1.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].forwardkeydown &&
- !player[k].leftkeydown &&
- !player[k].rightkeydown &&
- !player[k].crouchkeydown &&
- !attackweapon &&
- !reversaltrain)
- player[k].animTarget = winduppunchanim;
- //upunch
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].forwardkeydown &&
- !player[k].leftkeydown &&
- !player[k].rightkeydown &&
- !player[k].crouchkeydown &&
- !attackweapon)
- player[k].animTarget = upunchanim;
- //knifefollow
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- player[i].staggerdelay > 0 &&
- attackweapon == knife &&
- player[i].bloodloss > player[i].damagetolerance / 2)
- player[k].animTarget = knifefollowanim;
- //knifeslashstart
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].forwardkeydown &&
- !player[k].leftkeydown &&
- !player[k].rightkeydown &&
- !player[k].crouchkeydown &&
- attackweapon == knife &&
- player[k].weaponmissdelay <= 0)
- player[k].animTarget = knifeslashstartanim;
- //swordslash
- else if (distance < 4.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].crouchkeydown &&
- attackweapon == sword &&
- player[k].weaponmissdelay <= 0)
- player[k].animTarget = swordslashanim;
- //staffhit
- else if (distance < 4.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].crouchkeydown &&
- attackweapon == staff &&
- player[k].weaponmissdelay <= 0 &&
- !player[k].leftkeydown &&
- !player[k].rightkeydown &&
- !player[k].forwardkeydown)
- player[k].animTarget = staffhitanim;
- //staffspinhit
- else if (distance < 4.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight &&
- !player[k].crouchkeydown &&
- attackweapon == staff &&
- player[k].weaponmissdelay <= 0)
- player[k].animTarget = staffspinhitanim;
- //spinkick
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = spinkickanim;
- //lowkick
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height == lowheight &&
- animation[player[k].animTarget].attack != normalattack)
- player[k].animTarget = lowkickanim;
- } else { //AI player
- if (distance < 4.5 * sq(player[k].scale * 5)) {
- randattack = abs(Random() % 5);
- if (!attackweapon && distance < 2.5 * sq(player[k].scale * 5)) {
- //sweep
- if (randattack == 0 && animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = sweepanim;
- //upunch
- else if (randattack == 1 && animation[player[i].animTarget].height != lowheight &&
- !attackweapon)
- player[k].animTarget = upunchanim;
- //spinkick
- else if (randattack == 2 && animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = spinkickanim;
- //lowkick
- else if (animation[player[i].animTarget].height == lowheight)
- player[k].animTarget = lowkickanim;
- }
- if (attackweapon) {
- //sweep
- if ((tutoriallevel != 1 || !attackweapon) &&
- distance < 2.5 * sq(player[k].scale * 5) &&
- randattack == 0 &&
- animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = sweepanim;
- //knifeslashstart
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- attackweapon == knife &&
- player[k].weaponmissdelay <= 0)
- player[k].animTarget = knifeslashstartanim;
- //swordslash
- else if (!(player[0].victim == &player[i] &&
- player[0].hasvictim &&
- player[0].animTarget == swordslashanim) &&
- attackweapon == sword &&
- player[k].weaponmissdelay <= 0)
- player[k].animTarget = swordslashanim;
- //staffhit
- else if (!(player[0].victim == &player[i] &&
- player[0].hasvictim &&
- player[0].animTarget == swordslashanim) &&
- attackweapon == staff &&
- player[k].weaponmissdelay <= 0 &&
- randattack < 3)
- player[k].animTarget = staffhitanim;
- //staffspinhit
- else if (!(player[0].victim == &player[i] &&
- player[0].hasvictim &&
- player[0].animTarget == swordslashanim) &&
- attackweapon == staff &&
- player[k].weaponmissdelay <= 0 &&
- randattack >= 3)
- player[k].animTarget = staffspinhitanim;
- //spinkick
- else if ((tutoriallevel != 1 || !attackweapon) &&
- distance < 2.5 * sq(player[k].scale * 5) &&
- randattack == 1 &&
- animation[player[i].animTarget].height != lowheight)
- player[k].animTarget = spinkickanim;
- //lowkick
- else if (distance < 2.5 * sq(player[k].scale * 5) &&
- animation[player[i].animTarget].height == lowheight &&
- animation[player[k].animTarget].attack != normalattack)
- player[k].animTarget = lowkickanim;
- }
- }
- }
- //upunch becomes wolfslap
- if (player[k].animTarget == upunchanim && player[k].creature == wolftype)
- player[k].animTarget = wolfslapanim;
- }
- //sneak attacks
- if ((k == 0) && (tutoriallevel != 1 || tutorialstage == 22) &&
- player[i].howactive < typedead1 &&
- distance < 1.5 * sq(player[k].scale * 5) &&
- !player[i].skeleton.free &&
- player[i].animTarget != getupfrombackanim &&
- player[i].animTarget != getupfromfrontanim &&
- (player[i].stunned > 0 && player[k].madskills ||
- player[i].surprised > 0 ||
- player[i].aitype == passivetype ||
- attackweapon && player[i].stunned > 0) &&
- normaldotproduct(player[i].facing, player[i].coords - player[k].coords) > 0) {
- //sneakattack
- if (!attackweapon) {
- player[k].animCurrent = sneakattackanim;
- player[k].animTarget = sneakattackanim;
- player[i].animCurrent = sneakattackedanim;
- player[i].animTarget = sneakattackedanim;
- player[k].oldcoords = player[k].coords;
- player[k].coords = player[i].coords;
- }
- //knifesneakattack
- if (attackweapon == knife) {
- player[k].animCurrent = knifesneakattackanim;
- player[k].animTarget = knifesneakattackanim;
- player[i].animCurrent = knifesneakattackedanim;
- player[i].animTarget = knifesneakattackedanim;
- player[i].oldcoords = player[i].coords;
- player[i].coords = player[k].coords;
- }
- //swordsneakattack
- if (attackweapon == sword) {
- player[k].animCurrent = swordsneakattackanim;
- player[k].animTarget = swordsneakattackanim;
- player[i].animCurrent = swordsneakattackedanim;
- player[i].animTarget = swordsneakattackedanim;
- player[i].oldcoords = player[i].coords;
- player[i].coords = player[k].coords;
- }
- if (attackweapon != staff) {
- player[k].victim = &player[i];
- player[k].hasvictim = 1;
- player[i].targettilt2 = 0;
- player[i].frameTarget = 1;
- player[i].frameCurrent = 0;
- player[i].target = 0;
- player[i].velocity = 0;
- player[k].targettilt2 = player[i].targettilt2;
- player[k].frameCurrent = player[i].frameCurrent;
- player[k].frameTarget = player[i].frameTarget;
- player[k].target = player[i].target;
- player[k].velocity = 0;
- player[k].targetyaw = player[i].yaw;
- player[k].yaw = player[i].yaw;
- player[i].targetyaw = player[i].yaw;
- }
- }
- if (animation[player[k].animTarget].attack == normalattack &&
- player[k].victim == &player[i] &&
- (!player[i].skeleton.free)) {
- oldattackkey = 1;
- player[k].frameTarget = 0;
- player[k].target = 0;
-
- player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
- player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
- player[k].lastattack3 = player[k].lastattack2;
- player[k].lastattack2 = player[k].lastattack;
- player[k].lastattack = player[k].animTarget;
- }
- if (player[k].animTarget == knifefollowanim &&
- player[k].victim == &player[i]) {
- oldattackkey = 1;
- player[k].targetyaw = roughDirectionTo(player[k].coords, player[i].coords);
- player[k].targettilt2 = pitchTo(player[k].coords, player[i].coords);
- player[k].victim = &player[i];
- player[k].hasvictim = 1;
- player[i].animTarget = knifefollowedanim;
- player[i].animCurrent = knifefollowedanim;
- player[i].targettilt2 = 0;
- player[i].targettilt2 = player[k].targettilt2;
- player[i].frameTarget = 1;
- player[i].frameCurrent = 0;
- player[i].target = 0;
- player[i].velocity = 0;
- player[k].animCurrent = knifefollowanim;
- player[k].animTarget = knifefollowanim;
- player[k].targettilt2 = player[i].targettilt2;
- player[k].frameCurrent = player[i].frameCurrent;
- player[k].frameTarget = player[i].frameTarget;
- player[k].target = player[i].target;
- player[k].velocity = 0;
- player[k].oldcoords = player[k].coords;
- player[i].coords = player[k].coords;
- player[i].targetyaw = player[k].targetyaw;
- player[i].yaw = player[k].targetyaw;
- player[k].yaw = player[k].targetyaw;
- player[i].yaw = player[k].targetyaw;
- }
- }
- }
- const bool hasstaff = attackweapon == staff;
- if (k == 0 && numplayers > 1)
- for (int i = 0; i < numplayers; i++) {
- if (i == k)
- continue;
- if ((playerrealattackkeydown || player[i].dead || !hasstaff) &&
- animation[player[k].animTarget].attack == neutral) {
- const float distance = distsq(&player[k].coords, &player[i].coords);
- if (!player[i].dead || !realthreat || (!attackweapon && player[k].crouchkeydown))
- if (player[i].skeleton.free)
- if (distance < 3.5 * sq(player[k].scale * 5) &&
- (player[i].dead ||
- player[i].skeleton.longdead > 1000 ||
- player[k].isRun() ||
- hasstaff ||
- (attackweapon &&
- (player[i].skeleton.longdead > 2000 ||
- player[i].damage > player[i].damagetolerance / 8 ||
- player[i].bloodloss > player[i].damagetolerance / 2) &&
- distance < 1.5 * sq(player[k].scale * 5)))) {
- player[k].victim = &player[i];
- player[k].hasvictim = 1;
- if (attackweapon && tutoriallevel != 1) {
- //crouchstab
- if (player[k].crouchkeydown && attackweapon == knife && distance < 1.5 * sq(player[k].scale * 5))
- player[k].animTarget = crouchstabanim;
- //swordgroundstab
- if (player[k].crouchkeydown && distance < 1.5 * sq(player[k].scale * 5) && attackweapon == sword)
- player[k].animTarget = swordgroundstabanim;
- //staffgroundsmash
- if (distance < 3.5 * sq(player[k].scale * 5) && attackweapon == staff)
- player[k].animTarget = staffgroundsmashanim;
- }
- if (distance < 2.5 &&
- player[k].crouchkeydown &&
- player[k].animTarget != crouchstabanim &&
- !attackweapon &&
- player[i].dead &&
- player[i].skeleton.free &&
- player[i].skeleton.longdead > 1000) {
- player[k].animTarget = killanim;
- //TODO: refactor this out, what does it do?
- for (int j = 0; j < terrain.numdecals; j++) {
- if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
- terrain.decalalivetime[j] < 2)
- terrain.DeleteDecal(j);
- }
- for (int l = 0; l < objects.numobjects; l++) {
- if (objects.model[l].type == decalstype)
- for (int j = 0; j < objects.model[l].numdecals; j++) {
- if ((objects.model[l].decaltype[j] == blooddecal ||
- objects.model[l].decaltype[j] == blooddecalslow) &&
- objects.model[l].decalalivetime[j] < 2)
- objects.model[l].DeleteDecal(j);
- }
- }
- }
- if (!player[i].dead || musictype != 2)
- if (distance < 3.5 &&
- (player[k].isRun() || player[k].isIdle() && player[k].attackkeydown) &&
- player[k].staggerdelay <= 0 &&
- (player[i].dead ||
- player[i].skeleton.longdead < 300 &&
- player[k].lastattack != spinkickanim &&
- player[i].skeleton.free) &&
- (!player[i].dead || musictype != stream_fighttheme)) {
- player[k].animTarget = dropkickanim;
- for (int j = 0; j < terrain.numdecals; j++) {
- if ((terrain.decaltype[j] == blooddecal || terrain.decaltype[j] == blooddecalslow) &&
- terrain.decalalivetime[j] < 2) {
- terrain.DeleteDecal(j);
- }
- }
- for (int l = 0; l < objects.numobjects; l++) {
- if (objects.model[l].type == decalstype)
- for (int j = 0; j < objects.model[l].numdecals; j++) {
- if ((objects.model[l].decaltype[j] == blooddecal ||
- objects.model[l].decaltype[j] == blooddecalslow) &&
- objects.model[l].decalalivetime[j] < 2) {
- objects.model[l].DeleteDecal(j);
- }
- }
- }
- }
- }
- if (animation[player[k].animTarget].attack == normalattack &&
- player[k].victim == &player[i] &&
- (!player[i].skeleton.free ||
- player[k].animTarget == killanim ||
- player[k].animTarget == crouchstabanim ||
- player[k].animTarget == swordgroundstabanim ||
- player[k].animTarget == staffgroundsmashanim ||
- player[k].animTarget == dropkickanim)) {
- oldattackkey = 1;
- player[k].frameTarget = 0;
- player[k].target = 0;
-
- XYZ targetpoint = player[i].coords;
- if (player[k].animTarget == crouchstabanim ||
- player[k].animTarget == swordgroundstabanim ||
- player[k].animTarget == staffgroundsmashanim) {
- targetpoint += (player[i].jointPos(abdomen) +
- player[i].jointPos(neck)) / 2 *
- player[i].scale;
- }
- player[k].targetyaw = roughDirectionTo(player[k].coords, targetpoint);
- player[k].targettilt2 = pitchTo(player[k].coords, targetpoint);