X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=Source%2FGameDraw.cpp;h=76318a4775c4536f1ebba824e8825c73572e1f93;hb=3de67c0db8c3c74f5fb487579936a07770d253a1;hp=494042474917248a99a711c5e9f8a89d1ca38112;hpb=2d54e57ffa32e0a02013d79be57b8a2f3bc8db05;p=lugaru.git diff --git a/Source/GameDraw.cpp b/Source/GameDraw.cpp index 4940424..76318a4 100644 --- a/Source/GameDraw.cpp +++ b/Source/GameDraw.cpp @@ -23,6 +23,8 @@ along with Lugaru. If not, see . #include "Input.h" #include "Awards.h" #include "Menu.h" +#include "Dialog.h" +#include "Hotspot.h" extern XYZ viewer; extern int environment; @@ -30,7 +32,6 @@ extern float texscale; extern Light light; extern Terrain terrain; extern float multiplier; -extern float sps; extern float viewdistance; extern float fadestart; extern float screenwidth, screenheight; @@ -60,14 +61,8 @@ extern int netstate; extern float motionbluramount; extern bool isclient; extern bool alwaysblur; -extern int test; -extern bool tilt2weird; -extern bool tiltweird; -extern bool midweird; -extern bool proportionweird; -extern bool vertexweird[6]; extern bool velocityblur; -extern bool debugmode; +extern bool devtools; extern int mainmenu; extern int bloodtoggle; extern int difficulty; @@ -83,19 +78,9 @@ extern bool againbonus; extern float damagedealt; extern bool invertmouse; -extern int numhotspots; -extern int killhotspot; -extern XYZ hotspot[40]; -extern int hotspottype[40]; -extern float hotspotsize[40]; -extern char hotspottext[40][256]; -extern int currenthotspot;; - extern bool campaign; extern bool winfreeze; -extern float menupulse; - extern bool gamestart; extern bool gamestarted; @@ -116,13 +101,13 @@ enum drawmodes { realmotionblurmode, doublevisionmode, glowmode, }; -void Game::flash() // shouldn't be that way, these should be attributes and Person class should not change rendering. +void Game::flash(float amount, int delay) // shouldn't be that way, these should be attributes and Person class should not change rendering. { flashr = 1; flashg = 0; flashb = 0; - flashamount = 1; - flashdelay = 1; + flashamount = amount; + flashdelay = delay; } void DrawMenu(); @@ -319,7 +304,7 @@ int Game::DrawGLScene(StereoSide side) for (unsigned k = 0; k < Person::players.size(); k++) { if (!Person::players[k]->skeleton.free && Person::players[k]->playerdetail && Person::players[k]->howactive < typesleeping) if (frustum.SphereInFrustum(Person::players[k]->coords.x, Person::players[k]->coords.y + Person::players[k]->scale * 3, Person::players[k]->coords.z, Person::players[k]->scale * 7) && Person::players[k]->occluded < 25) - for (int i = 0; i < Person::players[k]->skeleton.num_joints; i++) { + for (int i = 0; i < Person::players[k]->skeleton.joints.size(); i++) { if (Person::players[k]->skeleton.joints[i].label == leftknee || Person::players[k]->skeleton.joints[i].label == rightknee || Person::players[k]->skeleton.joints[i].label == groin) { point = DoRotation(Person::players[k]->skeleton.joints[i].position, 0, Person::players[k]->yaw, 0) * Person::players[k]->scale + Person::players[k]->coords; size = .4f; @@ -344,7 +329,7 @@ int Game::DrawGLScene(StereoSide side) } if ((Person::players[k]->skeleton.free || Person::players[k]->howactive >= typesleeping) && Person::players[k]->playerdetail) if (frustum.SphereInFrustum(Person::players[k]->coords.x, Person::players[k]->coords.y, Person::players[k]->coords.z, Person::players[k]->scale * 5) && Person::players[k]->occluded < 25) - for (int i = 0; i < Person::players[k]->skeleton.num_joints; i++) { + for (int i = 0; i < Person::players[k]->skeleton.joints.size(); i++) { if (Person::players[k]->skeleton.joints[i].label == leftknee || Person::players[k]->skeleton.joints[i].label == rightknee || Person::players[k]->skeleton.joints[i].label == groin || Person::players[k]->skeleton.joints[i].label == leftelbow || Person::players[k]->skeleton.joints[i].label == rightelbow || Person::players[k]->skeleton.joints[i].label == neck) { if (Person::players[k]->skeleton.free) point = Person::players[k]->skeleton.joints[i].position * Person::players[k]->scale + Person::players[k]->coords; @@ -414,18 +399,6 @@ int Game::DrawGLScene(StereoSide side) glEnable(GL_COLOR_MATERIAL); - test = 2; - tilt2weird = 0; - tiltweird = 0; - midweird = 0; - proportionweird = 0; - vertexweird[0] = 0; - vertexweird[1] = 0; - vertexweird[2] = 0; - vertexweird[3] = 0; - vertexweird[4] = 0; - vertexweird[5] = 0; - if (!cellophane) { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_CULL_FACE); @@ -442,7 +415,7 @@ int Game::DrawGLScene(StereoSide side) if (distance >= 1) glDisable(GL_BLEND); if (distance >= .5) { - checkpoint = DoRotation(Person::players[k]->skeleton.joints[abs(Random() % Person::players[k]->skeleton.num_joints)].position, 0, Person::players[k]->yaw, 0) * Person::players[k]->scale + Person::players[k]->coords; + checkpoint = DoRotation(Person::players[k]->skeleton.joints[abs(Random() % Person::players[k]->skeleton.joints.size())].position, 0, Person::players[k]->yaw, 0) * Person::players[k]->scale + Person::players[k]->coords; checkpoint.y += 1; int i = -1; if (Person::players[k]->occluded != 0) @@ -507,7 +480,7 @@ int Game::DrawGLScene(StereoSide side) if (distance >= 1) glDisable(GL_BLEND); if (distance >= .5) { - checkpoint = DoRotation(Person::players[k]->skeleton.joints[abs(Random() % Person::players[k]->skeleton.num_joints)].position, 0, Person::players[k]->yaw, 0) * Person::players[k]->scale + Person::players[k]->coords; + checkpoint = DoRotation(Person::players[k]->skeleton.joints[abs(Random() % Person::players[k]->skeleton.joints.size())].position, 0, Person::players[k]->yaw, 0) * Person::players[k]->scale + Person::players[k]->coords; checkpoint.y += 1; int i = -1; if (Person::players[k]->occluded != 0) @@ -586,7 +559,7 @@ int Game::DrawGLScene(StereoSide side) glColor4f(.5, .5, .5, 1); if (!console) { if (!tutoriallevel) - if (bonus > 0 && bonustime < 1 && !winfreeze && indialogue == -1/*bonustime<4*/) { + if (bonus > 0 && bonustime < 1 && !winfreeze && !Dialog::inDialog()) { const char *bonus_name; if (bonus < bonus_count) bonus_name = bonus_names[bonus]; @@ -911,26 +884,25 @@ int Game::DrawGLScene(StereoSide side) text->glPrint(screenwidth / 2 - 7.6 * strlen(string2)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 20 * .8 * screenwidth / 1024, string2, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight); text->glPrint(screenwidth / 2 - 7.6 * strlen(string3)*screenwidth / 1024 * .8, 0 + screenheight * 1 / 10 - 40 * .8 * screenwidth / 1024, string3, 1, 1.5 * screenwidth / 1024 * .8, screenwidth, screenheight); } - //Hot spots - if (numhotspots && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) { + //Hot spots + if (Hotspot::hotspots.size() && (bonustime >= 1 || bonus <= 0 || bonustime < 0) && !tutoriallevel) { float closestdist = -1; float distance = 0; - int closest = currenthotspot; - for (int i = 0; i < numhotspots; i++) { - distance = distsq(&Person::players[0]->coords, &hotspot[i]); + int closest = Hotspot::current; + for (int i = 0; i < Hotspot::hotspots.size(); i++) { + distance = distsq(&Person::players[0]->coords, &Hotspot::hotspots[i].position); if (closestdist == -1 || distance < closestdist) { - if (distsq(&Person::players[0]->coords, &hotspot[i]) < hotspotsize[i] && ((hotspottype[i] <= 10 && hotspottype[i] >= 0) || (hotspottype[i] <= 40 && hotspottype[i] >= 20))) { + if (distsq(&Person::players[0]->coords, &Hotspot::hotspots[i].position) < Hotspot::hotspots[i].size && ((Hotspot::hotspots[i].type <= 10 && Hotspot::hotspots[i].type >= 0) || (Hotspot::hotspots[i].type <= 40 && Hotspot::hotspots[i].type >= 20))) { closestdist = distance; closest = i; } } } - if (closest != -1) - currenthotspot = closest; - if (currenthotspot != -1) { - if (hotspottype[closest] <= 10) { - if (distsq(&Person::players[0]->coords, &hotspot[closest]) < hotspotsize[closest]) + if (closest != -1) { + Hotspot::current = closest; + if (Hotspot::hotspots[closest].type <= 10) { + if (distsq(&Person::players[0]->coords, &Hotspot::hotspots[closest].position) < Hotspot::hotspots[closest].size) tutorialstagetime = 0; tutorialmaxtime = 1; tutorialopac = tutorialmaxtime - tutorialstagetime; @@ -939,7 +911,7 @@ int Game::DrawGLScene(StereoSide side) if (tutorialopac < 0) tutorialopac = 0; - sprintf (string, "%s", hotspottext[closest]); + sprintf (string, "%s", Hotspot::hotspots[closest].text); int lastline = 0; int line = 0; @@ -960,48 +932,15 @@ int Game::DrawGLScene(StereoSide side) done = 1; i++; } - } else if (hotspottype[closest] >= 20 && dialoguegonethrough[hotspottype[closest] - 20] == 0) { - whichdialogue = hotspottype[closest] - 20; - for (int j = 0; j < numdialogueboxes[whichdialogue]; j++) { - Person::players[participantfocus[whichdialogue][j]]->coords = participantlocation[whichdialogue][participantfocus[whichdialogue][j]]; - Person::players[participantfocus[whichdialogue][j]]->yaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]]; - Person::players[participantfocus[whichdialogue][j]]->targetyaw = participantyaw[whichdialogue][participantfocus[whichdialogue][j]]; - Person::players[participantfocus[whichdialogue][j]]->velocity = 0; - Person::players[participantfocus[whichdialogue][j]]->animTarget = Person::players[participantfocus[whichdialogue][j]]->getIdle(); - Person::players[participantfocus[whichdialogue][j]]->frameTarget = 0; - } - directing = 0; - indialogue = 0; - dialoguegonethrough[whichdialogue]++; - if (dialogueboxsound[whichdialogue][indialogue] != 0) { - int whichsoundplay; - if (dialogueboxsound[whichdialogue][indialogue] == 1) whichsoundplay = rabbitchitter; - if (dialogueboxsound[whichdialogue][indialogue] == 2) whichsoundplay = rabbitchitter2; - if (dialogueboxsound[whichdialogue][indialogue] == 3) whichsoundplay = rabbitpainsound; - if (dialogueboxsound[whichdialogue][indialogue] == 4) whichsoundplay = rabbitpain1sound; - if (dialogueboxsound[whichdialogue][indialogue] == 5) whichsoundplay = rabbitattacksound; - if (dialogueboxsound[whichdialogue][indialogue] == 6) whichsoundplay = rabbitattack2sound; - if (dialogueboxsound[whichdialogue][indialogue] == 7) whichsoundplay = rabbitattack3sound; - if (dialogueboxsound[whichdialogue][indialogue] == 8) whichsoundplay = rabbitattack4sound; - if (dialogueboxsound[whichdialogue][indialogue] == 9) whichsoundplay = growlsound; - if (dialogueboxsound[whichdialogue][indialogue] == 10) whichsoundplay = growl2sound; - if (dialogueboxsound[whichdialogue][indialogue] == 11) whichsoundplay = snarlsound; - if (dialogueboxsound[whichdialogue][indialogue] == 12) whichsoundplay = snarl2sound; - if (dialogueboxsound[whichdialogue][indialogue] == 13) whichsoundplay = barksound; - if (dialogueboxsound[whichdialogue][indialogue] == 14) whichsoundplay = bark2sound; - if (dialogueboxsound[whichdialogue][indialogue] == 15) whichsoundplay = bark3sound; - if (dialogueboxsound[whichdialogue][indialogue] == 16) whichsoundplay = barkgrowlsound; - if (dialogueboxsound[whichdialogue][indialogue] == -1) whichsoundplay = fireendsound; - if (dialogueboxsound[whichdialogue][indialogue] == -2) whichsoundplay = firestartsound; - if (dialogueboxsound[whichdialogue][indialogue] == -3) whichsoundplay = consolesuccesssound; - if (dialogueboxsound[whichdialogue][indialogue] == -4) whichsoundplay = consolefailsound; - emit_sound_at(whichsoundplay, Person::players[participantfocus[whichdialogue][indialogue]]->coords); - } + } else if ((Hotspot::hotspots[closest].type >= 20) && (Dialog::dialogs[Hotspot::hotspots[closest].type - 20].gonethrough == 0)) { + Dialog::whichdialogue = Hotspot::hotspots[closest].type - 20; + Dialog::currentDialog().play(); + Dialog::currentDialog().gonethrough++; } } } - if (indialogue != -1 && !mainmenu) { + if (Dialog::inDialog() && !mainmenu) { glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glDisable(GL_LIGHTING); @@ -1014,13 +953,13 @@ int Game::DrawGLScene(StereoSide side) glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); - if (dialogueboxlocation[whichdialogue][indialogue] == 1) + if (Dialog::currentScene().location == 1) glTranslatef(0, screenheight * 3 / 4, 0); glScalef(screenwidth, screenheight / 4, 1); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); - glColor4f(dialogueboxcolor[whichdialogue][indialogue][0], dialogueboxcolor[whichdialogue][indialogue][1], dialogueboxcolor[whichdialogue][indialogue][2], 0.7); + glColor4f(Dialog::currentScene().color[0], Dialog::currentScene().color[1], Dialog::currentScene().color[2], 0.7); glBegin(GL_QUADS); glVertex3f(0, 0, 0.0f); glVertex3f(1, 0, 0.0f); @@ -1043,32 +982,28 @@ int Game::DrawGLScene(StereoSide side) float starty; startx = screenwidth * 1 / 5; - if (dialogueboxlocation[whichdialogue][indialogue] == 1) + if (Dialog::currentScene().location == 1) starty = screenheight / 16 + screenheight * 4 / 5; - if (dialogueboxlocation[whichdialogue][indialogue] == 2) + if (Dialog::currentScene().location == 2) starty = screenheight * 1 / 5 - screenheight / 16; char tempname[264]; - bool goodchar; int tempnum = 0; for (int i = 0; i < 264; i++) { tempname[i] = '\0'; } - for (int i = 0; i < (int)strlen(dialoguename[whichdialogue][indialogue]); i++) { - tempname[tempnum] = dialoguename[whichdialogue][indialogue][i]; - goodchar = 1; - if (dialoguename[whichdialogue][indialogue][i] == '#' || dialoguename[whichdialogue][indialogue][i] == '\0') - goodchar = 0; - if (goodchar) - tempnum++; - else + for (int i = 0; i < Dialog::currentScene().name.size(); i++) { + tempname[tempnum] = Dialog::currentScene().name[i]; + if (tempname[tempnum] == '#' || tempname[tempnum] == '\0') tempname[tempnum] = '\0'; + else + tempnum++; } sprintf (string, "%s: ", tempname); - if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) { + if (Dialog::currentScene().color[0] + Dialog::currentScene().color[1] + Dialog::currentScene().color[2] < 1.5) { glColor4f(0, 0, 0, tutorialopac); text->glPrintOutline(startx - 2 * 7.6 * strlen(string)*screenwidth / 1024 - 4, starty - 4, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight); glColor4f(0.7, 0.7, 0.7, tutorialopac); @@ -1079,9 +1014,9 @@ int Game::DrawGLScene(StereoSide side) } tempnum = 0; - for (int i = 0; i < (int)strlen(dialoguetext[whichdialogue][indialogue]) + 1; i++) { - tempname[tempnum] = dialoguetext[whichdialogue][indialogue][i]; - if (dialoguetext[whichdialogue][indialogue][i] != '#') + for (int i = 0; i < Dialog::currentScene().text.size() + 1; i++) { + tempname[tempnum] = Dialog::currentScene().text[i]; + if (Dialog::currentScene().text[i] != '#') tempnum++; } @@ -1093,7 +1028,7 @@ int Game::DrawGLScene(StereoSide side) int i = 0; while (!done) { if (string[i] == '\n' || string[i] > 'z' || string[i] < ' ' || string[i] == '\0') { - if (dialogueboxcolor[whichdialogue][indialogue][0] + dialogueboxcolor[whichdialogue][indialogue][1] + dialogueboxcolor[whichdialogue][indialogue][2] < 1.5) { + if (Dialog::currentScene().color[0] + Dialog::currentScene().color[1] + Dialog::currentScene().color[2] < 1.5) { glColor4f(0, 0, 0, tutorialopac); text->glPrintOutline(startx/*-7.6*(i-lastline)*screenwidth/1024*/ - 4, starty - 4 - 20 * screenwidth / 1024 * line, string, 1, 1.5 * 1.25 * screenwidth / 1024, screenwidth, screenheight, lastline, i); glColor4f(1, 1, 1, tutorialopac); @@ -1113,12 +1048,12 @@ int Game::DrawGLScene(StereoSide side) } } - if (!tutoriallevel && !winfreeze && indialogue == -1 && !mainmenu) { + if (!tutoriallevel && !winfreeze && !Dialog::inDialog() && !mainmenu) { if (campaign) { if (scoreadded) - sprintf (string, "Score: %d", (int)accountactive->getCampaignScore()); + sprintf (string, "Score: %d", (int)Account::active->getCampaignScore()); else - sprintf (string, "Score: %d", (int)accountactive->getCampaignScore() + (int)bonustotal); + sprintf (string, "Score: %d", (int)Account::active->getCampaignScore() + (int)bonustotal); } if (!campaign) sprintf (string, "Score: %d", (int)bonustotal); @@ -1215,7 +1150,7 @@ int Game::DrawGLScene(StereoSide side) glColor4f(.5, .5, .5, 1); - if ((texttoggle || editorenabled) && debugmode && !mainmenu) { + if ((texttoggle || editorenabled) && devtools && !mainmenu) { sprintf (string, "The framespersecond is %d.", (int)(fps)); text->glPrint(10, 30, string, 0, .8, 1024, 768); @@ -1425,7 +1360,7 @@ int Game::DrawGLScene(StereoSide side) } } - if (difficulty < 2 && indialogue == -1) { // minimap + if (difficulty < 2 && !Dialog::inDialog()) { // minimap float mapviewdist = 20000; glDisable(GL_DEPTH_TEST); @@ -1455,45 +1390,9 @@ int Game::DrawGLScene(StereoSide side) XYZ center; float radius; float distcheck; - int numliveplayers = 0; - center = 0; - for (unsigned i = 0; i < Person::players.size(); i++) { - if (!Person::players[i]->dead) - numliveplayers++; - } - - int numadd = 0; - - for (int i = 0; i < objects.numobjects; i++) { - if (objects.type[i] == treetrunktype || objects.type[i] == boxtype) { - center += objects.position[i]; - numadd++; - } - } - for (unsigned i = 0; i < Person::players.size(); i++) { - if (!Person::players[i]->dead) - center += Person::players[i]->coords; - } - center /= numadd + numliveplayers; center = Person::players[0]->coords; - float maxdistance = 0; - float tempdist; - for (int i = 0; i < objects.numobjects; i++) { - tempdist = distsq(¢er, &objects.position[i]); - if (tempdist > maxdistance) { - maxdistance = tempdist; - } - } - for (unsigned i = 0; i < Person::players.size(); i++) { - if (!Person::players[i]->dead) { - tempdist = distsq(¢er, &Person::players[i]->coords); - if (tempdist > maxdistance) { - maxdistance = tempdist; - } - } - } radius = 110; glScalef(.25 / radius * 256 * terrain.scale * .4, .25 / radius * 256 * terrain.scale * .4, 1); @@ -1711,21 +1610,19 @@ int Game::DrawGLScene(StereoSide side) sprintf (string, "Score: %d", (int)(bonustotal - startbonustotal)); text->glPrintOutlined(1024 / 30, 768 * 6 / 8, string, 1, 2, 1024, 768); - if (campaign) - sprintf (string, "Press Escape or Space to continue"); - else - sprintf (string, "Press Escape to return to menu or Space to continue"); + sprintf (string, "Press Escape to return to menu or Space to continue"); text->glPrintOutlined(640 / 2 - strlen(string) * 5, 480 * 1 / 16, string, 1, 1, 640, 480); char temp[255]; for (int i = 0; i < 255; i++) string[i] = '\0'; - sprintf (temp, "Time: %d:", (int)(((int)leveltime - (int)(leveltime) % 60) / 60)); + int wontime = (int)round(wonleveltime); + sprintf (temp, "Time: %d:", int((wontime - wontime % 60) / 60)); strcat(string, temp); - if ((int)(leveltime) % 60 < 10) + if (wontime % 60 < 10) strcat(string, "0"); - sprintf (temp, "%d", (int)(leveltime) % 60); + sprintf (temp, "%d", wontime % 60); strcat(string, temp); text->glPrintOutlined(1024 / 30, 768 * 6 / 8 - 40, string, 1, 2, 1024, 768);