private void InitializerCallback(object state) { if (backgroundLoaded.IsSet) { return; } using (mutex) { try { MessageMgr.SendMessage(this, "Initializing servant icon"); var iconInfo = new DirectoryInfo(StartupConfig.ICON_DIRECTORY); foreach (var file in iconInfo.GetFiles()) { var iconPattern = Regex.Match(file.Name, StartupConfig.ICON_PARSE_PATTERN); if (iconPattern.Success) { var svtID = int.Parse(iconPattern.Groups[1].Value); if (svtID == 999) { continue; // skip this } var stream = file.OpenRead(); var data = new byte[stream.Length]; stream.Read(data, 0, data.Length); stream.Close(); var memoryStream = new MemoryStream(data); iconCache.Add(svtID, data); Dispatcher.Invoke(new ThreadStart(delegate { // creating images ui element (make sure this code is running at main thread) var img = new Image(); var bmp = new BitmapImage(); bmp.BeginInit(); bmp.StreamSource = memoryStream; bmp.EndInit(); img.Source = bmp; img.Width = 60; img.Height = 60; img.Tag = svtID; img.Cursor = Cursors.Hand; img.MouseLeftButtonDown += Img_MouseLeftButtonDown; iconPanel.Children.Add(img); })); } } MessageMgr.SendMessage(this, "Initialized servant icon successfully"); initializedResult = 0; } catch (Exception ex) { MessageMgr.SendMessage(this, "Initialize servant icon failed: " + ex.ToString()); initializedResult = 1; } finally { backgroundLoaded.Set(); } } }
private static byte[] ReadAllBytes(string path) { if (File.Exists(path)) { MessageMgr.SendMessage(null, "Reading file: " + path); var fs = new FileStream(path, FileMode.Open); var data = new byte[fs.Length]; fs.Read(data, 0, data.Length); fs.Close(); return(data); } return(null); }
public static void GetFusionServantInfo(int headID, int bodyID, int backgroundID, out string servantName, out string servantInfo) { servantName = ""; servantInfo = ""; using (globalMutex) { if (servantInfoDb == null) { MessageMgr.SendMessage(null, "Initializing servant localization database"); servantInfoDb = new Dictionary <int, ServantInfo>(); var csvTable = SimpleCsvParser.ParseTable(StartupConfig.SERVANT_DB_LOCALIZE_FILE); int size = csvTable.Values.First().Count; for (int i = 0; i < size; i++) { int servantID = int.Parse(csvTable["servant_id"][i]); servantInfoDb.Add(servantID, new ServantInfo() { ServantID = servantID, FirstName = csvTable["first_ja_JP"][i], MiddleName = csvTable["middle_ja_JP"][i], LastName = csvTable["last_ja_JP"][i], Name = csvTable["name_ja_JP"][i], Flavor = csvTable["flavor_ja_JP"][i], FlavorFirst = csvTable["flavor_first_ja_JP"][i], FlavorMiddle = csvTable["flavor_middle_ja_JP"][i], FlavorLast = csvTable["flavor_last_ja_JP"][i] }); } MessageMgr.SendMessage(null, "Finished servant localization database initialization"); } } if (headID == bodyID && headID == backgroundID) { // same id if (servantInfoDb.TryGetValue(headID, out var info)) { servantName = info.Name; servantInfo = info.Flavor; } } else { if (servantInfoDb.TryGetValue(headID, out var headInfo) && servantInfoDb.TryGetValue(bodyID, out var bodyInfo) && servantInfoDb.TryGetValue(backgroundID, out var backgroundInfo)) { servantName = headInfo.FirstName + bodyInfo.MiddleName + backgroundInfo.LastName; servantInfo = headInfo.FlavorFirst + bodyInfo.FlavorMiddle + backgroundInfo.FlavorLast; } } }
private void Img_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // a stupid yet efficient way to avoid dead lock if (!backgroundLoaded.IsSet) { return; } var selectedServantID = (int)((Image)sender).Tag; if (!iconCache.TryGetValue(selectedServantID, out var selectedServantIconData)) { MessageMgr.SendMessage(this, "Failed to get icon of servant" + selectedServantID); } else { OnServantIconClicked?.Invoke(this, new ServantIconClickedEventArgs(selectedServantID, selectedServantIconData)); } Visibility = Visibility.Hidden; }
// not thread safe method public static void GenerateFusionServant(Window window, Canvas canvas, int headID, int bodyID, int backgroundID) { int currentSession; using (globalMutex) { if (servantIconDb == null) { MessageMgr.SendMessage(null, "Initializing servant icon database"); servantIconDb = new Dictionary <int, ServantIconData>(); var csvTable = SimpleCsvParser.ParseTable(StartupConfig.SERVANT_DB_PART_FILE); int size = csvTable.Values.First().Count; for (int i = 0; i < size; i++) { int servantID = int.Parse(csvTable["servant_id"][i]); servantIconDb.Add(servantID, new ServantIconData() { ServantID = servantID, Direction = int.Parse(csvTable["direction"][i]), Scale = float.Parse(csvTable["scale"][i]), HeadX = int.Parse(csvTable["head_x"][i]), HeadY = int.Parse(csvTable["head_y"][i]), BodyX = int.Parse(csvTable["body_x"][i]), BodyY = int.Parse(csvTable["body_y"][i]), HeadX2 = int.Parse(csvTable["head_x2"][i]), HeadY2 = int.Parse(csvTable["head_y2"][i]) }); } MessageMgr.SendMessage(null, "Finished servant icon database initialization"); } sessionID++; currentSession = sessionID; } servantIconDb.TryGetValue(headID, out var headData); servantIconDb.TryGetValue(bodyID, out var bodyData); if (bodyData == null) { bodyData = headData; } // perform file IO byte[] bgBack = ReadAllBytes(StartupConfig.BACKGROUND_DIRECTORY + "/bg_" + backgroundID.ToString("000") + ".png"); byte[] bodyBack = ReadAllBytes(StartupConfig.BODY_DIRECTORY + "/sv" + bodyID.ToString("000") + "_body_back.png"); byte[] headBack = ReadAllBytes(StartupConfig.HEAD_DIRECTORY + "/sv" + headID.ToString("000") + "_head_back.png"); byte[] bodyMiddle = ReadAllBytes(StartupConfig.BODY_DIRECTORY + "/sv" + bodyID.ToString("000") + "_body_middle.png"); byte[] headFront = ReadAllBytes(StartupConfig.HEAD_DIRECTORY + "/sv" + headID.ToString("000") + "_head_front.png"); byte[] bodyFront = ReadAllBytes(StartupConfig.BODY_DIRECTORY + "/sv" + bodyID.ToString("000") + "_body_front.png"); byte[] bgFront = ReadAllBytes(StartupConfig.BACKGROUND_DIRECTORY + "/bg_" + backgroundID.ToString("000") + "_front.png"); using (globalMutex) { if (sessionID != currentSession) { return; // session changed: this might not be the newest session, and then return } window.Dispatcher.Invoke(new ThreadStart(delegate { canvas.Children.Clear(); if (bgBack != null) { canvas.Children.Add(CreateImageFromBytes(bgBack)); } if (bodyBack != null) { var e = CreateImageFromBytes(bodyBack); canvas.Children.Add(e); Canvas.SetLeft(e, -256); Canvas.SetTop(e, -152); } if (headBack != null) { var e = CreateImageFromBytes(headBack); canvas.Children.Add(e); int headX = (bodyData.HeadX2 == 0 || bodyID == headID) ? bodyData.HeadX : bodyData.HeadX2; int headY = (bodyData.HeadX2 == 0 || bodyID == headID) ? bodyData.HeadY : bodyData.HeadY2; if (headData.Scale != bodyData.Scale || (bodyData.Direction != 1 && bodyData.Direction != headData.Direction)) { float sign = (bodyData.Direction != 1 && bodyData.Direction != headData.Direction) ? -1 : 1; float scale = bodyData.Scale / headData.Scale; var tf = new ScaleTransform(scale * sign, scale); e.RenderTransform = tf; Canvas.SetLeft(e, 256 - sign * scale * 512 + (headX - 512)); Canvas.SetTop(e, (720 - 1024 * scale) / 2 + (headY - 512)); } else { Canvas.SetLeft(e, -256 + (headX - 512)); Canvas.SetTop(e, -152 + (headY - 512)); } } if (bodyMiddle != null) { var e = CreateImageFromBytes(bodyMiddle); canvas.Children.Add(e); Canvas.SetLeft(e, -256); Canvas.SetTop(e, -152); } if (headFront != null) { var e = CreateImageFromBytes(headFront); canvas.Children.Add(e); int headX = (bodyData.HeadX2 == 0 || bodyID == headID) ? bodyData.HeadX : bodyData.HeadX2; int headY = (bodyData.HeadX2 == 0 || bodyID == headID) ? bodyData.HeadY : bodyData.HeadY2; if (headData.Scale != bodyData.Scale || (bodyData.Direction != 1 && bodyData.Direction != headData.Direction)) { float sign = (bodyData.Direction != 1 && bodyData.Direction != headData.Direction) ? -1 : 1; float scale = bodyData.Scale / headData.Scale; var tf = new ScaleTransform(scale * sign, scale); e.RenderTransform = tf; Canvas.SetLeft(e, 256 - sign * scale * 512 + (headX - 512)); Canvas.SetTop(e, (720 - 1024 * scale) / 2 + (headY - 512)); } else { Canvas.SetLeft(e, -256 + (headX - 512)); Canvas.SetTop(e, -152 + (headY - 512)); } } if (bodyFront != null) { var e = CreateImageFromBytes(bodyFront); canvas.Children.Add(e); Canvas.SetLeft(e, -256); Canvas.SetTop(e, -152); } if (bgFront != null) { canvas.Children.Add(CreateImageFromBytes(bgFront)); } })); MessageMgr.SendMessage(null, "Done"); } }