2 * @file GameSurfaceSDL.cpp
3 * @brief
\83Q
\81[
\83\80\82Ì
\83\81\83C
\83\93\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X(SDL2.0
\8eÀ
\91\95)
12 #include "GameSurfaceSDL.h"
14 #include "GameEngine.h"
22 std::string toUTF8(LPCSTR str)
24 const int cchWideChar = ::MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
25 std::vector<WCHAR> lpw(cchWideChar);
27 const int nUnicodeCount = ::MultiByteToWideChar(CP_ACP, 0, str, -1, &lpw[0], cchWideChar);
28 if(nUnicodeCount <= 0)
33 const int cchMultiByte = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, NULL, 0, NULL, NULL);
34 std::vector<CHAR> lpa(cchMultiByte);
36 const int nMultiCount = ::WideCharToMultiByte(CP_UTF8, 0, &lpw[0], -1, &lpa[0], cchMultiByte, NULL, NULL);
41 return std::string(&lpa[0]);
44 GameSurfaceSDL::GameSurfaceSDL(GameWorld *gameWorld) : GameSurface(gameWorld)
46 if(SDL_Init(SDL_INIT_VIDEO) < 0) return;
47 window = SDL_CreateWindow(GAME_TITLE, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE);
48 SDL_GetWindowSurface(window);
49 renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
52 if(TTF_Init() == -1) return;
53 if(IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG) return;
55 initInterfaces(gameWorld);
57 viewCreaturePtr = NULL;
60 windowSurface = SDL_GetWindowSurface(window);
62 gameMessageTexture = NULL;
63 systemMessageTexture = NULL;
68 frameDeltaTimeLast = frameTimeLast = SDL_GetTicks();
70 SDL_SetRenderDrawBlendMode(this->renderer, SDL_BLENDMODE_NONE);
72 this->rectTitleDst.Set(10, 10, 266, 266);
73 this->rectTitleSrc.Set(0, 0, 256, 256);
74 this->rectFpsDst.Set(0, 0, 50, 20);
75 this->rectFpsSrc.Set(0, 0, 50, 20);
80 GameSurfaceSDL::~GameSurfaceSDL(void)
88 void GameSurfaceSDL::fpsProcess()
95 getTicks = SDL_GetTicks();
96 frameDeltaTime = getTicks - frameDeltaTimeLast;
97 frameDeltaTimeLast = getTicks;
98 if (frameCount >= FPS_UPDATE)
101 frameTime = getTicks - frameTimeLast;
102 frameTimeLast = getTicks;
103 framesPerSecond = (int)(1000.f * FPS_UPDATE / frameTime);
104 sprintf_s(fpsBuf, 8, "fps:%d", framesPerSecond);
105 surface = TTF_RenderUTF8_Blended(fontSmall, fpsBuf, color);
106 fpsTexture = SDL_CreateTextureFromSurface(renderer, surface);
107 SDL_FreeSurface(surface);
110 SDL_RenderCopy(renderer, fpsTexture, &rectFpsSrc, &rectFpsDst);
114 void GameSurfaceSDL::pushAnyKey(const CREATURE_IT& subjectCreatureIt)
119 this->Draw(subjectCreatureIt);
120 SDL_PollEvent(&event);
121 } while(event.type != SDL_KEYDOWN);
124 void GameSurfaceSDL::pushAnyKey(void)
129 SDL_Rect rect = {0, 0, 0, 0};
130 this->drawSystemMessage();
131 SDL_UpdateWindowSurfaceRects(window, &rect, 1);
132 SDL_UpdateWindowSurface(window);
134 SDL_PollEvent(&event);
135 } while(event.type != SDL_KEYDOWN);
139 void GameSurfaceSDL::initInterfaces(GameWorld *gameWorld)
141 std::map<TAG, boost::shared_ptr<Floor>>::iterator floorIt;
142 std::map<TAG, boost::shared_ptr<Species>>::iterator speciesIt;
143 SDL_Surface *surface, *tempSurface, *symbolSurface;
145 //! @note TTF
\83t
\83H
\83\93\83g
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
147 font = TTF_OpenFont("ttf\\ipam.ttf", 14);
148 fontSmall = TTF_OpenFont("ttf\\ipag.ttf", 9);
162 if(!font || !fontSmall)
164 OutputDebugString(L"Failed: loading .ttf files.\n");
168 //! @note
\83V
\83X
\83e
\83\80\83O
\83\89\83t
\83B
\83b
\83N
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
169 rwop = SDL_RWFromFile("img\\Title.png", "rb");
170 error = IMG_GetError();
171 tempSurface = IMG_LoadPNG_RW(rwop);
172 titleTexture = SDL_CreateTextureFromSurface(renderer, tempSurface);
173 SDL_FreeSurface(tempSurface);
175 //! @note
\96¢
\92m
\92n
\8c`
\83O
\83\89\83t
\83B
\83b
\83N
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
176 rwop = SDL_RWFromFile("img\\UnknownField.png", "rb");
177 error = IMG_GetError();
178 tempSurface = IMG_LoadPNG_RW(rwop);
179 unknownFieldTexture = SDL_CreateTextureFromSurface(renderer, tempSurface);
180 SDL_FreeSurface(tempSurface);
182 //! @note
\8e\8b\8aE
\8aO
\92n
\8c`
\83O
\83\89\83t
\83B
\83b
\83N
\82Ì
\93Ç
\82Ý
\8d\9e\82Ý
183 rwop = SDL_RWFromFile("img\\UnseenField.png", "rb");
184 error = IMG_GetError();
185 tempSurface = IMG_LoadPNG_RW(rwop);
186 unseenFieldTexture = SDL_CreateTextureFromSurface(renderer, tempSurface);
187 SDL_FreeSurface(tempSurface);
189 //! @note
\8f°
\92n
\8c`
\83O
\83\89\83t
\83B
\83b
\83N
\82Ì
\90Ý
\92è
190 for(floorIt = gameWorld->GetFloorList()->begin(); floorIt != gameWorld->GetFloorList()->end(); floorIt++)
192 Color symColor = floorIt->second->GetSymbolColor();
193 Color backColor = floorIt->second->GetBackColor();
194 SDL_Color sdlSymCol = {(Uint8)symColor.GetRed(), (Uint8)symColor.GetGreen(), (Uint8)symColor.GetBlue(), (Uint8)symColor.GetAlpha()};
195 SDL_Rect blitRect = {0, 0, squareGraphicWidth, squareGraphicHeight};
196 SDL_Rect symbolRect = {0, 0, 30, 30};
199 surface = SDL_CreateRGBSurface(0, squareGraphicWidth, squareGraphicHeight, 32, 0, 0, 0, 0);
201 SDL_FillRect(surface, &blitRect, SDL_MapRGBA(surface->format, (Uint8)backColor.GetRed(), (Uint8)backColor.GetGreen(), (Uint8)backColor.GetBlue(), (Uint8)backColor.GetAlpha()));
202 sprintf_s(symBuf, 5, "%s", floorIt->second->GetSymbol().c_str());
203 symbolSurface = TTF_RenderUTF8_Blended(font, toUTF8(symBuf).c_str(), sdlSymCol);
204 blitRect.x += (24 - symbolSurface->w) / 2;
205 blitRect.y += (24 - symbolSurface->h) / 2;
206 SDL_BlitSurface(symbolSurface, &symbolRect, surface, &blitRect);
207 SDL_FreeSurface(symbolSurface);
209 floorTextures.insert(std::map<TAG, SDL_Texture*>::value_type(floorIt->first, SDL_CreateTextureFromSurface(renderer, surface)));
212 SDL_GetWindowSurface(this->window);
213 this->windowSurface = SDL_GetWindowSurface(this->window);
216 void GameSurfaceSDL::Draw(const CREATURE_IT& subjectCreatureIt)
218 SDL_Rect rectTemp = {0, 0, 0, 0};
220 SDL_RenderClear(renderer);
221 SDL_GetWindowSize(window, &rectTemp.w, &rectTemp.h);
223 SDL_RenderCopy(renderer, titleTexture, &rectTitleSrc, &rectTitleDst);
225 this->rectMainMapDst.Set(240, 30, rectTemp.w - 260, rectTemp.h - 60);
226 SDL_SetRenderDrawColor(renderer, 50, 20, 0, 255);
228 if(this->viewFieldPtr)
230 this->drawField(subjectCreatureIt, gameWorld, viewFieldPtr, rectMainMapDst);
232 if(this->sideStatusCreatutePtr) this->drawSideCreatureStatus();
233 if(this->viewCreaturePtr) this->drawCreatureStatus(viewCreaturePtr);
234 if(this->currentSystemMessage.size() > 0) this->drawSystemMessage();
235 if(this->gameMessageTexture) this->drawGameMessage();
236 this->drawTimeStatus();
239 SDL_Delay(WAIT_MSEC - frameDeltaTime > 0 ? WAIT_MSEC - frameDeltaTime : 0);
241 SDL_RenderPresent(renderer);
246 void GameSurfaceSDL::ViewCreatureStatus(Creature *creaturePtr)
248 this->viewCreaturePtr = creaturePtr;
250 this->viewCreaturePtr = NULL;
253 void GameSurfaceSDL::SetSideStatusCreature(Creature *creaturePtr)
255 this->sideStatusCreatutePtr = creaturePtr;
256 if(creaturePtr) this->UpdateSideCreatureStatus(creaturePtr);
259 void GameSurfaceSDL::SetField(Field *fieldPtr)
261 this->viewFieldPtr = fieldPtr;
264 void GameSurfaceSDL::drawCreatureStatus(Creature *creaturePtr)
268 enum CREATURE_STATUS_VIEW_POSITION
295 SDL_Rect CreatureStatusViewPosition[POS_MAX] =
321 SDL_Rect CreatureStatusViewRect[POS_MAX];
323 const int STATUS_BUFSIZE = 100;
324 char statusBuf[POS_MAX][STATUS_BUFSIZE];
325 SDL_Surface *statusSurface[POS_MAX];
327 SDL_Rect masterRect = {10, 10, 490, 450};
329 sprintf_s(statusBuf[POS_NAME], STATUS_BUFSIZE, "
\96¼
\91O:%s", creaturePtr->GetName().c_str());
330 sprintf_s(statusBuf[POS_LEVEL], STATUS_BUFSIZE, "LV:%3d", creaturePtr->GetLevel());
331 sprintf_s(statusBuf[POS_HP], STATUS_BUFSIZE, "HP:%5d/%5d", creaturePtr->GetCurHP(), creaturePtr->GetMaxHP());
332 sprintf_s(statusBuf[POS_MP], STATUS_BUFSIZE, "MP:%5d/%5d", creaturePtr->GetCurMP(), creaturePtr->GetMaxMP());
333 sprintf_s(statusBuf[POS_AC], STATUS_BUFSIZE, "AC:%4d", creaturePtr->GetArmorSaving());
334 sprintf_s(statusBuf[POS_EV], STATUS_BUFSIZE, "EV:%4d", creaturePtr->GetEvasionSaving());
335 sprintf_s(statusBuf[POS_VO], STATUS_BUFSIZE, "VO:%4d", creaturePtr->GetVolitionSaving());
336 sprintf_s(statusBuf[POS_GOOD], STATUS_BUFSIZE, "
\91P :%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_GOOD));
337 sprintf_s(statusBuf[POS_EVIL], STATUS_BUFSIZE, "
\88« :%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_EVIL));
338 sprintf_s(statusBuf[POS_ORDER], STATUS_BUFSIZE, "
\92\81\8f\98:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_ORDER));
339 sprintf_s(statusBuf[POS_CHAOS], STATUS_BUFSIZE, "
\8d¬
\93×:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_CHAOS));
340 sprintf_s(statusBuf[POS_BALANCE], STATUS_BUFSIZE, "
\93V
\94\89:%4d", creaturePtr->GetDiscipilneRank(DISCIPLINE_TYPE_BALANCE));
341 sprintf_s(statusBuf[POS_STR], STATUS_BUFSIZE, "
\98r
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_STR));
342 sprintf_s(statusBuf[POS_INT], STATUS_BUFSIZE, "
\92m
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_INT));
343 sprintf_s(statusBuf[POS_WIS], STATUS_BUFSIZE, "
\8c«
\82³:%4d", creaturePtr->GetCurrentStatus(CS_WIS));
344 sprintf_s(statusBuf[POS_DEX], STATUS_BUFSIZE, "
\8aí
\97p:%4d", creaturePtr->GetCurrentStatus(CS_DEX));
345 sprintf_s(statusBuf[POS_CON], STATUS_BUFSIZE, "
\91Ï
\8bv:%4d", creaturePtr->GetCurrentStatus(CS_CON));
346 sprintf_s(statusBuf[POS_CHA], STATUS_BUFSIZE, "
\96£
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_CHA));
347 sprintf_s(statusBuf[POS_SOUL], STATUS_BUFSIZE, "
\83\
\83E
\83\8b:%4d", creaturePtr->GetCurrentSoul());
348 sprintf_s(statusBuf[POS_HEIGHT], STATUS_BUFSIZE, "
\90g
\92·:%13s", GameElement::HeightFormat(creaturePtr->GetHeight()).c_str());
349 sprintf_s(statusBuf[POS_WEIGHT], STATUS_BUFSIZE, "
\91Ì
\8fd:%13s", GameElement::WeightFormat(creaturePtr->GetWeight()).c_str());
350 sprintf_s(statusBuf[POS_BODY_SIZE], STATUS_BUFSIZE, "
\91Ì
\8ai:%3d", creaturePtr->GetSize());
352 for(id = 0; id < POS_MAX; id++)
354 statusSurface[id] = TTF_RenderUTF8_Blended(font, toUTF8(statusBuf[id]).c_str(), color);
355 CreatureStatusViewRect[id].x = 0;
356 CreatureStatusViewRect[id].y = 0;
357 CreatureStatusViewRect[id].w = statusSurface[id]->w;
358 CreatureStatusViewRect[id].h = statusSurface[id]->h;
359 CreatureStatusViewPosition[id].x += masterRect.x;
360 CreatureStatusViewPosition[id].y += masterRect.y;
363 SDL_FillRect(windowSurface, &masterRect, SDL_MapRGBA(windowSurface->format, 0, 0, 0, 120));
365 for(id = 0; id < POS_MAX; id++)
367 SDL_BlitSurface(statusSurface[id], &CreatureStatusViewRect[id], windowSurface, &CreatureStatusViewPosition[id]);
370 for(id = 0; id < POS_MAX; id++)
372 SDL_FreeSurface(statusSurface[id]);
377 void GameSurfaceSDL::UpdateTimeStatus(GAME_TIME currentTime)
380 SDL_Rect rect = {0, 0, 200, 50};
381 SDL_Rect StatusViewRect = {0, 0, 200, 50};
382 SDL_Rect StatusViewPosition = {10, 10, 0, 0};
383 SDL_Surface *surface, *statusSurface;
384 const int STATUS_BUFSIZE = 100;
385 char statusBuf[STATUS_BUFSIZE];
386 if(gameTimeStatusTexture) SDL_DestroyTexture(gameTimeStatusTexture);
387 surface = SDL_CreateRGBSurface(0, 200, 50, 32, 0, 0, 0, 0);
388 SDL_FillRect(surface, &rect, SDL_MapRGBA(windowSurface->format, 0, 0, 0, 120));
389 sprintf_s(statusBuf, STATUS_BUFSIZE, "
\83Q
\81[
\83\80\8e\9e\8aÔ:%d", currentTime);
390 statusSurface = TTF_RenderUTF8_Blended(font, toUTF8(statusBuf).c_str(), color);
391 SDL_BlitSurface(statusSurface, &StatusViewRect, surface, &StatusViewPosition);
392 gameTimeStatusTexture = SDL_CreateTextureFromSurface(renderer, surface);
393 SDL_FreeSurface(statusSurface);
394 SDL_FreeSurface(surface);
397 void GameSurfaceSDL::UpdateSideCreatureStatus(Creature *creaturePtr)
400 SDL_Surface *surface;
402 enum CREATURE_SIDE_STATUS_VIEW_POSITION
423 SDL_Rect CreatureStatusViewPosition[POS_MAX] =
443 SDL_Rect CreatureStatusViewRect[POS_MAX];
445 const int STATUS_BUFSIZE = 100;
446 char statusBuf[POS_MAX][STATUS_BUFSIZE];
447 SDL_Surface *statusSurface[POS_MAX];
449 SDL_Rect masterRect = {0, 0, 180, 350};
451 surface = SDL_CreateRGBSurface(0, 180, 350, 32, 0, 0, 0, 0);
453 sprintf_s(statusBuf[POS_NAME], STATUS_BUFSIZE, "
\96¼
\91O:%s", creaturePtr->GetName().c_str());
454 sprintf_s(statusBuf[POS_LEVEL], STATUS_BUFSIZE, "LV:%3d", creaturePtr->GetLevel());
455 sprintf_s(statusBuf[POS_HP], STATUS_BUFSIZE, "HP:%5d/%5d", creaturePtr->GetCurHP(), creaturePtr->GetMaxHP());
456 sprintf_s(statusBuf[POS_MP], STATUS_BUFSIZE, "MP:%5d/%5d", creaturePtr->GetCurMP(), creaturePtr->GetMaxMP());
457 sprintf_s(statusBuf[POS_AC], STATUS_BUFSIZE, "AC:%4d", creaturePtr->GetArmorSaving());
458 sprintf_s(statusBuf[POS_EV], STATUS_BUFSIZE, "EV:%4d", creaturePtr->GetEvasionSaving());
459 sprintf_s(statusBuf[POS_VO], STATUS_BUFSIZE, "VO:%4d", creaturePtr->GetVolitionSaving());
460 sprintf_s(statusBuf[POS_STR], STATUS_BUFSIZE, "
\98r
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_STR));
461 sprintf_s(statusBuf[POS_INT], STATUS_BUFSIZE, "
\92m
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_INT));
462 sprintf_s(statusBuf[POS_WIS], STATUS_BUFSIZE, "
\8c«
\82³:%4d", creaturePtr->GetCurrentStatus(CS_WIS));
463 sprintf_s(statusBuf[POS_DEX], STATUS_BUFSIZE, "
\8aí
\97p:%4d", creaturePtr->GetCurrentStatus(CS_DEX));
464 sprintf_s(statusBuf[POS_CON], STATUS_BUFSIZE, "
\91Ï
\8bv:%4d", creaturePtr->GetCurrentStatus(CS_CON));
465 sprintf_s(statusBuf[POS_CHA], STATUS_BUFSIZE, "
\96£
\97Í:%4d", creaturePtr->GetCurrentStatus(CS_CHA));
466 sprintf_s(statusBuf[POS_SOUL], STATUS_BUFSIZE, "
\83\
\83E
\83\8b:%4d", creaturePtr->GetCurrentSoul());
467 sprintf_s(statusBuf[POS_X], STATUS_BUFSIZE, "X:%4d", creaturePtr->GetPosition().GetX());
468 sprintf_s(statusBuf[POS_Y], STATUS_BUFSIZE, "Y:%4d", creaturePtr->GetPosition().GetY());
470 for(id = 0; id < POS_MAX; id++)
472 statusSurface[id] = TTF_RenderUTF8_Blended(font, toUTF8(statusBuf[id]).c_str(), color);
473 CreatureStatusViewRect[id].x = 0;
474 CreatureStatusViewRect[id].y = 0;
475 CreatureStatusViewRect[id].w = statusSurface[id]->w;
476 CreatureStatusViewRect[id].h = statusSurface[id]->h;
477 CreatureStatusViewPosition[id].x += masterRect.x;
478 CreatureStatusViewPosition[id].y += masterRect.y;
481 SDL_FillRect(surface, &masterRect, SDL_MapRGBA(surface->format, 0, 0, 0, 120));
483 for(id = 0; id < POS_MAX; id++)
485 SDL_BlitSurface(statusSurface[id], &CreatureStatusViewRect[id], surface, &CreatureStatusViewPosition[id]);
488 for(id = 0; id < POS_MAX; id++)
490 SDL_FreeSurface(statusSurface[id]);
493 creatureSideStatusTexture = SDL_CreateTextureFromSurface(renderer, surface);
494 SDL_FreeSurface(surface);
500 void GameSurfaceSDL::drawSideCreatureStatus(void)
502 SDL_Rect masterRect = {0, 0, 180, 350};
503 SDL_Rect posRect = {10, 120, 180, 350};
504 SDL_RenderCopy(renderer, creatureSideStatusTexture, &masterRect, &posRect);
507 GAME_COMMAND GameSurfaceSDL::GetCommand(const CREATURE_IT& subjectCreatureIt)
512 this->Draw(subjectCreatureIt);
513 while (SDL_PollEvent(&event))
521 key=event.key.keysym.sym;
526 return GAME_COMMAND_EXIT;
528 return GAME_COMMAND_VIEW_PLAYER_STATUS;
530 return GAME_COMMAND_DEBUG_XML_SAVE;
532 return GAME_COMMAND_DEBUG_XML_LOAD;
534 return GAME_COMMAND_NORTH;
536 return GAME_COMMAND_NORTH_EAST;
538 return GAME_COMMAND_EAST;
540 return GAME_COMMAND_SOUTH_EAST;
542 return GAME_COMMAND_SOUTH;
544 return GAME_COMMAND_SOUTH_WEST;
546 return GAME_COMMAND_WEST;
548 return GAME_COMMAND_NORTH_WEST;
550 return GAME_COMMAND_STAY;
556 case SDL_WINDOWEVENT:
557 switch (event.window.event) {
558 case SDL_WINDOWEVENT_SHOWN:
560 case SDL_WINDOWEVENT_HIDDEN:
562 case SDL_WINDOWEVENT_EXPOSED:
564 case SDL_WINDOWEVENT_MOVED:
566 case SDL_WINDOWEVENT_RESIZED:
568 case SDL_WINDOWEVENT_MINIMIZED:
570 case SDL_WINDOWEVENT_MAXIMIZED:
572 case SDL_WINDOWEVENT_RESTORED:
574 case SDL_WINDOWEVENT_ENTER:
576 case SDL_WINDOWEVENT_LEAVE:
578 case SDL_WINDOWEVENT_FOCUS_GAINED:
580 case SDL_WINDOWEVENT_FOCUS_LOST:
582 case SDL_WINDOWEVENT_CLOSE:
587 this->Draw(subjectCreatureIt);
591 return GAME_COMMAND_EXIT;
597 return GAME_COMMAND_REDRAW;
600 void GameSurfaceSDL::drawField(const CREATURE_IT &subjectCreatureIt, GameWorld *gameWorld, Field *fieldPtr, SDL_Rect_Dee &rectDraw)
602 SDL_Rect symbolRect = {0, 0, squareGraphicWidth, squareGraphicHeight};
603 CREATURE_IT creatureIt;
604 Creature *subJectCreaturePtr = subjectCreatureIt->second.get();
606 MAP_LENGTH fx = this->focusPoint.GetX();
607 MAP_LENGTH fy = this->focusPoint.GetY();
609 MAP_LENGTH fieldw = this->viewFieldPtr->GetWidth();
610 MAP_LENGTH fieldh = this->viewFieldPtr->GetHeight();
612 MAP_LENGTH w = rectDraw.w / this->squareGraphicWidth + 1;
613 MAP_LENGTH h = rectDraw.h / this->squareGraphicHeight + 1;
614 MAP_LENGTH x = fx - (w / 2);
615 MAP_LENGTH y = fy - (h / 2);
617 MAP_LENGTH px, py, sx = 0, sy = 0;
619 //sx = - (rectDraw.w % (this->squareGraphicWidth / 2));
620 //sy = - (rectDraw.h % (this->squareGraphicHeight / 2));
622 if(x > fieldw - w + this->fieldPadding) x = fieldw - w + this->fieldPadding;
623 if(y > fieldh - h + this->fieldPadding) y = fieldh - h + this->fieldPadding;
624 if(x < -this->fieldPadding) x = -this->fieldPadding;
625 if(y < -this->fieldPadding) y = -this->fieldPadding;
628 SDL_RenderSetViewport(this->renderer, &rectDraw);
630 for(py = y; py <= y + h; py++)
632 for(px = x; px <= x + w; px++)
634 if(px >= 0 && py >= 0 && px < fieldPtr->GetWidth() && py < fieldPtr->GetHeight())
636 SDL_Rect blitRect = {(px - x) * squareGraphicWidth - sx, (py - y) * squareGraphicHeight - sy, squareGraphicWidth, squareGraphicHeight};
639 SDL_Rect checkRect1 = {(px - x) * squareGraphicWidth - sx - 2 + 12, 30 + (py - y) * squareGraphicHeight - 2 - sy + 12, 4, 4};
640 SDL_Rect checkRect2 = {(px - x) * squareGraphicWidth - sx - 2, 30 + (py - y) * squareGraphicHeight - 2 - sy , 4, 4};
641 SDL_Rect checkRect3 = {(px - x) * squareGraphicWidth - sx - 6 + 12, 30 + (py - y) * squareGraphicHeight - 1 - sy , 12, 2};
642 SDL_Rect checkRect4 = {(px - x) * squareGraphicWidth - sx - 1, 30 + (py - y) * squareGraphicHeight - 6 + 12 - sy , 2, 12};
645 if(subJectCreaturePtr->InSight(px, py))
647 TAG tag = fieldPtr->GetSquare(px, py)->GetFloorTag();
648 SDL_RenderCopy(renderer, floorTextures[tag], &symbolRect, &blitRect);
649 if(!subJectCreaturePtr->InSight(px, py))
651 SDL_Rect fieldRect = {blitRect.x % 128, blitRect.y % 128, squareGraphicWidth, squareGraphicHeight};
652 SDL_RenderCopy(this->renderer, unseenFieldTexture, &fieldRect, &blitRect);
657 SDL_Rect fieldRect = {blitRect.x % 128, blitRect.y % 128, squareGraphicWidth, squareGraphicHeight};
658 SDL_RenderCopy(this->renderer, unknownFieldTexture, &fieldRect, &blitRect);
662 if(fieldPtr->GetSightPass(px * 2 + 1, py * 2 + 1))
663 SDL_SetRenderDrawColor(this->renderer, 255, 255, 255, 255);
665 SDL_SetRenderDrawColor(this->renderer, 255, 0, 0, 255);
666 SDL_RenderFillRect(this->renderer, &checkRect1);
668 if(fieldPtr->GetSightPass(px * 2, py * 2))
669 SDL_FillRect(windowSurface, &checkRect2, SDL_MapRGBA(windowSurface->format, 255, 255, 255, 255));
671 SDL_FillRect(windowSurface, &checkRect2, SDL_MapRGBA(windowSurface->format, 255, 0, 0, 255));
673 if(fieldPtr->GetSightPass(px * 2 + 1, py * 2))
674 SDL_FillRect(windowSurface, &checkRect3, SDL_MapRGBA(windowSurface->format, 255, 255, 255, 255));
676 SDL_FillRect(windowSurface, &checkRect3, SDL_MapRGBA(windowSurface->format, 255, 0, 0, 255));
678 if(fieldPtr->GetSightPass(px * 2, py * 2 + 1))
679 SDL_FillRect(windowSurface, &checkRect4, SDL_MapRGBA(windowSurface->format, 255, 255, 255, 255));
681 SDL_FillRect(windowSurface, &checkRect4, SDL_MapRGBA(windowSurface->format, 255, 0, 0, 255));
688 for(creatureIt = gameWorld->GetCreatureList()->begin(); creatureIt != gameWorld->GetCreatureList()->end(); creatureIt++)
690 if(!creatureTextures[creatureIt->first])
692 updateCreatureGraphics(creatureIt);
695 if(subJectCreaturePtr->InSight(creatureIt->second->GetPosition().GetX(), creatureIt->second->GetPosition().GetY()))
697 SDL_Rect blitRect = {(creatureIt->second->GetPosition().GetX() - x) * squareGraphicWidth - sx, (creatureIt->second->GetPosition().GetY()- y) * squareGraphicHeight - sy, squareGraphicWidth, squareGraphicHeight};
698 SDL_RenderCopy(renderer, creatureTextures[creatureIt->first], &symbolRect, &blitRect);
702 if(subjectCreatureIt->second->GetLore()->GetFieldLore(0, creatureIt->second->GetPosition().GetX(), creatureIt->second->GetPosition().GetY()) > 0)
704 SDL_Rect blitRect = {GameSurfaceSDL::sideBarWidth + (creatureIt->second->GetPosition().GetX() - x) * squareGraphicWidth, 30 + (creatureIt->second->GetPosition().GetY()- y) * squareGraphicHeight, squareGraphicWidth, squareGraphicHeight};
705 SDL_BlitSurface(creatureSurfaces[creatureIt->first], &symbolRect, windowSurface, &blitRect);
710 SDL_RenderSetViewport(this->renderer, NULL);
714 void GameSurfaceSDL::FocusField(MAP_LENGTH x, MAP_LENGTH y)
716 this->focusPoint.Set(x, y);
719 void GameSurfaceSDL::FocusField(Coordinates coord)
721 this->focusPoint.Set(coord.GetX(), coord.GetY());
724 void GameSurfaceSDL::drawSystemMessage(void)
726 SDL_Rect messageRect = {0, 0, 200, 200};
727 SDL_Rect messagePositon = {220, 180, 420, 380};
728 SDL_RenderCopy(renderer, systemMessageTexture, &messageRect, &messagePositon);
731 void GameSurfaceSDL::drawGameMessage(void)
733 SDL_Rect messageRect = {0, 0, 512, 20};
734 SDL_Rect messagePositon = {242, 4, 512, 20};
735 SDL_RenderCopy(renderer, gameMessageTexture, &messageRect, &messagePositon);
738 void GameSurfaceSDL::drawTimeStatus(void)
740 SDL_Rect messageRect = {0, 0, 200, 50};
741 SDL_Rect messagePositon = {10, 480, 200, 50};
742 SDL_RenderCopy(renderer, gameTimeStatusTexture, &messageRect, &messagePositon);
745 void GameSurfaceSDL::SystemMessage(std::string message)
747 SDL_Surface *surface;
748 this->currentSystemMessage = message;
749 surface = TTF_RenderUTF8_Blended(font, toUTF8(this->currentSystemMessage.c_str()).c_str(), color);
750 systemMessageTexture = SDL_CreateTextureFromSurface(renderer, surface);
752 this->currentSystemMessage.erase();
753 SDL_FreeSurface(surface);
756 void GameSurfaceSDL::GameMessage(std::string message)
758 SDL_Surface *boxSurface, *textSurface;
759 SDL_Rect textPosition = {2, 2, 0, 0};
760 this->currentGameMessage = message;
761 if(gameMessageTexture) SDL_DestroyTexture(gameMessageTexture);
762 boxSurface = SDL_CreateRGBSurface(0, 512, 20, 32, 0, 0, 0, 0);
763 textSurface = TTF_RenderUTF8_Blended(font, toUTF8(this->currentGameMessage.c_str()).c_str(), color);
764 SDL_BlitSurface(textSurface, NULL, boxSurface, &textPosition);
765 gameMessageTexture = SDL_CreateTextureFromSurface(renderer, boxSurface);
766 SDL_FreeSurface(textSurface);
767 SDL_FreeSurface(boxSurface);
770 void GameSurfaceSDL::updateCreatureGraphics(CREATURE_IT creatureIt)
772 SDL_Rect symbolRect = {0, 0, squareGraphicWidth, squareGraphicHeight};
773 SDL_Surface *surface, *symbolSurface;
776 SDL_DestroyTexture(creatureTextures[creatureIt->first]);
777 creatureTextures.erase(creatureIt->first);
779 surface = SDL_CreateRGBSurface(0, squareGraphicWidth, squareGraphicHeight, 32, 0, 0, 0, 0);
780 Color symColor = creatureIt->second->GetSymbolColor();
781 SDL_Color sdlSymCol = {(Uint8)symColor.GetRed(), (Uint8)symColor.GetGreen(), (Uint8)symColor.GetBlue(), (Uint8)symColor.GetAlpha()};
782 sprintf_s(symBuf, 5, "%s", creatureIt->second->GetSymbol().c_str());
783 SDL_Rect blitRect = {0, 0, squareGraphicWidth, squareGraphicHeight};
785 symbolSurface = TTF_RenderUTF8_Blended(font, toUTF8(symBuf).c_str(), sdlSymCol);
787 blitRect.x += (squareGraphicWidth - symbolSurface->w) / 2;
788 blitRect.y += (squareGraphicHeight - symbolSurface->h) / 2;
790 SDL_BlitSurface(symbolSurface, &symbolRect, surface, &blitRect);
791 SDL_FreeSurface(symbolSurface);
793 creatureTextures.insert(std::map<ID, SDL_Texture*>::value_type(creatureIt->first, SDL_CreateTextureFromSurface(renderer, surface)));
794 SDL_FreeSurface(surface);