]> git.jsancho.org Git - lugaru.git/blob - Source/Level/Dialog.cpp
Added braces to all statements with clang-tidy and ran clang-format again
[lugaru.git] / Source / Level / Dialog.cpp
1 /*
2 Copyright (C) 2003, 2010 - Wolfire Games
3 Copyright (C) 2010-2016 - Lugaru contributors (see AUTHORS file)
4
5 This file is part of Lugaru.
6
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.
11
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.
16
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/>.
19 */
20
21 #include "Level/Dialog.hpp"
22
23 #include "Game.hpp"
24 #include "Objects/Person.hpp"
25 #include "Utils/Folders.hpp"
26 #include "Utils/Input.hpp"
27 #include "Utils/binio.h"
28
29 extern int hostile;
30
31 int Dialog::indialogue;
32 int Dialog::whichdialogue;
33 bool Dialog::directing;
34 float Dialog::dialoguetime;
35 std::vector<Dialog> Dialog::dialogs;
36
37 void Dialog::loadDialogs(FILE* tfile)
38 {
39     int numdialogues;
40     funpackf(tfile, "Bi", &numdialogues);
41     for (int k = 0; k < numdialogues; k++) {
42         dialogs.push_back(Dialog(tfile));
43     }
44 }
45
46 Dialog::Dialog(FILE* tfile)
47     : gonethrough(0)
48 {
49     int numdialogscenes;
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]);
55     }
56     for (int l = 0; l < numdialogscenes; l++) {
57         scenes.push_back(DialogScene(tfile));
58     }
59 }
60
61 std::string funpackf_string(FILE* tfile, int maxlength)
62 {
63     int templength;
64     funpackf(tfile, "Bi", &templength);
65     if ((templength > maxlength) || (templength <= 0)) {
66         templength = maxlength;
67     }
68     int m;
69     char* text = new char[maxlength];
70     for (m = 0; m < templength; m++) {
71         funpackf(tfile, "Bb", &text[m]);
72         if (text[m] == '\0') {
73             break;
74         }
75     }
76     text[m] = 0;
77     std::string result(text);
78     delete[] text;
79     return result;
80 }
81
82 void fpackf_string(FILE* tfile, std::string text)
83 {
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') {
88             break;
89         }
90     }
91 }
92
93 DialogScene::DialogScene(FILE* tfile)
94 {
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);
100
101     text = funpackf_string(tfile, 128);
102     name = funpackf_string(tfile, 64);
103
104     funpackf(tfile, "Bf Bf Bf", &camera.x, &camera.y, &camera.z);
105     funpackf(tfile, "Bi", &participantfocus);
106     funpackf(tfile, "Bi", &participantaction);
107
108     for (int m = 0; m < 10; m++) {
109         funpackf(tfile, "Bf Bf Bf", &participantfacing[m].x, &participantfacing[m].y, &participantfacing[m].z);
110     }
111
112     funpackf(tfile, "Bf Bf", &camerayaw, &camerapitch);
113 }
114
115 /* Load dialog from txt file, used by console */
116 Dialog::Dialog(int type, std::string filename)
117     : type(type)
118 {
119     ifstream ipstream(Folders::getResourcePath(filename));
120     ipstream.ignore(256, ':');
121     int numscenes;
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;
127         }
128     }
129     ipstream.close();
130 }
131
132 DialogScene::DialogScene(ifstream& ipstream)
133 {
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] == '\\') {
149             text[j] = '\n';
150         }
151     }
152     ipstream.ignore(256, ':');
153     ipstream >> sound;
154 }
155
156 void Dialog::tick(int id)
157 {
158     unsigned playerId = type % 10;
159     bool special = (type > 9);
160
161     if ((!hostile || (type > 40) && (type < 50)) &&
162         (playerId < Person::players.size()) &&
163         (playerId > 0) &&
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)) {
169             whichdialogue = id;
170             play();
171             dialoguetime = 0;
172             gonethrough++;
173         }
174     }
175 }
176
177 void Dialog::play()
178 {
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;
187     }
188
189     Dialog::directing = false;
190     Dialog::indialogue = 0;
191
192     if (scenes[indialogue].sound != 0) {
193         Game::playdialoguescenesound();
194     }
195 }
196
197 void Dialog::saveDialogs(FILE* tfile)
198 {
199     fpackf(tfile, "Bi", dialogs.size());
200
201     for (unsigned i = 0; i < dialogs.size(); i++) {
202         dialogs[i].save(tfile);
203     }
204 }
205
206 void Dialog::save(FILE* tfile)
207 {
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]);
213     }
214     for (unsigned l = 0; l < scenes.size(); l++) {
215         scenes[l].save(tfile);
216     }
217 }
218
219 void DialogScene::save(FILE* tfile)
220 {
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);
226
227     fpackf_string(tfile, text);
228     fpackf_string(tfile, name);
229
230     fpackf(tfile, "Bf Bf Bf", camera.x, camera.y, camera.z);
231     fpackf(tfile, "Bi", participantfocus);
232     fpackf(tfile, "Bi", participantaction);
233
234     for (int m = 0; m < 10; m++) {
235         fpackf(tfile, "Bf Bf Bf", participantfacing[m].x, participantfacing[m].y, participantfacing[m].z);
236     }
237
238     fpackf(tfile, "Bf Bf", camerayaw, camerapitch);
239 }