// テキストチャットのメッセージ1つの全体管理担当 // メッセージ1つの構成要素:発言したユーザー名とそのアイコン、吹き出し画像、タイムスタンプテキスト、メッセージ内容[文章/画像/エモート画像] class TCMessageGUIManager { const string DEFAULT_ICON_IMAGE_PATH = "gui2024/menu/mypage/mypage_icon_none.png"; // 識別コード string _messageUUID; // string _vketID; // 番号が小さいと上に行く int _messageSortID; // 発言者が自分か否か bool _isSelfMessage; // 発言者が自分か否か bool _isNotified; TCMessageGUIData _messageData; TCMessageGUIActor _guiActor; bool _isLaTextReSized; bool _isPoTextReSized; public TCMessageGUIManager() { _messageUUID = "-1"; _isSelfMessage = false; _isNotified = false; _messageData = new TCMessageGUIData(); _guiActor = new TCMessageGUIActor(); _isLaTextReSized = false; _isPoTextReSized = false; } // メッセージ識別コード public void SetMessageUUID(string messageUUID){ _messageUUID = messageUUID; } public string GetMessageUUID(){ return _messageUUID; } // vketID public void SetVketID(string vket_id){ _vketID = vket_id; } public string GetVketID(){ return _vketID; } // メッセージ表示順番 public void SetMessageSortID(int messageSortID){ _messageSortID = messageSortID; } public int GetMessageSortID(){ return _messageSortID; } // 送信者が自分か否か public void SetSelfMessageFlag(bool isSelfMessage){ _isSelfMessage = isSelfMessage; } public bool GetSelfMessageFlag(){ return _isSelfMessage; } public TCMessageGUIData GetMessageContentData(){ return _messageData; } // プライベートチャット設定 public void SetPrivateFlag(bool privateChatFlag){ _messageData.SetPrivateFlag(privateChatFlag); } public bool IsPrivateChat(){ return _messageData.GetPrivateFlag(); } // 通知発火確認フラグ public void SetNotifiedFlag(bool noticedFlag){ _isNotified = noticedFlag; } public bool IsNotified(){ return _isNotified; } public void CreateMessageGUI(string layerName) { _guiActor.SetMessageUUID(GetMessageUUID()); _guiActor.CreateMessageGUISet(layerName, _messageData, _isSelfMessage); } public void SetAnchor(string Anchor) { _guiActor.SetAnchor(Anchor); } public bool TextAretaReize(bool isPortrait){ bool isChangeSize = false; // po画面のサイズ取得が完了してるならなにもせず返す if(_isPoTextReSized && isPortrait){ return isChangeSize; } // la画面のサイズ取得が完了してるならなにもせず返す if(_isLaTextReSized && isPortrait == false){ return isChangeSize; } // 置き換え開始(レイアウトが変わってすぐの2Fくらい0,0で取得できないのでそのチェック) bool isSucces = _guiActor.TextAretaReize(isPortrait); if(isSucces == false){ return isChangeSize; } isChangeSize = true; _guiActor.RefleshText(_messageData.GetContentData(), isPortrait); if(isPortrait){ _isPoTextReSized = true; }else{ _isLaTextReSized = true; } return isChangeSize; } public TCMessageGUITransform GetPreMessageTransform(){ return _guiActor.GetPreMessageTransform(); } public void RefleshGUIPos(HS2DI laAnchorPos, HS2DI poAnchorPos) { _guiActor.RefleshGUIPos(laAnchorPos, poAnchorPos); } public void Release() { _guiActor.Release(); } // メッセージ識別コード生成 private void CreateMessageUUID(string vket_id, string userType, string timeStamp){ SetVketID(vket_id); string baseUUIDParam = "%s:%s" % _vketID % userType; // UserCode・フレーム経過時間・Timestampの組み合わせをキーとして一意のMessageIDを決定する string uuid = "%s:%d:%s:%d" % baseUUIDParam % hsSystemGetTime() % timeStamp % hsMathRandom(999999); SetMessageUUID(uuid); } // 全体、個別チャット読み込み public void LoadMessageData(JsVal messageData, bool selfMessageFlag){ string messageType = GetPropertyString(messageData, "messageType"); string userID = GetPropertyString(messageData, "userID"); string logInTypeCode = GetPropertyString(messageData, "logInTypeCode"); string userName = GetPropertyString(messageData, "userName"); string userIconURL = GetPropertyString(messageData, "userIconURL"); string timestamp = GetPropertyString(messageData, "timestamp"); string message = GetPropertyString(messageData, "message"); // メッセージタイプ取得 int messageTypeID = -1; switch(messageType){ case TC_MESSAGE_TYPE_CODE_TEXT: messageTypeID = TC_MESSAGE_TYPE_ID_TEXT; break; case TC_MESSAGE_TYPE_CODE_EMOTE: messageTypeID = TC_MESSAGE_TYPE_ID_EMOTE; break; } if(userIconURL.IsEmpty()){ userIconURL = DEFAULT_ICON_IMAGE_PATH; } _messageData = new TCMessageGUIData(); _messageData.SetMessageTypeID(messageTypeID); _messageData.SetSenderName(userName); _messageData.SetSenderIconURL(userIconURL); _messageData.SetTimeStamp(timestamp); _messageData.SetMessageText(message); _messageData.SetEmoteImageURL(message); CreateMessageUUID(userID, logInTypeCode, timestamp); SetSelfMessageFlag(selfMessageFlag); } // ChatGPTからのチャット読み込み public void LoadChatGPTMessage(Json chatGPTMessage){ string content; chatGPTMessage.FindValueString("content", content); string created_at; chatGPTMessage.FindValueString("created_at", created_at); string charaname; chatGPTMessage.FindValueString("charaname", charaname); int character_id; chatGPTMessage.FindValueInt("character_id", character_id); string name = "ChatGPT"; if(charaname.IsEmpty() == false){ name = charaname; } _messageData = new TCMessageGUIData(); _messageData.SetMessageTypeID(TC_MESSAGE_TYPE_ID_TEXT); _messageData.SetEmoteImageURL(""); _messageData.SetSenderName(name); _messageData.SetSenderIconURL(DEFAULT_ICON_IMAGE_PATH); _messageData.SetTimeStamp(created_at); _messageData.SetMessageText(content); CreateMessageUUID("ChatGPT_Message", "Guest", created_at); SetSelfMessageFlag(false); } public void LoadInviteMessage(Json inviteMessage){ string message; inviteMessage.FindValueString("Message", message); string created_at; inviteMessage.FindValueString("CreatedAt", created_at); string name = "System"; _messageData = new TCMessageGUIData(); _messageData.SetMessageTypeID(TC_MESSAGE_TYPE_ID_TEXT); _messageData.SetEmoteImageURL(""); _messageData.SetSenderName(name); _messageData.SetSenderIconURL(DEFAULT_ICON_IMAGE_PATH); _messageData.SetTimeStamp(created_at); _messageData.SetMessageText(message); CreateMessageUUID("System_Message", "Invite", created_at); SetSelfMessageFlag(false); } private string GetPropertyString(JsVal targetObj, string propertyName){ return targetObj.GetProperty(propertyName).GetStr(); } }