protected override void HandleSeqMessage(BinaryMessage message) { var reader = message.GetReader(); switch (message.Type) { case RMSG_NEWWDG: Receive(reader.ReadWidgetCreateEvent()); break; case RMSG_WDGMSG: Receive(reader.ReadWidgetMessageEvent()); break; case RMSG_DSTWDG: Receive(reader.ReadWidgetDestroyEvent()); break; case RMSG_MAPIV: { int type = reader.ReadByte(); switch (type) { case 0: Receive(reader.ReadMapInvalidateGridEvent()); break; case 1: Receive(reader.ReadMapInvalidateRegionEvent()); break; case 2: Receive(new MapInvalidate()); break; } break; } case RMSG_GLOBLOB: bool isIncremental = reader.ReadByte() != 0; while (reader.HasRemaining) { var type = reader.ReadCString(); var args = reader.ReadList(); switch (type) { case "tm": Receive(new UpdateGameTime { Time = (int)args[0], IsIncremental = isIncremental }); break; case "astro": Receive(new UpdateAstronomy { Day = (float)args[0], MoonPhase = (float)args[1], Year = (float)args[2], IsNight = (byte)args[3] != 0, MoonColor = (Color)args[4] }); break; case "light": Receive(new UpdateLighting { Ambient = (Color)args[0], Diffuse = (Color)args[1], Specular = (Color)args[2], Angle = (float)args[3], Elevation = (float)args[4] }); break; case "sky": if (args.Length > 0) { // TODO: add actual data to sky update message Receive(new SkyUpdate()); } else { Receive(new SkyClear()); } break; case "wth": // TODO: add actual data to weather update message Receive(new UpdateWeather()); break; } } break; case RMSG_PAGINAE: Receive(reader.ReadGameActionsUpdateEvent()); break; case RMSG_RESID: Receive(reader.ReadResourceLoadEvent()); break; case RMSG_PARTY: while (reader.HasRemaining) { int type = reader.ReadByte(); switch (type) { case PD_LIST: Receive(reader.ReadPartyUpdateEvent()); break; case PD_LEADER: Receive(reader.ReadPartyLeaderChangeEvent()); break; case PD_MEMBER: Receive(reader.ReadPartyMemberUpdateEvent()); break; } } break; case RMSG_SFX: Receive(reader.ReadPlaySoundEvent()); break; case RMSG_CATTR: Receive(reader.ReadCharAttributesUpdateEvent()); break; case RMSG_MUSIC: Receive(new PlayMusic()); break; case RMSG_SESSKEY: reader.ReadSessionKeyEvent(); break; default: throw new Exception("Unknown rmsg type: " + message.Type); } }
protected override void HandleSeqMessage(BinaryMessage message) { var reader = message.GetReader(); switch (message.Type) { case RMSG_NEWWDG: Receive(reader.ReadWidgetCreateEvent()); break; case RMSG_WDGMSG: Receive(reader.ReadWidgetMessageEvent()); break; case RMSG_DSTWDG: Receive(reader.ReadWidgetDestroyEvent()); break; case RMSG_MAPIV: { int invalidationType = reader.ReadByte(); switch (invalidationType) { case 0: Receive(reader.ReadMapInvalidateGridEvent()); break; case 1: Receive(reader.ReadMapInvalidateRegionEvent()); break; case 2: Receive(new MapInvalidate()); break; } break; } case RMSG_GLOBLOB: while (reader.HasRemaining) { switch (reader.ReadByte()) { case GMSG_TIME: Receive(reader.ReadGameTimeUpdateEvent()); break; case GMSG_ASTRO: Receive(reader.ReadAstronomyUpdateEvent()); break; case GMSG_LIGHT: Receive(reader.ReadAmbientLightUpdateEvent()); break; } } break; case RMSG_PAGINAE: Receive(reader.ReadGameActionsUpdateEvent()); break; case RMSG_RESID: Receive(reader.ReadResourceLoadEvent()); break; case RMSG_PARTY: while (reader.HasRemaining) { int type = reader.ReadByte(); switch (type) { case PD_LIST: Receive(reader.ReadPartyUpdateEvent()); break; case PD_LEADER: Receive(reader.ReadPartyLeaderChangeEvent()); break; case PD_MEMBER: Receive(reader.ReadPartyMemberUpdateEvent()); break; } } break; case RMSG_SFX: Receive(reader.ReadPlaySoundEvent()); break; case RMSG_CATTR: Receive(reader.ReadCharAttributesUpdateEvent()); break; case RMSG_MUSIC: Receive(new PlayMusic()); break; case RMSG_TILES: Receive(reader.ReadTilesetsLoadEvent()); break; case RMSG_BUFF: { var type = reader.ReadCString(); switch (type) { case "clear": Receive(new BuffClearAll()); break; case "rm": Receive(reader.ReadBuffRemoveEvent()); break; case "set": Receive(reader.ReadBuffUpdateEvent()); break; } break; } default: throw new Exception("Unknown rmsg type: " + message.Type); } }