NScumm.Scumm.ScummEngine.HandleNextCharsetCode C# (CSharp) Метод

HandleNextCharsetCode() приватный Метод

private HandleNextCharsetCode ( Actor a, int &code ) : bool
a Actor
code int
Результат bool
        internal bool HandleNextCharsetCode(Actor a, ref int code)
        {
            int color, frme, c = 0, oldy;
            bool endLoop = false;

            var bufferPos = _charsetBufPos;
            while (!endLoop)
            {
                c = _charsetBuffer[bufferPos++];
                if (!(c == 0xFF || (Game.Version <= 6 && c == 0xFE)))
                {
                    break;
                }
                c = _charsetBuffer[bufferPos++];

                if (NewLineCharacter != 0 && c == NewLineCharacter)
                {
                    c = 13;
                    break;
                }

                switch (c)
                {
                    case 1:
                        c = 13; // new line
                        endLoop = true;
                        break;

                    case 2:
                        _haveMsg = 0;
                        _keepText = true;
                        endLoop = true;
                        break;

                    case 3:
                        _haveMsg = (_game.Version >= 7) ? 1 : 0xFF;
                        _keepText = false;
                        endLoop = true;
                        break;

                    case 8:
					// Ignore this code here. Occurs e.g. in MI2 when you
					// talk to the carpenter on scabb island. It works like
					// code 1 (=newline) in verb texts, but is ignored in
					// spoken text (i.e. here). Used for very long verb
					// sentences.
                        break;

                    case 9:
                        frme = _charsetBuffer[bufferPos] | (_charsetBuffer[bufferPos + 1] << 8);
                        bufferPos += 2;
                        if (a != null)
                            a.StartAnimActor(frme);
                        break;

                    case 10:
					// Note the similarity to the code in debugMessage()
                        {
                            var talkSound_a = (_charsetBuffer[bufferPos] | (_charsetBuffer[bufferPos + 1] << 8) | (_charsetBuffer[bufferPos + 4] << 16) | (_charsetBuffer[bufferPos + 5] << 24));
                            var talkSound_b = (_charsetBuffer[bufferPos + 8] | (_charsetBuffer[bufferPos + 9] << 8) | (_charsetBuffer[bufferPos + 12] << 16) | (_charsetBuffer[bufferPos + 13] << 24));
                            bufferPos += 14;
                            Sound.TalkSound(talkSound_a, talkSound_b, 2);
                            _haveActorSpeechMsg = false;
                        }
                        break;

                    case 12:
                        color = _charsetBuffer[bufferPos] | (_charsetBuffer[bufferPos + 1] << 8);
                        bufferPos += 2;
                        if (color == 0xFF)
                            _charset.SetColor(_charsetColor);
                        else
                            _charset.SetColor((byte)color);
                        break;

                    case 13:
					//debug(0, "handleNextCharsetCode: Unknown opcode 13 %d", READ_LE_UINT16(buffer));
                        bufferPos += 2;
                        break;

                    case 14:
                        oldy = _charset.GetFontHeight();
                        _charset.SetCurID(_charsetBuffer[bufferPos++]);
                        bufferPos += 2;
                        Array.Copy(_charsetData[_charset.GetCurId()], CharsetColorMap, 4);
                        _nextTop -= _charset.GetFontHeight() - oldy;
                        break;

                    default:
                        throw new NotSupportedException(string.Format("handleNextCharsetCode: invalid code {0}", c));
                }
            }
            _charsetBufPos = bufferPos;
            code = c;
            return (c != 2 && c != 3);
        }
ScummEngine