public Text(ObjectMan objMan, ResMan resMan, bool czechVersion) { _objMan = objMan; _resMan = resMan; _textCount = 0; _fontId = (uint)(czechVersion ? SwordRes.CZECH_GAME_FONT : SwordRes.GAME_FONT); _font = _resMan.OpenFetchRes(_fontId); _joinWidth = (ushort)(CharWidth((byte)' ') - 2 * Overlap); _charHeight = _resMan.ReadUInt16(new FrameHeader(_resMan.FetchFrame(_font, 0)).height); // all chars have the same height }
private void CreatePointer(uint ptrId, uint luggageId) { _currentPtr = null; if (ptrId != 0) { MousePtr lugg = null; MousePtr ptr = new MousePtr(_resMan.OpenFetchRes(ptrId)); ushort noFrames = _resMan.ReadUInt16(ptr.numFrames); ushort ptrSizeX = _resMan.ReadUInt16(ptr.sizeX); ushort ptrSizeY = _resMan.ReadUInt16(ptr.sizeY); ushort luggSizeX = 0; ushort luggSizeY = 0; ushort resSizeX; ushort resSizeY; if (Sword1.SystemVars.Platform == Platform.PSX) //PSX pointers are half height { ptrSizeY *= 2; } if (luggageId != 0) { lugg = new MousePtr(_resMan.OpenFetchRes(luggageId)); luggSizeX = _resMan.ReadUInt16(lugg.sizeX); luggSizeY = _resMan.ReadUInt16(lugg.sizeY); if (SystemVars.Platform == Platform.PSX) { luggSizeY *= 2; } resSizeX = Math.Max(ptrSizeX, (ushort)((ptrSizeX / 2) + luggSizeX)); resSizeY = Math.Max(ptrSizeY, (ushort)((ptrSizeY / 2) + luggSizeY)); } else { resSizeX = ptrSizeX; resSizeY = ptrSizeY; } _currentPtr = new MousePtr(new byte[MousePtr.Size + resSizeX * resSizeY * noFrames]); _currentPtr.hotSpotX = _resMan.ReadUInt16(ptr.hotSpotX); _currentPtr.hotSpotY = _resMan.ReadUInt16(ptr.hotSpotY); _currentPtr.numFrames = noFrames; _currentPtr.sizeX = resSizeX; _currentPtr.sizeY = resSizeY; var ptrData = _currentPtr; var ptrDataOff = MousePtr.Size; int dstDataOff = 0; ptrData.Data.Set(ptrData.Offset + ptrDataOff, 255, resSizeX * resSizeY * noFrames); if (luggageId != 0) { dstDataOff = ptrDataOff + resSizeX - luggSizeX; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { var luggSrc = MousePtr.Size; dstDataOff += (resSizeY - luggSizeY) * resSizeX; for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? luggSizeY / 2 : luggSizeY); cnty++) { for (uint cntx = 0; cntx < luggSizeX; cntx++) { if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; } } if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < luggSizeX; cntx++) { if (lugg.Data[lugg.Offset + luggSrc + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = lugg.Data[lugg.Offset + luggSrc + cntx]; } } } dstDataOff += resSizeX; luggSrc += luggSizeX; } } _resMan.ResClose(luggageId); } dstDataOff = ptrDataOff; var srcDataOff = MousePtr.Size; for (uint frameCnt = 0; frameCnt < noFrames; frameCnt++) { for (uint cnty = 0; cnty < (uint)(SystemVars.Platform == Platform.PSX ? ptrSizeY / 2 : ptrSizeY); cnty++) { for (uint cntx = 0; cntx < ptrSizeX; cntx++) { if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; } } if (SystemVars.Platform == Platform.PSX) { dstDataOff += resSizeX; for (uint cntx = 0; cntx < ptrSizeX; cntx++) { if (ptr.Data[ptr.Offset + srcDataOff + cntx] != 0) { ptrData.Data[ptrData.Offset + dstDataOff + cntx] = ptr.Data[ptr.Offset + srcDataOff + cntx]; } } } srcDataOff += ptrSizeX; dstDataOff += resSizeX; } dstDataOff += (resSizeY - ptrSizeY) * resSizeX; } _resMan.ResClose(ptrId); } }
private ByteAccess LockText(uint textId, Language lang) { var addr = _resMan.OpenFetchRes(_textList[(int)(textId / ObjectMan.ITM_PER_SEC), (int)lang]); if (addr == null) { return(null); } var addrOff = Header.Size; // TODO: //if ((textId & ITM_ID) >= _resMan->readUint32(addr)) //{ // // Workaround for missing sentences in some langages in the demo. // switch (textId) // { // case 8455194: // return const_cast<char*>(_translationId8455194[lang]); // case 8455195: // return const_cast<char*>(_translationId8455195[lang]); // case 8455196: // return const_cast<char*>(_translationId8455196[lang]); // case 8455197: // return const_cast<char*>(_translationId8455197[lang]); // case 8455198: // return const_cast<char*>(_translationId8455198[lang]); // case 8455199: // return const_cast<char*>(_translationId8455199[lang]); // case 8455200: // return const_cast<char*>(_translationId8455200[lang]); // case 8455201: // return const_cast<char*>(_translationId8455201[lang]); // case 8455202: // return const_cast<char*>(_translationId8455202[lang]); // case 8455203: // return const_cast<char*>(_translationId8455203[lang]); // case 8455204: // return const_cast<char*>(_translationId8455204[lang]); // case 8455205: // return const_cast<char*>(_translationId8455205[lang]); // case 6488080: // return const_cast<char*>(_translationId6488080[lang]); // case 6488081: // return const_cast<char*>(_translationId6488081[lang]); // case 6488082: // return const_cast<char*>(_translationId6488082[lang]); // case 6488083: // return const_cast<char*>(_translationId6488083[lang]); // } // warning("ObjectMan::lockText(%d): only %d texts in file", textId & ITM_ID, _resMan->readUint32(addr)); // return NULL; //} uint offset = _resMan.ReadUInt32(addr.ToUInt32((int)(addrOff + ((textId & ITM_ID) + 1) * 4))); if (offset == 0) { // TODO: Workaround bug for missing sentence in some langages in Syria (see bug #1977094). // We use the hardcoded text in this case. //if (textId == 2950145) // return const_cast<char*>(_translationId2950145[lang]); // TODO: warning("ObjectMan::lockText(%d): text number has no text lines", textId); return(null); } return(new ByteAccess(addr, (int)(addrOff + offset))); }