2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2017 - Lugaru contributors (see AUTHORS file)
5 This file is part of Lugaru.
7 Lugaru is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 Lugaru is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with Lugaru. If not, see <http://www.gnu.org/licenses/>.
21 #include "Level/Dialog.hpp"
24 #include "Objects/Person.hpp"
25 #include "Utils/Folders.hpp"
26 #include "Utils/Input.hpp"
27 #include "Utils/binio.h"
31 int Dialog::indialogue;
32 int Dialog::whichdialogue;
33 bool Dialog::directing;
34 float Dialog::dialoguetime;
35 std::vector<Dialog> Dialog::dialogs;
37 void Dialog::loadDialogs(FILE* tfile)
40 funpackf(tfile, "Bi", &numdialogues);
41 for (int k = 0; k < numdialogues; k++) {
42 dialogs.push_back(Dialog(tfile));
46 Dialog::Dialog(FILE* tfile)
50 funpackf(tfile, "Bi", &numdialogscenes);
51 funpackf(tfile, "Bi", &type);
52 for (int l = 0; l < 10; l++) {
53 funpackf(tfile, "Bf Bf Bf", &participantlocation[l].x, &participantlocation[l].y, &participantlocation[l].z);
54 funpackf(tfile, "Bf", &participantyaw[l]);
56 for (int l = 0; l < numdialogscenes; l++) {
57 scenes.push_back(DialogScene(tfile));
61 std::string funpackf_string(FILE* tfile, int maxlength)
64 funpackf(tfile, "Bi", &templength);
65 if ((templength > maxlength) || (templength <= 0)) {
66 templength = maxlength;
69 char* text = new char[maxlength];
70 for (m = 0; m < templength; m++) {
71 funpackf(tfile, "Bb", &text[m]);
72 if (text[m] == '\0') {
77 std::string result(text);
82 void fpackf_string(FILE* tfile, std::string text)
84 fpackf(tfile, "Bi", text.size());
85 for (unsigned i = 0; i < text.size(); i++) {
86 fpackf(tfile, "Bb", text[i]);
87 if (text[i] == '\0') {
93 DialogScene::DialogScene(FILE* tfile)
95 funpackf(tfile, "Bi", &location);
96 funpackf(tfile, "Bf", &color[0]);
97 funpackf(tfile, "Bf", &color[1]);
98 funpackf(tfile, "Bf", &color[2]);
99 funpackf(tfile, "Bi", &sound);
101 text = funpackf_string(tfile, 128);
102 name = funpackf_string(tfile, 64);
104 funpackf(tfile, "Bf Bf Bf", &camera.x, &camera.y, &camera.z);
105 funpackf(tfile, "Bi", &participantfocus);
106 funpackf(tfile, "Bi", &participantaction);
108 for (int m = 0; m < 10; m++) {
109 funpackf(tfile, "Bf Bf Bf", &participantfacing[m].x, &participantfacing[m].y, &participantfacing[m].z);
112 funpackf(tfile, "Bf Bf", &camerayaw, &camerapitch);
115 /* Load dialog from txt file, used by console */
116 Dialog::Dialog(int type, std::string filename)
119 ifstream ipstream(Folders::getResourcePath(filename));
120 ipstream.ignore(256, ':');
122 ipstream >> numscenes;
123 for (int i = 0; i < numscenes; i++) {
124 scenes.push_back(DialogScene(ipstream));
125 for (unsigned j = 0; j < Person::players.size(); j++) {
126 scenes.back().participantfacing[j] = Person::players[j]->facing;
132 DialogScene::DialogScene(ifstream& ipstream)
134 ipstream.ignore(256, ':');
135 ipstream.ignore(256, ':');
136 ipstream.ignore(256, ' ');
137 ipstream >> location;
138 ipstream.ignore(256, ':');
139 ipstream >> color[0];
140 ipstream >> color[1];
141 ipstream >> color[2];
142 ipstream.ignore(256, ':');
143 getline(ipstream, name);
144 ipstream.ignore(256, ':');
145 ipstream.ignore(256, ' ');
146 getline(ipstream, text);
147 for (int j = 0; j < 128; j++) {
148 if (text[j] == '\\') {
152 ipstream.ignore(256, ':');
156 void Dialog::tick(int id)
158 unsigned playerId = type % 10;
159 bool special = (type > 9);
161 if ((!hostile || (type > 40) && (type < 50)) &&
162 (playerId < Person::players.size()) &&
164 ((gonethrough == 0) || !special) &&
165 (special || Input::isKeyPressed(Game::attackkey))) {
166 if ((distsq(&Person::players[0]->coords, &Person::players[playerId]->coords) < 6) ||
167 (Person::players[playerId]->howactive >= typedead1) ||
168 (type > 40) && (type < 50)) {
179 for (unsigned i = 0; i < scenes.size(); i++) {
180 int playerId = scenes[i].participantfocus;
181 Person::players.at(playerId)->coords = participantlocation[playerId];
182 Person::players[playerId]->yaw = participantyaw[playerId];
183 Person::players[playerId]->targetyaw = participantyaw[playerId];
184 Person::players[playerId]->velocity = 0;
185 Person::players[playerId]->animTarget = Person::players[playerId]->getIdle();
186 Person::players[playerId]->frameTarget = 0;
189 Dialog::directing = false;
190 Dialog::indialogue = 0;
192 if (scenes[indialogue].sound != 0) {
193 Game::playdialoguescenesound();
197 void Dialog::saveDialogs(FILE* tfile)
199 fpackf(tfile, "Bi", dialogs.size());
201 for (unsigned i = 0; i < dialogs.size(); i++) {
202 dialogs[i].save(tfile);
206 void Dialog::save(FILE* tfile)
208 fpackf(tfile, "Bi", scenes.size());
209 fpackf(tfile, "Bi", type);
210 for (int l = 0; l < 10; l++) {
211 fpackf(tfile, "Bf Bf Bf", participantlocation[l].x, participantlocation[l].y, participantlocation[l].z);
212 fpackf(tfile, "Bf", participantyaw[l]);
214 for (unsigned l = 0; l < scenes.size(); l++) {
215 scenes[l].save(tfile);
219 void DialogScene::save(FILE* tfile)
221 fpackf(tfile, "Bi", location);
222 fpackf(tfile, "Bf", color[0]);
223 fpackf(tfile, "Bf", color[1]);
224 fpackf(tfile, "Bf", color[2]);
225 fpackf(tfile, "Bi", sound);
227 fpackf_string(tfile, text);
228 fpackf_string(tfile, name);
230 fpackf(tfile, "Bf Bf Bf", camera.x, camera.y, camera.z);
231 fpackf(tfile, "Bi", participantfocus);
232 fpackf(tfile, "Bi", participantaction);
234 for (int m = 0; m < 10; m++) {
235 fpackf(tfile, "Bf Bf Bf", participantfacing[m].x, participantfacing[m].y, participantfacing[m].z);
238 fpackf(tfile, "Bf Bf", camerayaw, camerapitch);