the sartrean knight

publicado

overview

the sartrean knight é uma curta história interativa que mistura fantasia medieval com filosofia existencialista. inspirado nas obras de Jean-Paul Sartre, o jogo convida você a navegar por uma jornada reflexiva sobre significado, liberdade e as consequências de suas escolhas.

você joga como um cavaleiro cansado diante de um guardião misterioso. através de diálogos e memórias, você determinará seu próprio caminho e conclusão, com múltiplos finais únicos e suporte completo para português e inglês.

eu desenvolvi o the sartrean knight em uma semana, durante a fase inicial da minha experiência na Apple Developer Academy. o projeto foi uma oportunidade de explorar narrativa interativa e design de escolhas significativas.

pude aprender bastante sobre o uso de JSON para construir a estrutura narrativa de um jogo, além de aprimorar minhas habilidades em SwiftUI e Combine. foi também uma forma rudimentar de implementar a localização para um aplicativo, que abriu caminho para aprender posteriormente sobre o uso de catálogos de strings.

design choices

palette

mist #F1F1F1
ink #000000
paper #FFFFFF

typography

MedievalSharp / antiguidade e autenticidade
Zebras jogam xadrez com o velho faquir
Jacquard 24 / toque decorativo gótico
Zebras jogam xadrez com o velho faquir

rationale

o design do the sartrean knight foi inspirado na estética dos manuscritos medievais, refletindo o tema filosófico e histórico da narrativa.

a escolha das fontes MedievalSharp e Jacquard 24 visa evocar a sensação de antiguidade e autenticidade, enquanto a paleta de cores suaves e texturas de papel antigo complementam a atmosfera contemplativa do jogo.

em termos do desenvolvimento da história, a escolha por incluir imagens a cada etapa da narrativa foi feita para enriquecer a experiência do jogador, proporcionando um contexto visual que ajuda a imergir na ambientação medieval.

as imagens foram criadas para refletir os temas e emoções presentes em cada parte da história, reforçando a conexão entre o jogador e o enredo.

a moldura das imagens foi projetada para se assemelhar a uma ilustração decorada que poderia ser vista em um livro antigo.

as imagens em si não seguem um estilo artístico específico, embora tenham certa tendência gótica, mas buscam capturar a essência do cenário e dos personagens de maneira evocativa.

tech stack

SwiftUI
framework de UI
Combine
estado reativo
JSON / Codable
motor de narrativa
Icon Composer
criação de assets

code snippets

Otimização de carregamento de dados da história

swift
private func loadStory() {
    guard let url = Bundle.main.url(forResource: "story", withExtension: "json"),
          let data = try? Data(contentsOf: url) else { return }
    do {
        let decoded = try JSONDecoder().decode(StoryData.self, from: data)
        for page in decoded.screens {
            pages[page.id] = page
        }
        orderedPages = decoded.screens
        currentPageID = decoded.screens.first?.id
    } catch {
        print("Failed to decode story.json: \(error)")
    }
}

Analisador de tipografia personalizado

swift
func parseFigureSegments(_ input: String) -> [FigureSegment] {
    var segments: [FigureSegment] = []
    let parts = input.components(separatedBy: "[figure]")
    
    for part in parts {
        if part.contains("[/figure]") {
            let subParts = part.components(separatedBy: "[/figure]")
            if subParts.count >= 1 {
                segments.append(FigureSegment(text: subParts[0], isFigure: true))
                if subParts.count > 1 && !subParts[1].isEmpty {
                    segments.append(FigureSegment(text: subParts[1], isFigure: false))
                }
            }
        } else if !part.isEmpty {
            segments.append(FigureSegment(text: part, isFigure: false))
        }
    }
    return segments
}

Sistema de localização reativo

swift
class AppLanguage: ObservableObject {
    enum Language: String {
        case english = "en"
        case portuguese = "pt"
    }
    
    @Published var current: Language = .english
    
    func toggle() {
        current = (current == .english) ? .portuguese : .english
    }
}

credits

people

design · development
pedro wiezel

fonts

MedievalSharp
Wojciech Kalinowski
Jacquard 24
Sarah Cadigan-Fried

assets

textures
@joou e @samueladekunle (Comunidade Figma)
backgrounds