void DrawingSurface_Clear(ScriptDrawingSurface *sds, int colour) { Bitmap *ds = sds->StartDrawing(); int allegroColor; if ((colour == -SCR_NO_VALUE) || (colour == SCR_COLOR_TRANSPARENT)) { allegroColor = ds->GetMaskColor(); } else { allegroColor = ds->GetCompatibleColor(colour); } ds->Fill(allegroColor); sds->FinishedDrawing(); }
void DrawBackground(Bitmap& bitmap) { const int gridSize=8; unsigned short light=RGB32TO16(0x999999); unsigned short dark=RGB32TO16(0x666666); for (int y=0; y<bitmap.GetHeight()/gridSize; y++) { for (int x=0; x<bitmap.GetWidth()/gridSize; x++) { int c=((x&2)+(y&2))&2; unsigned short color=(c?light:dark); bitmap.Fill(x*gridSize,y*gridSize,x*gridSize+gridSize,y*gridSize+gridSize,color); } } }
void Rectangle::Render(Bitmap& bitmap) { if (IsVisible() && width_>0 && height_>0) { int x1=(int)(GetX()-GetOriginX()); int y1=(int)(GetY()-GetOriginY()); int x2=x1+(int)GetWidth()-1; int y2=y1+(int)GetHeight()-1; if (x1==0 && y1==0 && x2==bitmap.GetWidth()-1 && y2==bitmap.GetHeight()-1 && GetColor()==0 && GetAlpha()==255) { bitmap.Clear(); } else { bitmap.Fill(x1,y1,x2,y2,GetColor(),GetAlpha()); } } }
int RunAGSGame (const char *newgame, unsigned int mode, int data) { can_run_delayed_command(); int AllowedModes = RAGMODE_PRESERVEGLOBALINT | RAGMODE_LOADNOW; if ((mode & (~AllowedModes)) != 0) quit("!RunAGSGame: mode value unknown"); if (use_compiled_folder_as_current_dir || editor_debugging_enabled) { quit("!RunAGSGame cannot be used while running the game from within the AGS Editor. You must build the game EXE and run it from there to use this function."); } if ((mode & RAGMODE_LOADNOW) == 0) { // need to copy, since the script gets destroyed get_current_dir_path(gamefilenamebuf, newgame); game_file_name = gamefilenamebuf; usetup.main_data_filename = game_file_name; play.takeover_data = data; load_new_game_restore = -1; if (inside_script) { curscript->queue_action(ePSARunAGSGame, mode | RAGMODE_LOADNOW, "RunAGSGame"); ccInstance::GetCurrentInstance()->Abort(); } else load_new_game = mode | RAGMODE_LOADNOW; return 0; } int result, ee; unload_old_room(); displayed_room = -10; unload_game_file(); if (Common::AssetManager::SetDataFile(game_file_name) != Common::kAssetNoError) quitprintf("!RunAGSGame: unable to load new game file '%s'", game_file_name.GetCStr()); Bitmap *ds = GetVirtualScreen(); ds->Fill(0); show_preload(); if ((result = load_game_file ()) != 0) { quitprintf("!RunAGSGame: error %d loading new game file", result); } spriteset.reset(); if (spriteset.initFile ("acsprset.spr")) quit("!RunAGSGame: error loading new sprites"); if ((mode & RAGMODE_PRESERVEGLOBALINT) == 0) { // reset GlobalInts for (ee = 0; ee < MAXGSVALUES; ee++) play.globalscriptvars[ee] = 0; } init_game_settings(); play.screen_is_faded_out = 1; if (load_new_game_restore >= 0) { load_game (load_new_game_restore); load_new_game_restore = -1; } else start_game(); return 0; }
void unload_old_room() { int ff; // if switching games on restore, don't do this if (displayed_room < 0) return; Out::FPrint("Unloading room %d", displayed_room); current_fade_out_effect(); Bitmap *ds = GetVirtualScreen(); ds->Fill(0); for (ff=0;ff<croom->numobj;ff++) objs[ff].moving = 0; if (!play.ambient_sounds_persist) { for (ff = 1; ff < MAX_SOUND_CHANNELS; ff++) StopAmbientSound(ff); } cancel_all_scripts(); numevents = 0; // cancel any pending room events if (roomBackgroundBmp != NULL) { gfxDriver->DestroyDDB(roomBackgroundBmp); roomBackgroundBmp = NULL; } if (croom==NULL) ; else if (roominst!=NULL) { save_room_data_segment(); delete roominstFork; delete roominst; roominstFork = NULL; roominst=NULL; } else croom->tsdatasize=0; memset(&play.walkable_areas_on[0],1,MAX_WALK_AREAS+1); play.bg_frame=0; play.bg_frame_locked=0; play.offsets_locked=0; remove_screen_overlay(-1); delete raw_saved_screen; raw_saved_screen = NULL; for (ff = 0; ff < MAX_BSCENE; ff++) play.raw_modified[ff] = 0; for (ff = 0; ff < thisroom.numLocalVars; ff++) croom->interactionVariableValues[ff] = thisroom.localvars[ff].value; // wipe the character cache when we change rooms for (ff = 0; ff < game.numcharacters; ff++) { if (charcache[ff].inUse) { delete charcache[ff].image; charcache[ff].image = NULL; charcache[ff].inUse = 0; } // ensure that any half-moves (eg. with scaled movement) are stopped charextra[ff].xwas = INVALID_X; } play.swap_portrait_lastchar = -1; for (ff = 0; ff < croom->numobj; ff++) { // un-export the object's script object if (objectScriptObjNames[ff][0] == 0) continue; ccRemoveExternalSymbol(objectScriptObjNames[ff]); } for (ff = 0; ff < MAX_HOTSPOTS; ff++) { if (thisroom.hotspotScriptNames[ff][0] == 0) continue; ccRemoveExternalSymbol(thisroom.hotspotScriptNames[ff]); } // clear the object cache for (ff = 0; ff < MAX_INIT_SPR; ff++) { delete objcache[ff].image; objcache[ff].image = NULL; } // clear the actsps buffers to save memory, since the // objects/characters involved probably aren't on the // new screen. this also ensures all cached data is flushed for (ff = 0; ff < MAX_INIT_SPR + game.numcharacters; ff++) { delete actsps[ff]; actsps[ff] = NULL; if (actspsbmp[ff] != NULL) gfxDriver->DestroyDDB(actspsbmp[ff]); actspsbmp[ff] = NULL; delete actspswb[ff]; actspswb[ff] = NULL; if (actspswbbmp[ff] != NULL) gfxDriver->DestroyDDB(actspswbbmp[ff]); actspswbbmp[ff] = NULL; actspswbcache[ff].valid = 0; } // if Hide Player Character was ticked, restore it to visible if (play.temporarily_turned_off_character >= 0) { game.chars[play.temporarily_turned_off_character].on = 1; play.temporarily_turned_off_character = -1; } }
BITMAPINFO *plLayerTex::GetVPDisplayDIB(TimeValue t, TexHandleMaker& thmaker, Interval &valid, BOOL mono, BOOL forceW, BOOL forceH) { // FIXME fTexTime = 0;//CalcFrame(t); // texValid = clipValid; BITMAPINFO *bmi = NULL; int xflags = 0; if (fBitmapPB->GetInt(kBmpApply)) { float clipu = fBitmapPB->GetFloat(kBmpClipU); float clipv = fBitmapPB->GetFloat(kBmpClipV); float clipw = fBitmapPB->GetFloat(kBmpClipW); float cliph = fBitmapPB->GetFloat(kBmpClipH); int discardAlpha = fBitmapPB->GetInt(kBmpDiscardAlpha); int alphaAsRGB = (fBitmapPB->GetInt(kBmpRGBOutput) == 1); int w = fBM->Width(); int h = fBM->Height(); Bitmap *newBM; BitmapInfo bi; bi.SetName(_T("y8798734")); bi.SetType(BMM_TRUE_32); bi.SetFlags(MAP_HAS_ALPHA); if (fBitmapPB->GetInt(kBmpCropPlace) == 1) { int x0, y0, nw, nh; int bmw = thmaker.Size(); int bmh = int(float(bmw)*float(h)/float(w)); bi.SetWidth(bmw); bi.SetHeight(bmh); newBM = TheManager->Create(&bi); newBM->Fill(0,0,0,0); nw = int(float(bmw)*clipw); nh = int(float(bmh)*cliph); x0 = int(float(bmw-1)*clipu); y0 = int(float(bmh-1)*clipv); if (nw<1) nw = 1; if (nh<1) nh = 1; PixelBuf row(nw); Bitmap *tmpBM; BitmapInfo bif2; bif2.SetName(_T("xxxx67878")); bif2.SetType(BMM_TRUE_32); bif2.SetFlags(MAP_HAS_ALPHA); bif2.SetWidth(nw); bif2.SetHeight(nh); tmpBM = TheManager->Create(&bif2); tmpBM->CopyImage(fBM, COPY_IMAGE_RESIZE_LO_QUALITY, 0); BMM_Color_64* p1 = row.Ptr(); for (int y = 0; y<nh; y++) { tmpBM->GetLinearPixels(0,y, nw, p1); if (alphaAsRGB) { for (int ix =0; ix<nw; ix++) p1[ix].r = p1[ix].g = p1[ix].b = p1[ix].a; } if (discardAlpha) { for (int ix = 0; ix < nw; ix++) p1[ix].a = 0xffff; } newBM->PutPixels(x0, y+y0, nw, p1); } tmpBM->DeleteThis(); bmi = thmaker.BitmapToDIB(newBM, fUVGen->SymFlags(), xflags, forceW, forceH); newBM->DeleteThis(); } else { int x0,y0,nw,nh; x0 = int(float(w-1)*clipu); y0 = int(float(h-1)*clipv); nw = int(float(w)*clipw); nh = int(float(h)*cliph); if (nw<1) nw = 1; if (nh<1) nh = 1; bi.SetWidth(nw); bi.SetHeight(nh); PixelBuf row(nw); newBM = TheManager->Create(&bi); BMM_Color_64* p1 = row.Ptr(); for (int y = 0; y<nh; y++) { fBM->GetLinearPixels(x0,y+y0, nw, p1); if (alphaAsRGB) { for (int ix = 0; ix < nw; ix++) p1[ix].r = p1[ix].g = p1[ix].b = p1[ix].a; } if (discardAlpha) { for (int ix = 0; ix < nw; ix++) p1[ix].a = 0xffff; } newBM->PutPixels(0, y, nw, p1); } bmi = thmaker.BitmapToDIB(newBM, fUVGen->SymFlags(), xflags, forceW, forceH); newBM->DeleteThis(); } } else { if (fBitmapPB->GetInt(kBmpRGBOutput) == 1) xflags |= EX_RGB_FROM_ALPHA; bmi = thmaker.BitmapToDIB(fBM, fUVGen->SymFlags(), xflags, forceW, forceH); } return bmi; }