add intro

This commit is contained in:
2026-08-28 22:02:58 +07:00
parent 5fcbf6f2c5
commit 1a05799b2d
17 changed files with 1103 additions and 364 deletions
+14 -1
View File
@@ -4,13 +4,26 @@ type IStory interface {
GetStory(scenario *Story, codes []string) *Story
}
// История - это набор точек
// История - это введение и набор точек
type Story struct {
// Введение - то, что игрок получает в начале игры
Introduction *Introduction `json:"introduction,omitempty"`
// Список точек
Places []*Place `json:"places"`
}
// Введение - текст и аудио, которые игрок получает в начале игры
type Introduction struct {
// Текст введения
Text string `json:"text"`
// Аудио введения
Audio string `json:"audio,omitempty"`
}
// Точка - что-то куда можно сходить
// Это может быть место - аптека, остановка, площадь...
// Это может быть персонаж - пострадавший, продавец, полицейский...
+8
View File
@@ -21,6 +21,14 @@ func (s *story) GetStory(
codesWithUseActions := map[string]struct{}{}
codesHidden := map[string]struct{}{}
givenApplications := map[string]struct{}{}
// Введение передаётся игроку всегда — и до первого хода (начало игры),
// и в дальнейшем (как заголовок истории).
if scenario.Introduction != nil {
story.Introduction = &Introduction{
Text: s.cleaner.ClearText(scenario.Introduction.Text),
Audio: scenario.Introduction.Audio,
}
}
for i, code := range codes {
var prevPlace *Place
if i > 0 {
@@ -28,6 +28,52 @@ func Test_story_GetStory(t *testing.T) {
},
},
},
{
name: "Введение передаётся в начале игры (без действий)",
scenario: &Story{
Introduction: &Introduction{
Text: "Текст введения.([Ы])",
Audio: "intro.mp3",
},
},
codes: []string{},
want: &Story{
Introduction: &Introduction{
Text: "Текст введения.",
Audio: "intro.mp3",
},
},
},
{
name: "Введение передаётся вместе с точками",
scenario: &Story{
Introduction: &Introduction{
Text: "Текст введения.",
Audio: "intro.mp3",
},
Places: []*Place{
{
Code: "Ы",
Name: "Название точки",
Text: "Текст точки.",
},
},
},
codes: []string{"Ы"},
want: &Story{
Introduction: &Introduction{
Text: "Текст введения.",
Audio: "intro.mp3",
},
Places: []*Place{
{
Code: "Ы",
Name: "Название точки",
Text: "Текст точки.",
},
},
},
},
{
name: "Получение точки",
scenario: &Story{