ScriptDynamicSprite* DynamicSprite_CreateFromDrawingSurface(ScriptDrawingSurface *sds, int x, int y, int width, int height) { int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; // use DrawingSurface resolution sds->MultiplyCoordinates(&x, &y); sds->MultiplyCoordinates(&width, &height); Bitmap *ds = sds->StartDrawing(); if ((x < 0) || (y < 0) || (x + width > ds->GetWidth()) || (y + height > ds->GetHeight())) quit("!DynamicSprite.CreateFromDrawingSurface: requested area is outside the surface"); int colDepth = ds->GetColorDepth(); Bitmap *newPic = BitmapHelper::CreateBitmap(width, height, colDepth); if (newPic == NULL) return NULL; newPic->Blit(ds, x, y, 0, 0, width, height); sds->FinishedDrawingReadOnly(); add_dynamic_sprite(gotSlot, newPic, (sds->hasAlphaChannel != 0)); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); return new_spr; }
void precache_view(int view) { if (view < 0) return; for (int i = 0; i < views[view].numLoops; i++) { for (int j = 0; j < views[view].loops[i].numFrames; j++) spriteset.precache (views[view].loops[i].frames[j].pic); } }
// new_room: changes the current room number, and loads the new room from disk void new_room(int newnum,CharacterInfo*forchar) { EndSkippingUntilCharStops(); Out::FPrint("Room change requested to room %d", newnum); update_polled_stuff_if_runtime(); // we are currently running Leaves Screen scripts in_leaves_screen = newnum; // player leaves screen event run_room_event(8); // Run the global OnRoomLeave event run_on_event (GE_LEAVE_ROOM, RuntimeScriptValue().SetInt32(displayed_room)); platform->RunPluginHooks(AGSE_LEAVEROOM, displayed_room); // update the new room number if it has been altered by OnLeave scripts newnum = in_leaves_screen; in_leaves_screen = -1; if ((playerchar->following >= 0) && (game.chars[playerchar->following].room != newnum)) { // the player character is following another character, // who is not in the new room. therefore, abort the follow playerchar->following = -1; } update_polled_stuff_if_runtime(); // change rooms unload_old_room(); if (psp_clear_cache_on_room_change) { // Delete all cached sprites spriteset.removeAll(); // Delete all gui background images for (int i = 0; i < game.numgui; i++) { delete guibg[i]; guibg[i] = NULL; if (guibgbmp[i]) gfxDriver->DestroyDDB(guibgbmp[i]); guibgbmp[i] = NULL; } guis_need_update = 1; } update_polled_stuff_if_runtime(); load_new_room(newnum,forchar); }
ScriptDynamicSprite* DynamicSprite_CreateFromScreenShot(int width, int height) { int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; if (width <= 0) width = virtual_screen->GetWidth(); else width = multiply_up_coordinate(width); if (height <= 0) height = virtual_screen->GetHeight(); else height = multiply_up_coordinate(height); Bitmap *newPic; if (!gfxDriver->UsesMemoryBackBuffer()) { // D3D driver Bitmap *scrndump = BitmapHelper::CreateBitmap(scrnwid, scrnhit, final_col_dep); gfxDriver->GetCopyOfScreenIntoBitmap(scrndump); update_polled_stuff_if_runtime(); if ((scrnwid != width) || (scrnhit != height)) { newPic = BitmapHelper::CreateBitmap(width, height, final_col_dep); newPic->StretchBlt(scrndump, RectWH(0, 0, scrndump->GetWidth(), scrndump->GetHeight()), RectWH(0, 0, width, height)); delete scrndump; } else { newPic = scrndump; } } else { // resize the sprite to the requested size newPic = BitmapHelper::CreateBitmap(width, height, virtual_screen->GetColorDepth()); newPic->StretchBlt(virtual_screen, RectWH(0, 0, virtual_screen->GetWidth(), virtual_screen->GetHeight()), RectWH(0, 0, width, height)); } // replace the bitmap in the sprite set add_dynamic_sprite(gotSlot, gfxDriver->ConvertBitmapToSupportedColourDepth(newPic)); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); GlobalReturnValue.SetDynamicObject(new_spr, new_spr); return new_spr; }
ScriptDynamicSprite* DynamicSprite_CreateFromExistingSprite(int slot, int preserveAlphaChannel) { int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; if (!spriteset.doesSpriteExist(slot)) quitprintf("DynamicSprite.CreateFromExistingSprite: sprite %d does not exist", slot); // create a new sprite as a copy of the existing one Bitmap *newPic = BitmapHelper::CreateBitmapCopy(spriteset[slot]); if (newPic == NULL) return NULL; bool hasAlpha = (preserveAlphaChannel) && ((game.spriteflags[slot] & SPF_ALPHACHANNEL) != 0); // replace the bitmap in the sprite set add_dynamic_sprite(gotSlot, newPic, hasAlpha); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); return new_spr; }
ScriptDynamicSprite* DynamicSprite_CreateFromExistingSprite(int slot, int preserveAlphaChannel) { int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; if (!spriteset.doesSpriteExist(slot)) quitprintf("DynamicSprite.CreateFromExistingSprite: sprite %d does not exist", slot); // create a new sprite as a copy of the existing one Bitmap *newPic = BitmapHelper::CreateBitmap(spritewidth[slot], spriteheight[slot], spriteset[slot]->GetColorDepth()); if (newPic == NULL) return NULL; newPic->Blit(spriteset[slot], 0, 0, 0, 0, spritewidth[slot], spriteheight[slot]); bool hasAlpha = (preserveAlphaChannel) && ((game.spriteflags[slot] & SPF_ALPHACHANNEL) != 0); // replace the bitmap in the sprite set add_dynamic_sprite(gotSlot, newPic, hasAlpha); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); GlobalReturnValue.SetDynamicObject(new_spr, new_spr); return new_spr; }
void add_dynamic_sprite(int gotSlot, Bitmap *redin, bool hasAlpha) { spriteset.set(gotSlot, redin); game.spriteflags[gotSlot] = SPF_DYNAMICALLOC; if (redin->GetColorDepth() > 8) game.spriteflags[gotSlot] |= SPF_HICOLOR; if (redin->GetColorDepth() > 16) game.spriteflags[gotSlot] |= SPF_TRUECOLOR; if (hasAlpha) game.spriteflags[gotSlot] |= SPF_ALPHACHANNEL; spritewidth[gotSlot] = redin->GetWidth(); spriteheight[gotSlot] = redin->GetHeight(); }
int engine_init_sprites() { Out::FPrint("Initialize sprites"); if (spriteset.initFile ("acsprset.spr")) { platform->FinishedUsingGraphicsMode(); allegro_exit(); proper_exit=1; platform->DisplayAlert("Could not load sprite set file ACSPRSET.SPR\n" "This means that the file is missing or there is not enough free\n" "system memory to load the file.\n"); return EXIT_NORMAL; } return RETURN_CONTINUE; }
void free_dynamic_sprite (int gotSlot) { int tt; if ((gotSlot < 0) || (gotSlot >= spriteset.elements)) quit("!FreeDynamicSprite: invalid slot number"); if ((game.spriteflags[gotSlot] & SPF_DYNAMICALLOC) == 0) quitprintf("!DeleteSprite: Attempted to free static sprite %d that was not loaded by the script", gotSlot); delete spriteset[gotSlot]; spriteset.set(gotSlot, NULL); game.spriteflags[gotSlot] = 0; spritewidth[gotSlot] = 0; spriteheight[gotSlot] = 0; // ensure it isn't still on any GUI buttons for (tt = 0; tt < numguibuts; tt++) { if (guibuts[tt].IsDeleted()) continue; if (guibuts[tt].Image == gotSlot) guibuts[tt].Image = 0; if (guibuts[tt].CurrentImage == gotSlot) guibuts[tt].CurrentImage = 0; if (guibuts[tt].MouseOverImage == gotSlot) guibuts[tt].MouseOverImage = 0; if (guibuts[tt].PushedImage == gotSlot) guibuts[tt].PushedImage = 0; } // force refresh of any object caches using the sprite if (croom != NULL) { for (tt = 0; tt < croom->numobj; tt++) { if (objs[tt].num == gotSlot) { objs[tt].num = 0; objcache[tt].sppic = -1; } else if (objcache[tt].sppic == gotSlot) objcache[tt].sppic = -1; } } }
int IAGSEngine::CreateDynamicSprite(int32 coldepth, int32 width, int32 height) { int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return 0; if ((width < 1) || (height < 1)) quit("!IAGSEngine::CreateDynamicSprite: invalid width/height requested by plugin"); // resize the sprite to the requested size Bitmap *newPic = BitmapHelper::CreateTransparentBitmap(width, height, coldepth); if (newPic == NULL) return 0; // add it into the sprite set add_dynamic_sprite(gotSlot, newPic); return gotSlot; }
ScriptDynamicSprite* DynamicSprite_Create(int width, int height, int alphaChannel) { multiply_up_coordinates(&width, &height); int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; Bitmap *newPic = BitmapHelper::CreateTransparentBitmap(width, height, System_GetColorDepth()); if (newPic == NULL) return NULL; if ((alphaChannel) && (System_GetColorDepth() < 32)) alphaChannel = false; add_dynamic_sprite(gotSlot, ReplaceBitmapWithSupportedFormat(newPic), alphaChannel != 0); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); return new_spr; }
ScriptDynamicSprite* DynamicSprite_Create(int width, int height, int alphaChannel) { multiply_up_coordinates(&width, &height); int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; Bitmap *newPic = BitmapHelper::CreateBitmap(width, height, final_col_dep); if (newPic == NULL) return NULL; newPic->Clear(newPic->GetMaskColor()); if ((alphaChannel) && (final_col_dep < 32)) alphaChannel = false; add_dynamic_sprite(gotSlot, gfxDriver->ConvertBitmapToSupportedColourDepth(newPic), alphaChannel != 0); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); GlobalReturnValue.SetDynamicObject(new_spr, new_spr); return new_spr; }
ScriptDynamicSprite* DynamicSprite_CreateFromBackground(int frame, int x1, int y1, int width, int height) { if (frame == SCR_NO_VALUE) { frame = play.bg_frame; } else if ((frame < 0) || (frame >= thisroom.num_bscenes)) quit("!DynamicSprite.CreateFromBackground: invalid frame specified"); if (x1 == SCR_NO_VALUE) { x1 = 0; y1 = 0; width = play.room_width; height = play.room_height; } else if ((x1 < 0) || (y1 < 0) || (width < 1) || (height < 1) || (x1 + width > play.room_width) || (y1 + height > play.room_height)) quit("!DynamicSprite.CreateFromBackground: invalid co-ordinates specified"); multiply_up_coordinates(&x1, &y1); multiply_up_coordinates(&width, &height); int gotSlot = spriteset.findFreeSlot(); if (gotSlot <= 0) return NULL; // create a new sprite as a copy of the existing one Bitmap *newPic = BitmapHelper::CreateBitmap(width, height, thisroom.ebscene[frame]->GetColorDepth()); if (newPic == NULL) return NULL; newPic->Blit(thisroom.ebscene[frame], x1, y1, 0, 0, width, height); // replace the bitmap in the sprite set add_dynamic_sprite(gotSlot, newPic); ScriptDynamicSprite *new_spr = new ScriptDynamicSprite(gotSlot); GlobalReturnValue.SetDynamicObject(new_spr, new_spr); return new_spr; }
void init_game_settings() { int ee; for (ee=0;ee<256;ee++) { if (game.paluses[ee]!=PAL_BACKGROUND) palette[ee]=game.defpal[ee]; } if (game.options[OPT_NOSCALEFNT]) wtext_multiply=1; for (ee = 0; ee < game.numcursors; ee++) { // The cursor graphics are assigned to mousecurs[] and so cannot // be removed from memory if (game.mcurs[ee].pic >= 0) spriteset.precache (game.mcurs[ee].pic); // just in case they typed an invalid view number in the editor if (game.mcurs[ee].view >= game.numviews) game.mcurs[ee].view = -1; if (game.mcurs[ee].view >= 0) precache_view (game.mcurs[ee].view); } // may as well preload the character gfx if (playerchar->view >= 0) precache_view (playerchar->view); for (ee = 0; ee < MAX_INIT_SPR; ee++) objcache[ee].image = NULL; /* dummygui.guiId = -1; dummyguicontrol.guin = -1; dummyguicontrol.objn = -1;*/ our_eip=-6; // game.chars[0].talkview=4; //init_language_text(game.langcodes[0]); for (ee = 0; ee < MAX_INIT_SPR; ee++) { scrObj[ee].id = ee; // 64 bit: Using the id instead // scrObj[ee].obj = NULL; } for (ee=0;ee<game.numcharacters;ee++) { memset(&game.chars[ee].inv[0],0,MAX_INV*sizeof(short)); game.chars[ee].activeinv=-1; game.chars[ee].following=-1; game.chars[ee].followinfo=97 | (10 << 8); game.chars[ee].idletime=20; // can be overridden later with SetIdle or summink game.chars[ee].idleleft=game.chars[ee].idletime; game.chars[ee].transparency = 0; game.chars[ee].baseline = -1; game.chars[ee].walkwaitcounter = 0; game.chars[ee].z = 0; charextra[ee].xwas = INVALID_X; charextra[ee].zoom = 100; if (game.chars[ee].view >= 0) { // set initial loop to 0 game.chars[ee].loop = 0; // or to 1 if they don't have up/down frames if (views[game.chars[ee].view].loops[0].numFrames < 1) game.chars[ee].loop = 1; } charextra[ee].process_idle_this_time = 0; charextra[ee].invorder_count = 0; charextra[ee].slow_move_counter = 0; charextra[ee].animwait = 0; } // multiply up gui positions guibg = (Bitmap **)malloc(sizeof(Bitmap *) * game.numgui); guibgbmp = (IDriverDependantBitmap**)malloc(sizeof(IDriverDependantBitmap*) * game.numgui); for (ee=0;ee<game.numgui;ee++) { guibg[ee] = NULL; guibgbmp[ee] = NULL; } our_eip=-5; for (ee=0;ee<game.numinvitems;ee++) { if (game.invinfo[ee].flags & IFLG_STARTWITH) playerchar->inv[ee]=1; else playerchar->inv[ee]=0; } play.score=0; play.sierra_inv_color=7; play.talkanim_speed = 5; play.inv_item_wid = 40; play.inv_item_hit = 22; play.messagetime=-1; play.disabled_user_interface=0; play.gscript_timer=-1; play.debug_mode=game.options[OPT_DEBUGMODE]; play.inv_top=0; play.inv_numdisp=0; play.obsolete_inv_numorder=0; play.text_speed=15; play.text_min_display_time_ms = 1000; play.ignore_user_input_after_text_timeout_ms = 500; play.ignore_user_input_until_time = 0; play.lipsync_speed = 15; play.close_mouth_speech_time = 10; play.disable_antialiasing = 0; play.rtint_level = 0; play.rtint_light = 255; play.text_speed_modifier = 0; play.text_align = SCALIGN_LEFT; // Make the default alignment to the right with right-to-left text if (game.options[OPT_RIGHTLEFTWRITE]) play.text_align = SCALIGN_RIGHT; play.speech_bubble_width = get_fixed_pixel_size(100); play.bg_frame=0; play.bg_frame_locked=0; play.bg_anim_delay=0; play.anim_background_speed = 0; play.silent_midi = 0; play.current_music_repeating = 0; play.skip_until_char_stops = -1; play.get_loc_name_last_time = -1; play.get_loc_name_save_cursor = -1; play.restore_cursor_mode_to = -1; play.restore_cursor_image_to = -1; play.ground_level_areas_disabled = 0; play.next_screen_transition = -1; play.temporarily_turned_off_character = -1; play.inv_backwards_compatibility = 0; play.gamma_adjustment = 100; play.num_do_once_tokens = 0; play.do_once_tokens = NULL; play.music_queue_size = 0; play.shakesc_length = 0; play.wait_counter=0; play.key_skip_wait = 0; play.cur_music_number=-1; play.music_repeat=1; play.music_master_volume=160; play.digital_master_volume = 100; play.screen_flipped=0; play.offsets_locked=0; play.cant_skip_speech = user_to_internal_skip_speech(game.options[OPT_NOSKIPTEXT]); play.sound_volume = 255; play.speech_volume = 255; play.normal_font = 0; play.speech_font = 1; play.speech_text_shadow = 16; play.screen_tint = -1; play.bad_parsed_word[0] = 0; play.swap_portrait_side = 0; play.swap_portrait_lastchar = -1; play.in_conversation = 0; play.skip_display = 3; play.no_multiloop_repeat = 0; play.in_cutscene = 0; play.fast_forward = 0; play.totalscore = game.totalscore; play.roomscript_finished = 0; play.no_textbg_when_voice = 0; play.max_dialogoption_width = get_fixed_pixel_size(180); play.no_hicolor_fadein = 0; play.bgspeech_game_speed = 0; play.bgspeech_stay_on_display = 0; play.unfactor_speech_from_textlength = 0; play.mp3_loop_before_end = 70; play.speech_music_drop = 60; play.room_changes = 0; play.check_interaction_only = 0; play.replay_hotkey = 318; // Alt+R play.dialog_options_x = 0; play.dialog_options_y = 0; play.min_dialogoption_width = 0; play.disable_dialog_parser = 0; play.ambient_sounds_persist = 0; play.screen_is_faded_out = 0; play.player_on_region = 0; play.top_bar_backcolor = 8; play.top_bar_textcolor = 16; play.top_bar_bordercolor = 8; play.top_bar_borderwidth = 1; play.top_bar_ypos = 25; play.top_bar_font = -1; play.screenshot_width = 160; play.screenshot_height = 100; play.speech_text_align = SCALIGN_CENTRE; play.auto_use_walkto_points = 1; play.inventory_greys_out = 0; play.skip_speech_specific_key = 0; play.abort_key = 324; // Alt+X play.fade_to_red = 0; play.fade_to_green = 0; play.fade_to_blue = 0; play.show_single_dialog_option = 0; play.keep_screen_during_instant_transition = 0; play.read_dialog_option_colour = -1; play.narrator_speech = game.playercharacter; play.crossfading_out_channel = 0; play.speech_textwindow_gui = game.options[OPT_TWCUSTOM]; if (play.speech_textwindow_gui == 0) play.speech_textwindow_gui = -1; strcpy(play.game_name, game.gamename); play.lastParserEntry[0] = 0; play.follow_change_room_timer = 150; for (ee = 0; ee < MAX_BSCENE; ee++) play.raw_modified[ee] = 0; play.game_speed_modifier = 0; if (debug_flags & DBG_DEBUGMODE) play.debug_mode = 1; gui_disabled_style = convert_gui_disabled_style(game.options[OPT_DISABLEOFF]); memset(&play.walkable_areas_on[0],1,MAX_WALK_AREAS+1); memset(&play.script_timers[0],0,MAX_TIMERS * sizeof(int)); memset(&play.default_audio_type_volumes[0], -1, MAX_AUDIO_TYPES * sizeof(int)); // reset graphical script vars (they're still used by some games) for (ee = 0; ee < MAXGLOBALVARS; ee++) play.globalvars[ee] = 0; for (ee = 0; ee < MAXGLOBALSTRINGS; ee++) play.globalstrings[ee][0] = 0; for (ee = 0; ee < MAX_SOUND_CHANNELS; ee++) last_sound_played[ee] = -1; if (usetup.translation) init_translation (usetup.translation); update_invorder(); displayed_room = -10; }
void apply_config(const ConfigTree &cfg) { { #ifndef WINDOWS_VERSION usetup.digicard=INIreadint(cfg, "sound","digiid", DIGI_AUTODETECT); usetup.midicard=INIreadint(cfg, "sound","midiid", MIDI_AUTODETECT); #else int idx = INIreadint(cfg, "sound","digiwinindx", -1); if (idx == 0) idx = DIGI_DIRECTAMX(0); else if (idx == 1) idx = DIGI_WAVOUTID(0); else if (idx == 2) idx = DIGI_NONE; else if (idx == 3) idx = DIGI_DIRECTX(0); else idx = DIGI_AUTODETECT; usetup.digicard = idx; idx = INIreadint(cfg, "sound","midiwinindx", -1); if (idx == 1) idx = MIDI_NONE; else if (idx == 2) idx = MIDI_WIN32MAPPER; else idx = MIDI_AUTODETECT; usetup.midicard = idx; #endif psp_audio_multithreaded = INIreadint(cfg, "sound", "threaded", psp_audio_multithreaded); // Filter can also be set by command line // TODO: apply command line arguments to ConfigTree instead to override options read from config file const bool should_read_filter = usetup.Screen.Filter.ID.IsEmpty(); // Legacy graphics settings has to be translated into new options; // they must be read first, to let newer options override them, if ones are present read_legacy_graphics_config(cfg, should_read_filter); // Graphics mode usetup.Screen.DriverID = INIreadstring(cfg, "graphics", "driver"); usetup.Screen.DisplayMode.Windowed = INIreadint(cfg, "graphics", "windowed") > 0; const char *screen_sz_def_options[kNumScreenDef] = { "explicit", "scaling", "max" }; usetup.Screen.DisplayMode.ScreenSize.SizeDef = usetup.Screen.DisplayMode.Windowed ? kScreenDef_ByGameScaling : kScreenDef_MaxDisplay; String screen_sz_def_str = INIreadstring(cfg, "graphics", "screen_def"); for (int i = 0; i < kNumScreenDef; ++i) { if (screen_sz_def_str.CompareNoCase(screen_sz_def_options[i]) == 0) { usetup.Screen.DisplayMode.ScreenSize.SizeDef = (ScreenSizeDefinition)i; break; } } usetup.Screen.DisplayMode.ScreenSize.Size = Size(INIreadint(cfg, "graphics", "screen_width"), INIreadint(cfg, "graphics", "screen_height")); usetup.Screen.DisplayMode.ScreenSize.MatchDeviceRatio = INIreadint(cfg, "graphics", "match_device_ratio", 1) != 0; // TODO: move to config overrides (replace values during config load) #if defined(MAC_VERSION) usetup.Screen.Filter.ID = "none"; #else if (should_read_filter) usetup.Screen.Filter.ID = INIreadstring(cfg, "graphics", "filter", "StdScale"); parse_scaling_option(INIreadstring(cfg, "graphics", "game_scale_fs", "proportional"), usetup.Screen.FsGameFrame); if (should_read_filter) parse_scaling_option(INIreadstring(cfg, "graphics", "game_scale_win", "max_round"), usetup.Screen.WinGameFrame); #endif usetup.Screen.DisplayMode.RefreshRate = INIreadint(cfg, "graphics", "refresh"); usetup.Screen.DisplayMode.VSync = INIreadint(cfg, "graphics", "vsync") > 0; usetup.RenderAtScreenRes = INIreadint(cfg, "graphics", "render_at_screenres") > 0; usetup.Supersampling = INIreadint(cfg, "graphics", "supersampling", 1); usetup.enable_antialiasing = INIreadint(cfg, "misc", "antialias") > 0; // This option is backwards (usevox is 0 if no_speech_pack) usetup.no_speech_pack = INIreadint(cfg, "sound", "usespeech", 1) == 0; usetup.user_data_dir = INIreadstring(cfg, "misc", "user_data_dir"); usetup.shared_data_dir = INIreadstring(cfg, "misc", "shared_data_dir"); usetup.translation = INIreadstring(cfg, "language", "translation"); // TODO: move to config overrides (replace values during config load) // PSP: Don't let the setup determine the cache size as it is always too big. #if !defined(PSP_VERSION) // the config file specifies cache size in KB, here we convert it to bytes spriteset.SetMaxCacheSize(INIreadint (cfg, "misc", "cachemax", DEFAULTCACHESIZE / 1024) * 1024); #endif usetup.mouse_auto_lock = INIreadint(cfg, "mouse", "auto_lock") > 0; usetup.mouse_speed = INIreadfloat(cfg, "mouse", "speed", 1.f); if (usetup.mouse_speed <= 0.f) usetup.mouse_speed = 1.f; const char *mouse_ctrl_options[kNumMouseCtrlOptions] = { "never", "fullscreen", "always" }; String mouse_str = INIreadstring(cfg, "mouse", "control", "fullscreen"); for (int i = 0; i < kNumMouseCtrlOptions; ++i) { if (mouse_str.CompareNoCase(mouse_ctrl_options[i]) == 0) { usetup.mouse_control = (MouseControl)i; break; } } const char *mouse_speed_options[kNumMouseSpeedDefs] = { "absolute", "current_display" }; mouse_str = INIreadstring(cfg, "mouse", "speed_def", "current_display"); for (int i = 0; i < kNumMouseSpeedDefs; ++i) { if (mouse_str.CompareNoCase(mouse_speed_options[i]) == 0) { usetup.mouse_speed_def = (MouseSpeedDef)i; break; } } usetup.override_multitasking = INIreadint(cfg, "override", "multitasking", -1); String override_os = INIreadstring(cfg, "override", "os"); usetup.override_script_os = -1; if (override_os.CompareNoCase("dos") == 0) { usetup.override_script_os = eOS_DOS; } else if (override_os.CompareNoCase("win") == 0) { usetup.override_script_os = eOS_Win; } else if (override_os.CompareNoCase("linux") == 0) { usetup.override_script_os = eOS_Linux; } else if (override_os.CompareNoCase("mac") == 0) { usetup.override_script_os = eOS_Mac; } usetup.override_upscale = INIreadint(cfg, "override", "upscale") > 0; } // Apply logging configuration apply_debug_config(cfg); }
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; }