33 laNPCDialog::laNPCDialog()
37 _ttBlink.parameters(0.8, 0.8, M_TRUE);
38 _ttNext.parameters(0.3);
41 laNPCDialog::~laNPCDialog()
47 fp->readBool(&bObligatory);
48 fp->readText(strNextDialogueFile);
49 fp->readUnsigned(&nDialogSteps);
51 arText_NPC =
new fxAnimatedText[nDialogSteps];
52 arText_Player =
new fxAnimatedText[nDialogSteps];
54 for(
unsigned i=0; i<nDialogSteps; i++)
56 fp->readObj(arText_NPC + i, M_FALSE);
57 fp->readObj(arText_Player + i, M_FALSE);
59 arText_NPC[i].parameters(
60 laSystemIntegrator::getRenderer()->font(
"plain"),
61 0.1*
M_UNIT, 1.5, laColor(50,50,50, 200), 1);
63 arText_Player[i].parameters(
64 laSystemIntegrator::getRenderer()->font(
"plain"),
65 0.1*
M_UNIT, 1.5, laColor(50,50,50, 200), 1);
74 void laNPCDialog::animate(laTimer &t)
81 arText_NPC[nCurrentStep].animate(t);
83 if( arText_NPC[nCurrentStep].isFinished() )
85 arText_Player[nCurrentStep].animate(t);
92 if( ( in::key(KEY_RETURN) || in::key(KEY_SPACE) ) && _ttNext.isElapsed() )
96 if( (!arText_NPC[nCurrentStep].isFinished()) || (!arText_Player[nCurrentStep].isFinished()) )
98 arText_NPC[nCurrentStep].force();
99 arText_Player[nCurrentStep].force();
101 else if( nCurrentStep < nDialogSteps-1 )
106 else _bFinished = M_TRUE;
110 pMonster->fxMessages.add(1, laColor(255,255,255),
"Good luck!");
113 laPoint3 _baloon_pos(laPoint3 ptBasePos,
laObject* pObject, laPoint3 sizeBaloon)
115 laPoint3 pos = ptBasePos + pObject->getPosition();
118 pos.y( pos.y() - pObject->getPivot()->size.y() + sizeBaloon.y() +
M_UNIT/2.0);
122 laPoint3 _mouth_pos(laPoint3 ptBasePos,
laObject* pObject)
124 laPoint3 pos = ptBasePos + pObject->getPosition();
126 pos.y( pos.y() - pObject->getPivot()->size.y() +
M_UNIT/5.0 );
133 void _shift_baloons(laPoint3 *pt1, laPoint3 *pt2, laPoint3 sz1, laPoint3 sz2)
138 if( pt1->x() > pt2->x() )
143 pt = pt1; pt1 = pt2; pt2 = pt;
144 t = sz1; sz1 = sz2; sz2 = t;
147 pt1->x( pt1->x() - M_MIN(2*
M_UNIT, sz1.x()*0.6) );
148 pt2->x( pt2->x() - M_MIN(2*
M_UNIT, sz2.x()*0.4) );
152 double overlapy1 =
M_ABS((pt1->y()+sz1.y()) - (pt2->y()));
153 if( overlapy1 <
M_UNIT/3.0)
155 pt1->y( pt1->y() - (
M_UNIT/3.0 - overlapy1 ) );
158 double overlapy2 =
M_ABS((pt2->y()+sz2.y()) - (pt1->y()));
159 if( overlapy2 <
M_UNIT/3.0)
161 pt2->y( pt2->y() - (
M_UNIT/3.0 - overlapy2 ) );
173 void laNPCDialog::draw(
laRenderer *r, laPoint3 ptBasePos)
177 laPoint3 sizePlayerBaloon = laPoint3(arText_Player[nCurrentStep].width()+0.1*
M_UNIT, arText_Player[nCurrentStep].height()+0.1*
M_UNIT);
178 laPoint3 posPlayerBaloon = _baloon_pos(ptBasePos, pPlayer, sizePlayerBaloon);
179 laPoint3 posPlayerMouth = _mouth_pos(ptBasePos, pPlayer);
181 laPoint3 sizeNPCBaloon = laPoint3(arText_NPC[nCurrentStep].width()+0.1*
M_UNIT, arText_NPC[nCurrentStep].height()+0.1*
M_UNIT);
182 laPoint3 posNPCBaloon = _baloon_pos(ptBasePos, pMonster, sizeNPCBaloon);
183 laPoint3 posNPCMouth = _mouth_pos(ptBasePos, pMonster);
185 _shift_baloons(&posPlayerBaloon, &posNPCBaloon, sizePlayerBaloon, sizeNPCBaloon);
189 _draw_baloon(r, posNPCBaloon, posNPCMouth, sizeNPCBaloon, arText_NPC+nCurrentStep);
191 if( arText_NPC[nCurrentStep].isFinished() )
193 _draw_baloon(r, posPlayerBaloon, posPlayerMouth, sizePlayerBaloon, arText_Player+nCurrentStep);
200 void laNPCDialog::drawGUI(
laRenderer *r, laPoint3 ptBasePos)
202 glEnable(GL_STENCIL_TEST);
203 glStencilFunc(GL_ALWAYS, 1 , 0xFFF );
204 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
205 glDisable(GL_DEPTH_TEST);
209 if( arText_Player[nCurrentStep].isFinished() )
211 double w = laSystemIntegrator::getSettings()->graphics_resolution_w;
212 double h = laSystemIntegrator::getSettings()->graphics_resolution_h;
214 if(_ttBlink.isElapsed())
217 laSystemIntegrator::getRenderer()->
font(
"plain")->ctlSize( 15 );
218 laSystemIntegrator::getRenderer()->
font(
"plain")->ctlAlignV(
M_AM);
220 r->styleSet(laColor(50,50,50,255));
221 laSystemIntegrator::getRenderer()->
font(
"plain")->draw(laPoint3(w/2+2, h-50+2),
"[Press ENTER to continue]");
223 r->styleSet(laColor(255,255,255,255));
224 laSystemIntegrator::getRenderer()->
font(
"plain")->draw(laPoint3(w/2, h-50),
"[Press ENTER to continue]");
228 glDisable(GL_STENCIL_TEST);
232 laPoint3 pos, laPoint3 pos_mouth, laPoint3 size,
237 b.create( pos, size );
238 b.setMouthPos( pos_mouth );
laFont * font(char *strName)
Get a font renderer.
#define M_UNIT
Unit of 1 meter.
#define M_AM
Text align middle.
#define M_ABS(a)
Return abs(a)
Virtual interface for the Engine graphics renderer.
virtual void modeInterface()=0
Switch to interface rendering (2D projection mode)
Base Class for Level Objects.