void load_room(const char *files, roomstruct *rstruc, bool gameIsHighRes) { Common::Stream *opty; // CHECKME why "opty"?? room_file_header rfh; int i; rstruc->freemessage(); if (rstruc->scripts != NULL) { free(rstruc->scripts); rstruc->scripts = NULL; } if (!rstruc->compiled_script_shared) { delete rstruc->compiled_script; } rstruc->compiled_script = NULL; rstruc->compiled_script_shared = false; if (rstruc->num_bscenes > 1) { int ff; for (ff = 1; ff < rstruc->num_bscenes; ff++) { delete rstruc->ebscene[ff]; rstruc->ebscene[ff] = NULL; } update_polled_stuff_if_runtime(); } rstruc->num_bscenes = 1; rstruc->bscene_anim_speed = 5; memset (&rstruc->objectnames[0][0], 0, MAX_INIT_SPR * MAXOBJNAMELEN); memset (&rstruc->objectscriptnames[0][0], 0, MAX_INIT_SPR * MAX_SCRIPT_NAME_LEN); memset (&rstruc->regionLightLevel[0], 0, sizeof(short) * MAX_REGIONS); memset (&rstruc->regionTintLevel[0], 0, sizeof(int) * MAX_REGIONS); for (i = 0; i <= MAX_WALK_AREAS; i++) { rstruc->walk_area_zoom2[i] = NOT_VECTOR_SCALED; rstruc->walk_area_top[i] = -1; rstruc->walk_area_bottom[i] = -1; } for (i = 0; i < rstruc->numhotspots; i++) rstruc->hsProps[i].reset(); for (i = 0; i < rstruc->numsprs; i++) rstruc->objProps[i].reset(); rstruc->roomProps.reset(); if (rstruc->roomScripts != NULL) { delete rstruc->roomScripts; rstruc->roomScripts = NULL; } if (rstruc->hotspotScripts != NULL) { for (i = 0; i < rstruc->numhotspots; i++) { delete rstruc->hotspotScripts[i]; } delete[] rstruc->hotspotScripts; rstruc->hotspotScripts = NULL; } if (rstruc->objectScripts != NULL) { for (i = 0; i < rstruc->numsprs; i++) { delete rstruc->objectScripts[i]; } delete[] rstruc->objectScripts; rstruc->objectScripts = NULL; } if (rstruc->regionScripts != NULL) { for (i = 0; i < rstruc->numRegions; i++) { delete rstruc->regionScripts[i]; } delete[] rstruc->regionScripts; rstruc->regionScripts = NULL; } if (rstruc->localvars != NULL) free (rstruc->localvars); rstruc->localvars = NULL; rstruc->numLocalVars = 0; memset(&rstruc->ebpalShared[0], 0, MAX_BSCENE); update_polled_stuff_if_runtime(); opty = Common::AssetManager::OpenAsset(files); if (opty == NULL) { char errbuffr[500]; sprintf(errbuffr,"Load_room: Unable to load the room file '%s'\n" "Make sure that you saved the room to the correct folder (it should be\n" "in your game's sub-folder of the AGS directory).\n" "Also check that the player character's starting room is set correctly.\n",files); quit(errbuffr); } update_polled_stuff_if_runtime(); // it can take a while to load the file sometimes rfh.ReadFromFile(opty); //fclose(opty); rstruc->wasversion = rfh.version; if (load_room_is_version_bad(rstruc)) { delete opty; quit("Load_Room: Bad packed file. Either the file requires a newer or older version of\n" "this program or the file is corrupt.\n"); } int thisblock = 0; int bloklen; while (thisblock != BLOCKTYPE_EOF) { update_polled_stuff_if_runtime(); thisblock = opty->ReadByte(); if (thisblock == BLOCKTYPE_EOF) break; bloklen = opty->ReadInt32(); bloklen += opty->GetPosition(); // make it the new position for after block read if (thisblock == BLOCKTYPE_MAIN) load_main_block(rstruc, files, opty, rfh); else if (thisblock == BLOCKTYPE_SCRIPT) { int lee; int hh; lee = opty->ReadInt32(); rstruc->scripts = (char *)malloc(lee + 5); // MACPORT FIX: swap opty->Read(rstruc->scripts, lee); rstruc->scripts[lee] = 0; for (hh = 0; hh < lee; hh++) rstruc->scripts[hh] += passwencstring[hh % 11]; } else if (thisblock == BLOCKTYPE_COMPSCRIPT3) { rstruc->compiled_script = ccScript::CreateFromStream(opty); rstruc->compiled_script_shared = false; if (rstruc->compiled_script == NULL) quit("Load_room: Script load failed; need newer version?"); } else if ((thisblock == BLOCKTYPE_COMPSCRIPT) || (thisblock == BLOCKTYPE_COMPSCRIPT2)) #ifdef LOADROOM_ALLOWOLD rstruc->compiled_script = NULL; #else quit("Load_room: old room format. Please upgrade the room."); #endif else if (thisblock == BLOCKTYPE_OBJECTNAMES) { if (opty->ReadByte() != rstruc->numsprs) quit("Load_room: inconsistent blocks for object names"); opty->ReadArray(&rstruc->objectnames[0][0], MAXOBJNAMELEN, rstruc->numsprs); } else if (thisblock == BLOCKTYPE_OBJECTSCRIPTNAMES) { if (opty->ReadByte() != rstruc->numsprs) quit("Load_room: inconsistent blocks for object script names"); opty->ReadArray(&rstruc->objectscriptnames[0][0], MAX_SCRIPT_NAME_LEN, rstruc->numsprs); } else if (thisblock == BLOCKTYPE_ANIMBKGRND) { int ct; long fpos; rstruc->num_bscenes = opty->ReadByte(); rstruc->bscene_anim_speed = opty->ReadByte(); if (rfh.version >= kRoomVersion_255a) opty->Read(&rstruc->ebpalShared[0], rstruc->num_bscenes); else memset (&rstruc->ebpalShared[0], 0, rstruc->num_bscenes); fpos = opty->GetPosition(); // fclose(opty); for (ct = 1; ct < rstruc->num_bscenes; ct++) { update_polled_stuff_if_runtime(); // fpos = load_lzw(files,rstruc->ebscene[ct],rstruc->pal,fpos); fpos = load_lzw(opty, rstruc->ebscene[ct], rstruc->bpalettes[ct]); rstruc->ebscene[ct] = recalced; } // opty = Common::AssetManager::OpenAsset(files, "rb"); // Seek(opty, fpos, SEEK_SET); } else if (thisblock == BLOCKTYPE_PROPERTIES) { // Read custom properties if (opty->ReadInt32() != 1) quit("LoadRoom: unknown Custom Properties Bitmap *encounreted"); int errors = 0, gg; if (rstruc->roomProps.UnSerialize (opty)) quit("LoadRoom: error reading custom properties Bitmap *"); for (gg = 0; gg < rstruc->numhotspots; gg++) errors += rstruc->hsProps[gg].UnSerialize (opty); for (gg = 0; gg < rstruc->numsprs; gg++) errors += rstruc->objProps[gg].UnSerialize (opty); if (errors > 0) quit("LoadRoom: errors encountered reading custom props"); } else if (thisblock == -1) { delete opty; quit("LoadRoom: unexpected end of file while loading room"); return; } else { char tempbfr[90]; sprintf(tempbfr, "LoadRoom: unknown block type %d encountered in '%s'", thisblock, files); quit(tempbfr); } // The GetPosition call below has caused crashes if (opty->GetPosition() != bloklen) opty->Seek(Common::kSeekBegin, bloklen); }