Storyline+Dialog初步

This commit is contained in:
SoulliesOfficial
2026-07-05 16:08:23 -04:00
parent afa8a56e1d
commit d031afd075
464 changed files with 25716 additions and 4209 deletions

View File

@@ -1,39 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.Story.UI;
using SLSUtilities.General;
using UnityEngine;
using UnityEngine.UI.Extensions;
namespace Ichni.Story
{
public class BlockConnectorUI : MonoBehaviour
{
public UILineRenderer curve;
public StoryBlockUIBase startBlock;
public StoryBlockUIBase endBlock;
public void SetCurve(StoryBlockUIBase startBlock = null, StoryBlockUIBase endBlock = null)
{
this.startBlock ??= startBlock;
this.endBlock ??= endBlock;
if(this.startBlock == null || this.endBlock == null)
{
Debug.LogWarning("Start or end block is not set for the curve.");
return;
}
Vector2 startPosition = SpaceConverter.GetLocalUIPosition(this.startBlock.outPort, GetComponent<RectTransform>());
Vector2 endPosition = SpaceConverter.GetLocalUIPosition(this.endBlock.inPort, GetComponent<RectTransform>());
Vector2 mid1 = (startPosition + endPosition) / 2;
Vector2 mid2 = (startPosition + endPosition) / 2;
mid1.y = startPosition.y;
mid2.y = endPosition.y;
curve.Points = new Vector2[] { startPosition, /*mid1*/ mid2, endPosition};
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 98bbf463dca50cc43961c0bb2b8d4f22
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,53 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Ichni.Story.UI
{
public class DialogBlockUI : StoryBlockUIBase
{
public string blockTitle;
public TMP_Text titleText;
public Button button;
public List<ChoiceGroupUI> choiceGroups;
public void Initialize(string blockName, Vector2 position, Vector2 positionOffset,
Vector2 size, StoryBlockState state, string blockTitle)
{
base.Initialize(blockName, position, positionOffset, size, state);
this.blockTitle = blockTitle;
titleText.text = blockTitle;
button.onClick.AddListener(() =>
{
state = this.state;
if(state == StoryBlockState.Locked) return;
StoryManager.instance.storyline.currentBlock = this;
if (state == StoryBlockState.Current)
{
DialogManager.instance.SetDialog(blockName);
DialogManager.instance.PlayNextDialogParagraph(DialogManager.instance.currentDialog);
}
else if (state == StoryBlockState.Completed)
{
DialogManager.instance.SetDialog(blockName);
DialogManager.instance.PlayNextDialogParagraph(DialogManager.instance.currentDialog, false);
DialogManager.instance.RevealDialog();
}
});
}
public override StoryBlockSave GetBlockSave()
{
return new DialogBlockSave(blockName, blockPosition, state);
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: b976128eb3ec59e4e866dbb610441706
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,76 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.Menu;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Ichni.Story.UI
{
public class SongBlockUI : StoryBlockUIBase
{
public string songName;
public Button button;
public TMP_Text songNameText;
public RectTransform beatmapStatusMarkContainer;
public GameObject beatmapStatusMarkPrefab;
public void Initialize(string blockName, Vector2 position, Vector2 positionOffset,
Vector2 size, StoryBlockState state, string songName)
{
base.Initialize(blockName, position, positionOffset, size, state);
this.songName = songName;
songNameText.text = songName;
button.onClick.AddListener(() =>
{
//MenuManager.instance.prepareUIPage.SetUpPrepareUIPage(songName);
//MenuManager.instance.prepareUIPage.FadeIn();
});
SetUpBeatmapStatusMarks();
}
public override StoryBlockSave GetBlockSave()
{
return new SongBlockSave(blockName, blockPosition, state);
}
public void SetUpBeatmapStatusMarks()
{
SongStatusSave songStatusSave = GameSaveManager.instance.SongSaveModule.songStatusSaves[songName];
string chapter = ChapterSelectionManager.instance.currentChapter.chapterIndex;
ChapterSelectionUnit cpt = ChapterSelectionManager.instance.chapters.First(c => c.chapterIndex == chapter);
SongItemData song = cpt.songs.First(s => s.songName == this.songName);
for (var index = 0; index < song.difficultyDataList.Count; index++)
{
var difficulty = song.difficultyDataList[index];
var beatmapSave = songStatusSave.beatmapSaves[index];
if (beatmapSave.isAllPerfect)
{
GameObject mark = Instantiate(beatmapStatusMarkPrefab, beatmapStatusMarkContainer);
mark.GetComponent<Image>().color = difficulty.color;
mark.transform.GetChild(0).GetComponent<TMP_Text>().color = difficulty.color;
mark.transform.GetChild(0).GetComponent<TMP_Text>().text = "AP";
break;
}
if (beatmapSave.isFullCombo)
{
GameObject mark = Instantiate(beatmapStatusMarkPrefab, beatmapStatusMarkContainer);
mark.GetComponent<Image>().color = difficulty.color;
mark.transform.GetChild(0).GetComponent<TMP_Text>().color = difficulty.color;
mark.transform.GetChild(0).GetComponent<TMP_Text>().text = "FC";
break;
}
}
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 5efe0a39fe908354e9ab6d1edfdb8843
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,30 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Serialization;
namespace Ichni.Story.UI
{
public abstract class StoryBlockUIBase : MonoBehaviour
{
public string blockName;
public Vector2 blockPosition;
public StoryBlockState state;
public RectTransform blockRect;
public RectTransform inPort;
public RectTransform outPort;
protected void Initialize(string blockName, Vector2 position, Vector2 positionOffset, Vector2 size, StoryBlockState state)
{
this.blockName = blockName;
this.blockPosition = position;
this.state = state;
blockRect.anchoredPosition = position + positionOffset;
blockRect.sizeDelta = size;
}
public abstract StoryBlockSave GetBlockSave();
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: d489f986a1eea1e4c938658f0fd468ca
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,52 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using Ichni.Menu;
using SLSUtilities.WwiseAssistance;
using TMPro;
using UniRx;
using UnityEngine;
using UnityEngine.UI;
namespace Ichni.Story.UI
{
public class TutorialBlockUI : StoryBlockUIBase
{
public Button button;
public string tutorialName;
public TMP_Text tutorialNameText;
public void Initialize(string blockName, Vector2 position, Vector2 positionOffset, Vector2 size, StoryBlockState state, string tutorialName)
{
base.Initialize(blockName, position, positionOffset, size, state);
this.tutorialName = tutorialName;
tutorialNameText.text = tutorialName;
button.onClick.AddListener(EnterTutorial);
}
public override StoryBlockSave GetBlockSave()
{
return new TutorialBlockSave(blockName, blockPosition, state);
}
private void EnterTutorial()
{
ChapterSelectionUnit chapter = ChapterSelectionManager.instance.currentChapter;
SongItemData song = ChapterSelectionManager.instance.tutorialCollection.songs[chapter.chapterIndex];
DifficultyData difficulty = song.difficultyDataList[0];
InformationTransistor.instance.SetInformation(chapter, song, difficulty);
InformationTransistor.instance.isReturnedFromTutorial = true;
InformationTransistor.instance.isReturnedFromGame = false;
AudioManager.Post(AK.EVENTS.ENTERTOGAME);
SongSelectionManager.instance.StopPreviewSong();
DOTween.KillAll();
Observable.Timer(TimeSpan.FromSeconds(0.6f)).Subscribe(_ => { MenuManager.instance.EnterGameScene(); });
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 821e50e1519236a46b03eb1f005acebe
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: