58 lines
3.2 KiB
C#
58 lines
3.2 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using VS.Sim;
|
|
using Vector2 = UnityEngine.Vector2;
|
|
|
|
// 스토리 대화 — 원작 StoryLitePopup(화자 이름 · 대사 · 감정 · 탭으로 다음)
|
|
namespace VS.View
|
|
{
|
|
public partial class GameApp
|
|
{
|
|
static readonly Color32[] CharColor = { new Color32(255, 120, 170, 255), new Color32(110, 170, 255, 255), new Color32(255, 190, 80, 255), new Color32(130, 210, 150, 255), new Color32(180, 130, 255, 255), new Color32(255, 140, 110, 255) };
|
|
|
|
public void OpenStory(StoryChapterRow ch)
|
|
{
|
|
if (ch == null || ch.lines == null || ch.lines.Count == 0) { if (ch != null) G.MarkStorySeen(ch.id); return; }
|
|
var p = NewPopup("Story", "", 760, new Color32(60, 40, 90, 255));
|
|
p.panel.anchoredPosition = new Vector2(0, -520);
|
|
var dim = p.root.GetComponent<Button>(); dim.onClick.RemoveAllListeners();
|
|
var face = UI.Img(p.panel, "Face", Skin.Circle, Color.white);
|
|
face.rectTransform.Place(new Vector2(0, 1), new Vector2(0, 1), new Vector2(140, 60), new Vector2(220, 220));
|
|
var faceIn = UI.Img(face.transform, "In", null, Color.white); faceIn.preserveAspect = true; faceIn.rectTransform.Fill(6, 6, 6, 6);
|
|
var speaker = UI.Txt(p.panel, "Speaker", "", 48, Color.white, TextAnchor.MiddleLeft, true);
|
|
speaker.rectTransform.Place(new Vector2(0, 1), new Vector2(1, 1), new Vector2(280, -65), new Vector2(-400, 90), new Vector2(0, 0.5f));
|
|
var text = UI.Txt(p.body, "Text", "", 44, Pal.Ink, TextAnchor.UpperLeft);
|
|
text.rectTransform.Fill(10, 120, 10, 20);
|
|
int idx = 0;
|
|
Text nextLabel = null;
|
|
void Show()
|
|
{
|
|
var ln = ch.lines[idx];
|
|
var loc = G.StoryLine(ln.key);
|
|
speaker.text = loc != null ? loc.speakerName : "";
|
|
text.text = loc != null ? loc.text : ln.key;
|
|
if (ln.characterId == 1) { face.color = Pal.Pink; faceIn.sprite = Art.Idol(G.S.closetCurrent, ln.emotion == "Happy" || ln.emotion == "Excited" ? 2 : (ln.emotion == "Sad" ? 1 : 0)); faceIn.color = Color.white; }
|
|
else { face.color = CharColor[ln.characterId % CharColor.Length]; faceIn.sprite = Skin.Icon("follower"); faceIn.color = Color.white; }
|
|
nextLabel.text = idx + 1 < ch.lines.Count ? "다음 ▶" : "닫기";
|
|
}
|
|
var next = UI.TextBtn(p.body, "Next", "", Pal.Purple, 40, () =>
|
|
{
|
|
idx++;
|
|
if (idx >= ch.lines.Count) { G.MarkStorySeen(ch.id); ClosePopup(); return; }
|
|
Show();
|
|
}, out nextLabel);
|
|
next.GetComponent<RectTransform>().Place(new Vector2(1, 0), new Vector2(1, 0), new Vector2(-170, 70), new Vector2(300, 110));
|
|
var skip = UI.TextBtn(p.body, "Skip", "건너뛰기", Pal.Gray, 34, () => { G.MarkStorySeen(ch.id); ClosePopup(); }, out _);
|
|
skip.GetComponent<RectTransform>().Place(new Vector2(0, 0), new Vector2(0, 0), new Vector2(150, 70), new Vector2(240, 100));
|
|
Show();
|
|
}
|
|
|
|
void TryOpenStory()
|
|
{
|
|
if (PopupOpen || Headless) return;
|
|
var ch = G.NextStory();
|
|
if (ch != null) OpenStory(ch);
|
|
}
|
|
}
|
|
}
|