/** Draws the Control on the Output Display */ void MapControl::Draw(unsigned short XWin, unsigned short YWin) { if (!Width || !Height) { return; } if (Owner->Visible!=WINDOW_VISIBLE) { return; } if (Changed) { Realize(); Changed = false; } // we're going to paint over labels/etc, so they need to repaint! bool seen_this = false; unsigned int i; for (i = 0; i < Owner->GetControlCount(); i++) { Control *ctrl = Owner->GetControl(i); if (!ctrl) continue; // we could try working out which controls overlap, // but the later controls are cheap to paint.. if (ctrl == this) { seen_this = true; continue; } if (!seen_this) continue; ctrl->Changed = true; } Video* video = core->GetVideoDriver(); Region r( XWin + XPos, YWin + YPos, Width, Height ); if (MapMOS) { video->BlitSprite( MapMOS, MAP_TO_SCREENX(0), MAP_TO_SCREENY(0), true, &r ); } if (core->FogOfWar&FOG_DRAWFOG) DrawFog(XWin, YWin); Region vp = video->GetViewport(); vp.x = GAME_TO_SCREENX(vp.x); vp.y = GAME_TO_SCREENY(vp.y); vp.w = ViewWidth; vp.h = ViewHeight; if ((vp.x + vp.w) >= MAP_TO_SCREENX( Width )) vp.w = MAP_TO_SCREENX( Width ) - vp.x; if ((vp.y + vp.h) >= MAP_TO_SCREENY( Height )) vp.h = MAP_TO_SCREENY( Height ) - vp.y; video->DrawRect( vp, colors[green], false, false ); // Draw PCs' ellipses Game *game = core->GetGame(); i = game->GetPartySize(true); while (i--) { Actor* actor = game->GetPC( i, true ); if (MyMap->HasActor(actor) ) { video->DrawEllipse( (short) GAME_TO_SCREENX(actor->Pos.x), (short) GAME_TO_SCREENY(actor->Pos.y), 3, 2, actor->Selected ? colors[green] : colors[darkgreen], false ); } } // Draw Map notes, could be turned off in bg2 // we use the common control value to handle it, because then we // don't need another interface if (Value!=MAP_NO_NOTES) { i = MyMap -> GetMapNoteCount(); while (i--) { MapNote * mn = MyMap -> GetMapNote(i); Sprite2D *anim = Flag[mn->color&7]; Point pos = mn->Pos; if (convertToGame) { vp.x = GAME_TO_SCREENX(mn->Pos.x); vp.y = GAME_TO_SCREENY(mn->Pos.y); } else { //pst style vp.x = MAP_TO_SCREENX(mn->Pos.x); vp.y = MAP_TO_SCREENY(mn->Pos.y); pos.x = pos.x * MAP_MULT / MAP_DIV; pos.y = pos.y * MAP_MULT / MAP_DIV; } //Skip unexplored map notes bool visible = MyMap->IsVisible( pos, true ); if (!visible) continue; if (anim) { video->BlitSprite( anim, vp.x - anim->Width/2, vp.y - anim->Height/2, true, &r ); } else { video->DrawEllipse( (short) vp.x, (short) vp.y, 6, 5, colors[mn->color&7], false ); } } } }
void Game_Screen::Update() { if (data.tint_time_left > 0) { data.tint_current_red = interpolate(data.tint_time_left, data.tint_current_red, data.tint_finish_red); data.tint_current_green = interpolate(data.tint_time_left, data.tint_current_green, data.tint_finish_green); data.tint_current_blue = interpolate(data.tint_time_left, data.tint_current_blue, data.tint_finish_blue); data.tint_current_sat = interpolate(data.tint_time_left, data.tint_current_sat, data.tint_finish_sat); data.tint_time_left--; } if (data.flash_time_left > 0) { data.flash_current_level = interpolate(data.flash_time_left, data.flash_current_level / 31, 0); data.flash_time_left--; if (data.flash_time_left <= 0) data.flash_time_left = data.flash_continuous ? flash_period : 0; } if (data.shake_continuous || data.shake_time_left > 0 || data.shake_position != 0) { double delta = (data.shake_strength * data.shake_speed * shake_direction) / 10.0; if (data.shake_time_left <= 1 && data.shake_position * (data.shake_position + delta) < 0) data.shake_position = 0; else data.shake_position += delta; if (data.shake_position > data.shake_strength * 2) shake_direction = -1; if (data.shake_position < -data.shake_strength * 2) shake_direction = 1; if (data.shake_time_left > 0) data.shake_time_left--; } std::vector<EASYRPG_SHARED_PTR<Picture> >::const_iterator it; for (it = pictures.begin(); it != pictures.end(); it++) { if(*it) { (*it)->Update(); } } if (!movie_filename.empty()) { /* update movie */ } switch (data.weather) { case Weather_None: break; case Weather_Rain: InitWeather(); InitSnowRain(); UpdateSnowRain(4); DrawRain(); break; case Weather_Snow: InitWeather(); InitSnowRain(); UpdateSnowRain(2); DrawSnow(); break; case Weather_Fog: InitWeather(); DrawFog(); break; case Weather_Sandstorm: InitWeather(); DrawSandstorm(); break; } if (animation != NULL) { animation->Update(); if (animation->IsDone()) { animation.reset(); } } }