+ 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;
+
+ Person::players[1]->coords = (temp + temp2) / 2;
+
+ emit_sound_at(fireendsound, Person::players[1]->coords);
+
+ for (int i = 0; i < Person::players[1]->skeleton.num_joints; i++) {
+ if (Random() % 2 == 0) {
+ if (!Person::players[1]->skeleton.free)
+ temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2;
+ if (Person::players[1]->skeleton.free)
+ temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2;
+ if (!Person::players[1]->skeleton.free)
+ temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords;
+ if (Person::players[1]->skeleton.free)
+ temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[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;
+ Person::players[1]->aitype = attacktypecutoff;
+ break;
+ case 28:
+ tutorialmaxtime = 400;
+ break;
+ case 29:
+ tutorialmaxtime = 400;
+ Person::players[0]->escapednum = 0;
+ break;
+ case 30:
+ tutorialmaxtime = 4;
+ reversaltrain = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+ break;
+ case 31:
+ tutorialmaxtime = 13;
+ break;
+ case 32:
+ tutorialmaxtime = 8;
+ break;
+ case 33:
+ tutorialmaxtime = 400;
+ cananger = 1;
+ canattack = 1;
+ Person::players[1]->aitype = attacktypecutoff;
+ break;
+ case 34:
+ tutorialmaxtime = 400;
+ break;
+ case 35:
+ tutorialmaxtime = 400;
+ break;
+ case 36:
+ tutorialmaxtime = 2;
+ reversaltrain = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+ break;
+ case 37:
+ damagedealt = 0;
+ damagetaken = 0;
+ tutorialmaxtime = 50;
+ cananger = 1;
+ canattack = 1;
+ Person::players[1]->aitype = attacktypecutoff;
+ break;
+ case 38:
+ tutorialmaxtime = 4;
+ canattack = 0;
+ cananger = 0;
+ Person::players[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;
+ Person::players[0]->weaponactive = -1;
+ Person::players[0]->num_weapons = 0;
+ Person::players[1]->weaponactive = 0;
+ Person::players[1]->num_weapons = 1;
+ Person::players[1]->weaponids[0] = 0;
+
+ cananger = 1;
+ canattack = 1;
+ Person::players[1]->aitype = attacktypecutoff;
+
+ tutorialmaxtime = 300;
+ break;
+ case 45:
+ weapons[0].owner = 1;
+ Person::players[0]->weaponactive = -1;
+ Person::players[0]->num_weapons = 0;
+ Person::players[1]->weaponactive = 0;
+ Person::players[1]->num_weapons = 1;
+ Person::players[1]->weaponids[0] = 0;
+
+ tutorialmaxtime = 300;
+ break;
+ case 46:
+ weapons[0].owner = 1;
+ Person::players[0]->weaponactive = -1;
+ Person::players[0]->num_weapons = 0;
+ Person::players[1]->weaponactive = 0;
+ Person::players[1]->num_weapons = 1;
+ Person::players[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;
+ Person::players[0]->weaponactive = 0;
+ Person::players[0]->num_weapons = 1;
+ Person::players[0]->weaponids[0] = 1;
+ Person::players[1]->weaponactive = 0;
+ Person::players[1]->num_weapons = 1;
+ Person::players[1]->weaponids[0] = 0;
+
+ }
+ break;
+ case 48:
+ canattack = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+
+ tutorialmaxtime = 15;
+
+ weapons[0].owner = 1;
+ weapons[1].owner = 0;
+ Person::players[0]->weaponactive = 0;
+ Person::players[0]->num_weapons = 1;
+ Person::players[0]->weaponids[0] = 1;
+ Person::players[1]->weaponactive = 0;
+ Person::players[1]->num_weapons = 1;
+ Person::players[1]->weaponids[0] = 0;
+
+ if (Person::players[0]->weaponactive != -1)
+ weapons[Person::players[0]->weaponids[Person::players[0]->weaponactive]].setType(staff);
+ else
+ weapons[0].setType(staff);
+ break;
+ case 49:
+ canattack = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+
+ tutorialmaxtime = 200;
+
+ weapons[1].position = 1000;
+ weapons[1].tippoint = 1000;
+
+ weapons[0].setType(knife);
+
+ weapons[0].owner = 0;
+ Person::players[1]->weaponactive = -1;
+ Person::players[1]->num_weapons = 0;
+ Person::players[0]->weaponactive = 0;
+ Person::players[0]->num_weapons = 1;
+ Person::players[0]->weaponids[0] = 0;
+
+ break;
+ case 50: {
+ tutorialmaxtime = 8;
+
+ XYZ temp, temp2;
+ emit_sound_at(fireendsound, Person::players[1]->coords);
+
+ for (int i = 0; i < Person::players[1]->skeleton.num_joints; i++) {
+ if (Random() % 2 == 0) {
+ if (!Person::players[1]->skeleton.free)
+ temp2 = (Person::players[1]->coords - Person::players[1]->oldcoords) / multiplier / 2; //velocity/2;
+ if (Person::players[1]->skeleton.free)
+ temp2 = Person::players[1]->skeleton.joints[i].velocity * Person::players[1]->scale / 2;
+ if (!Person::players[1]->skeleton.free)
+ temp = DoRotation(DoRotation(DoRotation(Person::players[1]->skeleton.joints[i].position, 0, 0, Person::players[1]->tilt), Person::players[1]->tilt2, 0, 0), 0, Person::players[1]->yaw, 0) * Person::players[1]->scale + Person::players[1]->coords;
+ if (Person::players[1]->skeleton.free)
+ temp = Person::players[1]->skeleton.joints[i].position * Person::players[1]->scale + Person::players[1]->coords;
+ Sprite::MakeSprite(breathsprite, temp, temp2, 1, 1, 1, .6 + (float)abs(Random() % 100) / 200 - .25, 1);
+ }
+ }
+
+ Person::players[1]->num_weapons = 0;
+ Person::players[1]->weaponstuck = -1;
+ Person::players[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 (Person::players[0]->forwardkeydown || Person::players[0]->backkeydown || Person::players[0]->leftkeydown || Person::players[0]->rightkeydown)
+ tutorialsuccess += multiplier;
+ break;
+ case 5:
+ if (Person::players[0]->jumpkeydown)
+ tutorialsuccess = 1;
+ break;
+ case 6:
+ if (Person::players[0]->isCrouch())
+ tutorialsuccess = 1;
+ break;
+ case 7:
+ if (Person::players[0]->animTarget == rollanim)
+ tutorialsuccess = 1;
+ break;
+ case 8:
+ if (Person::players[0]->animTarget == sneakanim)
+ tutorialsuccess += multiplier;
+ break;
+ case 9:
+ if (Person::players[0]->animTarget == rabbitrunninganim || Person::players[0]->animTarget == wolfrunninganim)
+ tutorialsuccess += multiplier;
+ break;
+ case 11:
+ if (Person::players[0]->isWallJump())
+ tutorialsuccess = 1;
+ break;
+ case 12:
+ if (Person::players[0]->animTarget == flipanim)
+ tutorialsuccess = 1;
+ break;
+ case 15:
+ if (Person::players[0]->animTarget == upunchanim || Person::players[0]->animTarget == winduppunchanim)
+ tutorialsuccess = 1;
+ break;
+ case 16:
+ if (Person::players[0]->animTarget == winduppunchanim)
+ tutorialsuccess = 1;
+ break;
+ case 17:
+ if (Person::players[0]->animTarget == spinkickanim)
+ tutorialsuccess = 1;
+ break;
+ case 18:
+ if (Person::players[0]->animTarget == sweepanim)
+ tutorialsuccess = 1;
+ break;
+ case 19:
+ if (Person::players[0]->animTarget == dropkickanim)
+ tutorialsuccess = 1;
+ break;
+ case 20:
+ if (Person::players[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 (Person::players[0]->animTarget == walljumprightkickanim || Person::players[0]->animTarget == walljumpleftkickanim)
+ tutorialsuccess = 1;
+ break;
+ case 24:
+ if (Person::players[0]->animTarget == rabbittacklinganim)
+ tutorialsuccess = 1;
+ break;
+ case 25:
+ if (Person::players[0]->animTarget == backhandspringanim)
+ tutorialsuccess = 1;
+ break;
+ case 28:
+ if (animation[Person::players[0]->animTarget].attack == reversed && Person::players[0]->feint)
+ tutorialsuccess = 1;
+ break;
+ case 29:
+ if (Person::players[0]->escapednum == 2) {
+ tutorialsuccess = 1;
+ reversaltrain = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+ }
+ break;
+ case 33:
+ if (animation[Person::players[0]->animTarget].attack == reversal)
+ tutorialsuccess = 1;
+ break;
+ case 34:
+ if (animation[Person::players[0]->animTarget].attack == reversal)
+ tutorialsuccess = 1;
+ break;
+ case 35:
+ if (animation[Person::players[0]->animTarget].attack == reversal) {
+ tutorialsuccess = 1;
+ reversaltrain = 0;
+ cananger = 0;
+ Person::players[1]->aitype = passivetype;
+ }
+ break;
+ case 40:
+ if (Person::players[0]->num_weapons > 0)
+ tutorialsuccess = 1;
+ break;
+ case 41:
+ if (Person::players[0]->weaponactive == -1 && Person::players[0]->num_weapons > 0)
+ tutorialsuccess = 1;
+ break;
+ case 43:
+ if (Person::players[0]->animTarget == knifeslashstartanim)
+ tutorialsuccess = 1;
+ break;
+ case 44:
+ if (animation[Person::players[0]->animTarget].attack == reversal)
+ tutorialsuccess = 1;
+ break;
+ case 45:
+ if (animation[Person::players[0]->animTarget].attack == reversal)
+ tutorialsuccess = 1;
+ break;
+ case 46:
+ if (animation[Person::players[0]->animTarget].attack == reversal)
+ tutorialsuccess = 1;
+ break;
+ case 49:
+ if (Person::players[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) {
+ Person::players[1]->coords.y = 300;
+ Person::players[1]->velocity = 0;
+ }
+}
+
+void doDebugKeys()
+{
+ float headprop, bodyprop, armprop, legprop;
+ if (debugmode) {
+ if (Input::isKeyPressed(SDL_SCANCODE_H)) {
+ Person::players[0]->damagetolerance = 200000;
+ Person::players[0]->damage = 0;
+ Person::players[0]->burnt = 0;
+ Person::players[0]->permanentdamage = 0;
+ Person::players[0]->superpermanentdamage = 0;
+ }
+
+ if (Input::isKeyPressed(SDL_SCANCODE_J)) {
+ environment++;
+ if (environment > 2)
+ environment = 0;
+ Setenvironment(environment);
+ }
+
+ if (Input::isKeyPressed(SDL_SCANCODE_C)) {
+ cameramode = 1 - cameramode;
+ }
+
+ if (Input::isKeyPressed(SDL_SCANCODE_X) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ if (Person::players[0]->num_weapons > 0) {
+ if (weapons[Person::players[0]->weaponids[0]].getType() == sword)
+ weapons[Person::players[0]->weaponids[0]].setType(staff);
+ else if (weapons[Person::players[0]->weaponids[0]].getType() == staff)
+ weapons[Person::players[0]->weaponids[0]].setType(knife);
+ else
+ weapons[Person::players[0]->weaponids[0]].setType(sword);
+ }
+ }
+
+ if (Input::isKeyPressed(SDL_SCANCODE_X) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ if (Person::players[closest]->num_weapons) {
+ if (weapons[Person::players[closest]->weaponids[0]].getType() == sword)
+ weapons[Person::players[closest]->weaponids[0]].setType(staff);
+ else if (weapons[Person::players[closest]->weaponids[0]].getType() == staff)
+ weapons[Person::players[closest]->weaponids[0]].setType(knife);
+ else
+ weapons[Person::players[closest]->weaponids[0]].setType(sword);
+ }
+ if (!Person::players[closest]->num_weapons) {
+ Person::players[closest]->weaponids[0] = weapons.size();
+
+ weapons.push_back(Weapon(knife, closest));
+
+ Person::players[closest]->num_weapons = 1;
+ }
+ }
+ }
+
+ if (Input::isKeyDown(SDL_SCANCODE_U)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ Person::players[closest]->yaw += multiplier * 50;
+ Person::players[closest]->targetyaw = Person::players[closest]->yaw;
+ }
+ }
+
+
+ if (Input::isKeyPressed(SDL_SCANCODE_O) && !Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (Input::isKeyDown(SDL_SCANCODE_LCTRL))
+ closest = 0;
+
+ if (closest >= 0) {
+ Person::players[closest]->whichskin++;
+ if (Person::players[closest]->whichskin > 9)
+ Person::players[closest]->whichskin = 0;
+ if (Person::players[closest]->whichskin > 2 && Person::players[closest]->creature == wolftype)
+ Person::players[closest]->whichskin = 0;
+
+ Person::players[closest]->skeleton.drawmodel.textureptr.load(creatureskin[Person::players[closest]->creature][Person::players[closest]->whichskin], 1,
+ &Person::players[closest]->skeleton.skinText[0], &Person::players[closest]->skeleton.skinsize);
+ }
+
+ if (Person::players[closest]->numclothes) {
+ for (int i = 0; i < Person::players[closest]->numclothes; i++) {
+ tintr = Person::players[closest]->clothestintr[i];
+ tintg = Person::players[closest]->clothestintg[i];
+ tintb = Person::players[closest]->clothestintb[i];
+ AddClothes((char *)Person::players[closest]->clothes[i], &Person::players[closest]->skeleton.skinText[0]);
+ }
+ Person::players[closest]->DoMipmaps();
+ }
+ }
+
+ if (Input::isKeyPressed(SDL_SCANCODE_O) && Input::isKeyDown(SDL_SCANCODE_LSHIFT)) {
+ int closest = findClosestPlayer();
+ if (closest >= 0) {
+ if (Person::players[closest]->creature == wolftype) {
+ headprop = Person::players[closest]->proportionhead.x / 1.1;
+ bodyprop = Person::players[closest]->proportionbody.x / 1.1;
+ armprop = Person::players[closest]->proportionarms.x / 1.1;
+ legprop = Person::players[closest]->proportionlegs.x / 1.1;
+ }
+
+ if (Person::players[closest]->creature == rabbittype) {
+ headprop = Person::players[closest]->proportionhead.x / 1.2;
+ bodyprop = Person::players[closest]->proportionbody.x / 1.05;
+ armprop = Person::players[closest]->proportionarms.x / 1.00;
+ legprop = Person::players[closest]->proportionlegs.x / 1.1;
+ }
+