Introduction

Banner

This game is still a work in progress

This website serves as the comprehensive reference for Tribe of the Accord. It is designed to be the main source of truth for all aspects of the game, including game design, technical documentation, onboarding new team members, and providing a full view of the game's development process.

Usage

This document is essential for:

  • Newcomers: To get up to speed with the project, understand the codebase, and grasp the game design.
  • Developers: To reference technical specifications, coding standards, and implementation details.
  • Designers: To understand the game mechanics, design principles, and creative vision.
  • Project Managers: To monitor progress, anticipate risks, and manage production schedules.
  • Entire Team: To maintain a shared understanding of the project goals and ensure cohesive development.

Feedback is greatly appreciated!

Vision/Statement

Main Menu

"Step into a dangerous, untamed world in this top-down action-adventure. As Adira, a fierce survivalist, must face brutal enemies and wield primal weapons as she embarks on a perilous quest to find her kidnapped father."

Preview

Check out the latest recording of the game as it is today.

{% embed youtube id="5611vyefQj4" loading="lazy" %}

This can also be found on the official game landing page.

Target Audience

1. Demographics

  • Age Range: 16-35 years old
  • Gender: All genders
  • Geography: Popular in North America, Europe, and Japan, with growing interest in other regions
  • Language: English, with support for multiple languages including Chinese, Japanese, Spanish, French, and Portuguese

2. Psychographics

  • Player Interests: Fans of games with snappy controls, rewarding exploration, and intricate world-building. They enjoy games with a rich, vibrant aesthetic and appreciate the sense of discovery and environmental storytelling.
  • Gaming Habits: Primarily experienced gamers who invest time into learning the mechanics of a game. They are enthusiasts which is an inherent by-product of following indie games.
  • Values and Motivations: Players want to be surprised and challenged without it being too unfair. They value a sense of accomplishment, exploration, and immersion in a beautifully crafted, mysterious world.

3. Experience Level

  • Skill Level: Intermediate players. We want it to be challenging but not to a point where it's frustrating. We also don't wnat to hand hold the players.
  • Familiarity with Genre: The target audience has a high familiarity with top down action/exploration games, likely having experience with games like Crosscode, Hyper Light Drifter, Unsighted and Tunic. Newcomers to the genre may also find it appealing due to its artistic presentation.

4. Community and Engagement

  • Online Engagement: A lot of online engagement comes from people finding out about unknown games through forums, and if it catches on, then the game is massively discussed. Players frequently discuss strategies, share fan art, and talk about game lore.
  • Multiplayer vs. Single Player Preference: The game is a single-player experience, which caters to players who enjoy immersive, solitary gameplay. Multiplayer isn’t a factor, but the audience enjoys sharing their single-player experiences with others online through discussion and content creation.
  • Followed Influencers: Fans of such games follow YouTube or Twitch influencers who cover indie games and exploration games.
  • Popular Trends: TBA.

Inspirations

This document illustrates all our inspirations for Tribe of the Accord and details elements/aspects of those games that inspired us to develop this title.

1. Moonlighter

Image

  • Genre/Type: Action, RPG, Shop Management
  • Key Elements We Want to Take: Art direction
  • Why it inspires us: It has aesthetically pleasing art.

2. Hyper Light Drifter

Image

  • Genre/Type: Action, Exploration
  • Key Elements We want to Take: Gameplay
  • Why it inspires us: Hyper Light Drifter has exceptionally smooth gameplay - the combat is simple but is made complex due to the enemy designs and exploring the world feels rewarding.

3. Unsighted

Image

  • Genre/Type: Action, Metroidvania
  • Key Elements We want to Take: Aesthetics and gameplay
  • Why it inspires us: Unsighted has great gameplay and level design that is combined with snappy controls.

4. Tunic

Image

  • Genre/Type: Action, Exploration
  • Key Elements We want to Take: World design and intrigue
  • Why it inspires us: Tunic masterfully combines a mystical world with tight gameplay and mind tingling level design.

Other Inspirations

Minor details from other franchises/games that we want to integrate into the game.

  1. Final Fantasy 7 - the polygonal character designs.
  2. Lara Croft - Adira has traits of Lara Craft (Adventurous, Brash and tough).
  3. Metal Gear Solid - Solid and Liquid Snake relationship (Torion & Lorak).
  4. The Last of Us - Joel and Ellie’s relationship Love/Hate (Torion & Adira).
  5. Crash bandicoot - Tribal feel (Masks etc.)
  6. Original Rayman - The themed locations (Forest, Swamps, etc.), Signs to end the game.

Game Loop

This shows the high level sequence of events that makes up the full game.

flowchart TB
    A[User] --> B[Start Game]
    B --> D[Company Intro Animation Splash]

    subgraph Splash_Screens
        direction TB
        D[Company Intro Animation Splash]
        D --> E[Made with Godot Splash]
        E --> F[Controller Recommended Splash]
    end

    F --> G[Main Menu]

    subgraph Adira Sunset
        direction TB
        G --> H[Game Settings]
        G --> I[Play Game]
        G --> J[Exit Game]
    end

    subgraph Save_Slots
        direction TB
        I --> K[Save Slot 1]
        I --> L[Save Slot 2]
        I --> M[Save Slot 3]
    end

    K --> O[Chapter 3]
    L --> N[Chapter 2]
    M --> P[Chapter 1]

    subgraph Chapters
        direction TB
        N --> O[Chapter 2]
        O --> P[Chapter 3]
        P --> Q[Chapter N + 1]
        Q --> Q
        Q --> R[End Game]
    end

Narrative

Story

Tribe of the Accord takes two forms:

  1. Novel Adaptation
  2. Game Adaptation

We need to define separate narratives for each for the following reasons:

  1. Novels thrive on internal monologue, rich prose, and linear narratives. You can explore Adira’s thoughts, detailed world-building, and nuanced relationships deeply.
  2. Games rely on player agency, interactivity, and visual storytelling. A game needs engaging mechanics, moment-to-moment tension, and player-driven discovery.

Character Profile

A Character Profile document is essential for narrative development because it ensures consistency, depth, and believability across the story. It helps writers, designers, and voice actors align on a character’s background, motivations, personality traits, relationships, and narrative arc. By clearly defining who a character is and how they evolve, it prevents contradictions, strengthens emotional impact, and supports meaningful dialogue and story choices throughout the game.

Tone of Voice

A Tone of Voice document is crucial because it defines how your game communicates — not just what it says. It ensures all narrative elements, dialogue, UI text, marketing copy, and character interactions feel consistent and authentic to your world. This is especially important in a story-driven game like Tribe of the Accord, where mood, setting, and character identity must align. Whether the tone is solemn, playful, primitive, or poetic, having clear guidance helps every team member (writers, designers, marketers) stay true to the voice of the game — creating a unified, immersive experience for players.

Character Profiles

Characters are the emotional and narrative core of any story. While plot moves the story forward, characters give it meaning. They allow the audience to feel, relate, and invest in what’s happening. Through their desires, fears, and decisions, characters create tension, drive conflict, and deliver growth — all essential elements of compelling storytelling.

🧭 Protagonists & Allies

⚔️ Antagonists

🧩 Character Archetypes

Characters

Adira

Adira

Role in Story

Protagonist — a young huntress on a journey of survival, self-discovery, and independence.

Personality

Headstrong, resourceful, and emotionally guarded. Speaks plainly, often with clipped honesty. Deeply loyal but reluctant to show vulnerability.

Motivation

She wants to prove she can survive without relying on others — especially Torion. Her drive stems from feeling underestimated and burdened by expectation.

Conflict

Struggles between independence and connection. Internally, she fears abandonment and weakness. Externally, she's hunted by the Ursa clan and must learn to trust allies.

Relationships

  • Torion – Father figure; complicated dynamic of protection vs control
  • Freyana – Best friend; opens Adira up emotionally
  • Salzo & Dhoron – Mentors with contrasting views of strength and leadership

Arc Summary

Begins as a defiant, isolated survivor. Over time, she learns that true strength comes from connection, not just self-reliance. Ends with greater emotional maturity and a sense of belonging.

Torion

Torion

Role in Story

Mentor and father figure — once a fierce warrior, now a protective and emotionally distant guardian trying to shield Adira from the world.

Personality

Stoic, disciplined, and cautious. Speaks with weight and intent. Rarely shows emotion but feels deeply beneath the surface.

Motivation

Wants to keep Adira safe at all costs — even if that means controlling her choices. Driven by guilt from his past and fear of losing her like others before.

Conflict

Struggles to balance protection with allowing Adira to grow. Internally, he wrestles with his past actions and whether he deserves forgiveness or redemption.

Relationships

  • Adira – Adopted daughter; torn between his love and his inability to let go
  • Ursa Clan – Former family; a history he’s tried to bury and escape

Arc Summary

Starts as a distant, overprotective figure. Through loss and confrontation, he learns to trust Adira’s strength and ultimately supports her autonomy — even if it costs him everything.

Freyana

Freyana

Role in Story

Sidekick / Deuteragonist — a talkative and emotionally attuned healer who accompanies Adira, offering warmth, support, and a moral counterbalance to Adira’s impulsiveness.

Personality

Overly friendly, emotionally sensitive, and desperate to belong. Freyana is caring and light-hearted on the surface, but deeply insecure underneath. She avoids conflict, often sacrificing her own needs to make others happy.

Motivation

She wants to feel accepted and needed. Her drive to help others stems from a lifelong fear of being unloved or left behind. Healing gives her purpose and identity.

Conflict

Freyana constantly battles between her desire to please and her own unspoken needs. Her fear of letting people down — especially Adira — causes her to overextend herself and lose sight of her own voice.

Relationships

  • Adira – Closest friend; deeply admires her bravery but often feels like she has to “keep up” emotionally and physically
  • Wayoun – Deceased brother; her greatest loss and source of motivation to become a healer
  • Forn (stepfather) – Source of trauma and neglect; his rejection shaped her self-worth

Arc Summary

Starts as a bubbly companion masking her insecurities with humour and kindness. Over time, she begins to assert herself and discover her own agency — not just in helping others, but in choosing what she truly wants from life.

Salzo

Salzo

Role in Story

Sidekick / Deuteragonist / Dynamic / Love Interest — a quiet, skilled survivalist and craftsman from the fallen Aquilla (Eagle) tribe, who develops a growing bond with Adira.

Personality

Reserved, observant, and highly intelligent. Salzo is more comfortable with tools and animals than people. He has a dry wit, is practical, and shows affection through actions rather than words. Though non-confrontational, he’s quietly competitive and emotionally driven beneath the surface.

Motivation

Seeks belonging and emotional connection after losing his tribe. His bond with his eagle Keechi symbolizes his yearning for companionship and loyalty. His fascination with Adira gradually becomes a need for validation and emotional intimacy.

Conflict

Struggles between being helpful and overstepping — especially as his fixation on Adira grows. He is torn between staying true to his quiet, supportive nature and trying to prove himself in a world that values strength and aggression.

Relationships

  • Adira – Initially captivated by her; his admiration evolves into affection, then obsession
  • Dhoron – A source of constant friction; they clash over values and manhood
  • Keechi (his eagle) – His most trusted companion; a symbol of trust, solitude, and heritage

Arc Summary

Starts as a supportive, slightly awkward outsider with valuable survival skills. As tension builds, his feelings for Adira complicate his judgment. By the end, he must confront his possessiveness and decide whether he’s truly acting out of love — or loneliness.

Dhoron

Dhoron

Role in Story

Foil — a hardened warrior and reluctant ally from the fallen Wolf Tribe. He frequently challenges Adira’s ideals and growth, serving as both critic and eventual supporter.

Personality

Gruff, blunt, and confrontational. Dhoron lacks tact and empathy, often coming off as aggressive or antagonistic. He’s fiercely loyal to his people and deeply pragmatic, believing survival comes from strength and caution, not emotion or idealism.

Motivation

Driven by loss and duty — especially the death of his son at the hands of Lorak. He seeks to protect what remains of his tribe and will do whatever is necessary to keep them alive, even if it means rejecting others or appearing heartless.

Conflict

Battles with his resentment toward outsiders, especially Adira, who reminds him of everything he’s lost and what he fears — youthful recklessness, false hope, and unearned leadership. Deep down, he wrestles with guilt and emotional repression.

Relationships

  • Adira – A source of constant tension; he sees her as naïve and entitled, but eventually recognizes her strength
  • Salzo – A frequent rival; they bicker often, though Dhoron masks his grudging respect
  • Lorak – The man who killed his son; Dhoron’s hatred for Lorak is personal, not just political

Arc Summary

Begins as a bitter, closed-off survivalist who resents Adira’s presence. Over time, his respect for her grows, and he reveals a more honourable side — ultimately risking himself to support her cause and confront his past with dignity.

Eremiza

Eremiza

Role in Story

Mentor / Informer / Static — a wise, frail elder and former member of the Ursa tribe who now acts as a peaceful guide and moral compass within the Falls tribe.

Personality

Gentle, thoughtful, and quietly humorous. Eremiza is introspective and riddled with age, yet sharp-minded. He’s patient and slow to speak, but when he does, his words carry weight. Sentimental, with a strong sense of legacy.

Motivation

Seeks peace in his final years and hopes to nurture a community built on compassion, not conquest. He’s driven by a quiet duty to right the wrongs of his past through knowledge-sharing and the guidance of the next generation.

Conflict

Torn between the burden of his history with the Ursa and the need to protect his new tribe. He fears speaking too openly about Torion’s past might unravel fragile alliances. Must balance honesty with wisdom.

Relationships

  • Adira – Takes a special liking to her; sees potential and passion reminiscent of Torion, whom he once respected
  • Torion – Former ally and friend; he guards his knowledge of Torion's history out of both loyalty and caution
  • Falls Tribe – Serves as a quiet mediator and storyteller, respected for his wisdom and neutrality

Arc Summary

Introduced as a reclusive elder with a mysterious past. Gradually becomes a key figure in Adira’s development, offering guidance, cryptic lessons, and private counsel. His influence is subtle but lasting, acting as the moral thread that binds the tribe’s values.

Lorak

Lorak

Role in Story

Primary Antagonist — Torion’s younger brother and the brutal enforcer of the Ursa tribe’s values. Fueled by jealousy, pride, and a desperate need for approval.

Personality

Dominating, bitter, and insecure beneath the surface. Lorak hides emotional wounds behind a mask of strength and aggression. He speaks with authority, but his words often reveal envy and desperation for recognition.

Motivation

Seeks validation from his father, Zaskad, and wants to prove he is worthy of leading the Ursa tribe. His greatest obsession is stepping out from Torion’s shadow and being seen as the true Alpha.

Conflict

Torn between duty to his tribe and his festering resentment toward Torion. He convinces himself that Torion’s abandonment was betrayal, but deep down, he’s still seeking his brother’s acknowledgement — or downfall.

Relationships

  • Torion – Older brother and lifelong rival; Lorak both hates and admires him, and is haunted by his absence
  • Zaskad (The Shaman) – Craves his approval but never receives it, leading to feelings of inadequacy and rage
  • Seega – One of the few who truly understands him, but he ignores her counsel in favour of proving himself

Arc Summary

Starts as a confident, violent leader on a quest to reclaim Torion and restore the tribe’s dominance. As the story unfolds, his insecurities unravel, revealing a tragic figure shaped by rejection, obsession, and a thirst for power he may never truly earn.

Zaskad (The Shaman)

Shaman

Role in Story

Antagonist / Patriarch — the spiritual and authoritarian leader of the Ursa tribe, and father to both Torion and Lorak. A manipulative figure who hides cruelty behind the guise of divine will.

Personality

Dogmatic, prideful, and commanding. Zaskad believes his actions are justified by prophecy and ancestral gods, but in truth, he uses religion to maintain control. He is unyielding, ritualistic, and views emotions as weakness.

Motivation

Wants to ensure the survival and dominance of the Tukcha (Neanderthal) race, believing they are divinely chosen. He sees Torion — not Lorak — as the only worthy successor and is determined to reclaim him to lead the tribe after his death.

Conflict

Struggles with the decline of his power and legacy. His obsession with purity and strength blinds him to the emotional destruction he causes in his sons. Though he speaks of destiny, his true fear is irrelevance.

Relationships

  • Torion – Favourite son; Zaskad feels betrayed by his departure but remains fixated on bringing him back to lead
  • Lorak – Sees him as inadequate and impulsive, a poor replacement for Torion
  • Ursa Tribe – Controls them through fear, tradition, and ritual sacrifice, framing cruelty as holy

Arc Summary

Begins as a dominant tribal figure enforcing a rigid worldview. As Torion defies him and the tribe fractures, his grip loosens and desperation grows. His refusal to adapt ultimately isolates him — revealing the frailty beneath the zealot.

Bruntus

Bruntus

Role in Story

Antagonist Sidekick / Static — Lorak’s loyal but dim-witted companion, a brutish enforcer for the Ursa tribe who serves as comic relief and raw muscle.

Personality

Simple-minded, loud, and fiercely obedient. Bruntus is driven more by instinct than thought, often blurting nonsense or yelling in frustration. Despite his lack of intellect, he is deeply loyal and eager to prove himself in physical contests.

Motivation

Wants to please Lorak and earn approval through physical strength. His world is binary: strength equals worth, weakness deserves mockery or punishment.

Conflict

Lacks independent judgment and is easily manipulated. His blind loyalty leads him into violent or senseless acts, and his inability to understand complex situations can create accidental consequences.

Relationships

  • Lorak – Follows him without question; treats him like an older brother or idol
  • Igrath & Seega – Fellow Ursa tribe members; Bruntus often misunderstands their tension with Lorak
  • Ursa Tribe – Feared and mocked in equal measure; known for winning strength competitions but never trusted with decisions

Arc Summary

Remains largely static — a symbol of the brute force culture of the Ursa. Though he does not grow emotionally, his presence consistently highlights the tribe’s obsession with physical dominance over empathy or intelligence.

Seega

Seega

Role in Story

Dynamic Antagonist Sidekick — a former friend of Torion and current member of the Ursa tribe who questions her tribe’s path and quietly resists Lorak’s leadership.

Personality

Loyal, introspective, and quietly conflicted. Seega is sharp-minded and emotionally mature, often masking her doubts with silence or feigned agreement. She’s observant and calculating, with a deep sense of morality buried beneath layers of tribal loyalty.

Motivation

Seeks clarity on why Torion left and what she truly believes in. Torn between allegiance to the tribe she grew up in and a yearning to follow her own conscience.

Conflict

Struggles internally with her loyalty to the Ursa tribe versus her distrust in Lorak’s methods and her lingering feelings for Torion. Her silence makes her complicit, and she knows it — but speaking out could destroy everything she’s built.

Relationships

  • Torion – Old flame; deeply affected by his abandonment and torn by his reappearance
  • Lorak – Publicly follows him but privately questions his fitness to lead
  • Igrath & Bruntus – Colleagues in Lorak’s inner circle; she quietly distances herself from their extremism

Arc Summary

Begins as a seemingly loyal member of the Ursa hunting party, but over time becomes a subtle saboteur. Her choices play a pivotal role in shifting power dynamics within the tribe, and her emotional bond to Torion becomes a catalyst for moral reckoning.

Igrath

Igrath

Role in Story

Static Antagonist Sidekick — a spiteful member of the Ursa tribe and childhood rival of Torion, driven by vengeance and blind tribal loyalty.

Personality

Loud-mouthed, arrogant, and quick-tempered. Igrath thrives on stirring conflict and asserting dominance, often using mockery or intimidation to mask deep-seated inferiority. He holds grudges like weapons.

Motivation

Wants to see Torion punished and humiliated for leaving the tribe. His sense of identity is built around strength, obedience, and tribal purity — and Torion’s betrayal challenges all of that.

Conflict

Internally driven by unresolved childhood humiliation and physical scarring from a fire during the Aquilla ambush. His obsession with revenge overshadows logic, making him volatile and short-sighted.

Relationships

  • Torion – Hates him with intensity; sees him as a traitor who deserves to suffer
  • Lorak – Loyal follower; flatters him and reinforces his leadership, though it’s opportunistic
  • Seega – Distrusts her wavering loyalty and occasionally challenges her in Lorak’s presence

Arc Summary

A static figure of hatred and aggression. Acts as the first to track and report on Torion’s whereabouts, setting major plot events into motion. Remains unchanging — a symbol of what happens when bitterness consumes purpose.

Drad

Drad

Role in Story

Foil Sidekick — a serious and loyal hunter from the Falls Tribe who supports Dhoron and takes part in the mission to track the Ursa.

Personality

Quiet, focused, and disciplined. Drad doesn't speak unless necessary and rarely displays emotion. He is committed to duty and holds a deep respect for hierarchy and tradition.

Motivation

Wants to prove his worth to the Falls Tribe and earn Dhoron's trust as a capable hunter. He sees contribution to the group as his only path to identity and respect.

Conflict

Internally uncertain whether his stoicism makes him invisible or dependable. He struggles with voicing concerns or ideas, fearing it may seem like dissent.

Relationships

  • Dhoron – Looks up to him as a leader and role model; quietly seeks approval
  • Other Falls hunters – Holds a professional rapport; prefers teamwork over conversation
  • Adira – Watches her warily at first, but grows to respect her resilience

Arc Summary

Introduced as a loyal background figure in the Falls Tribe, Drad steadily becomes a reliable presence during missions. While not emotionally expressive, his consistency and quiet bravery make him a trustworthy companion as tensions rise in the war against the Ursa.

Ursa Clan (Enemies)

Ursa

Role in Story

Antagonistic Faction — the dominant tribal force opposing Adira and her allies. They represent a brutal, patriarchal warrior culture rooted in physical dominance, conquest, and tribal purity.

Personality

As a collective, the Ursa are aggressive, tribalistic, and hierarchical. Their members value strength above all else and are conditioned to suppress emotion in favour of fear, intimidation, and loyalty to the Shaman’s vision. Individual personalities vary, but most enforce the same core values: obedience, violence, and a belief in the superiority of the Tukcha (Neanderthal) bloodline.

Motivation

To expand their territory, eliminate perceived weakness, and assert Tukcha dominance by eradicating or sacrificing members of the Cro race. Their purpose is framed by the Shaman as divine, turning warfare and bloodshed into sacred duty.

Conflict

Internally, the tribe is fractured by favoritism (Torion vs. Lorak), resentment, and personal ambition. While unified on the surface, there are cracks in the ideology — with individuals like Seega beginning to question their values. Externally, they’re in constant conflict with other tribes and settlements that represent empathy, cohabitation, or evolution away from savagery.

Relationships

  • Zaskad (The Shaman) – Worshipped and feared; viewed as the divine mouthpiece and judge
  • Torion – Former hero turned traitor; his absence haunts their ranks and fuels resentment
  • Lorak – Acting commander in the field; feared but not universally respected
  • Adira & Allies – Seen as a threat to their purity and authority — especially because she represents the Cro race

Arc Summary

The Ursa begin the story as the overwhelming threat — violent, dominant, and unwavering. As the plot progresses, individuals within their ranks show cracks in loyalty or belief. Ultimately, they symbolize the collapsing reign of an outdated ideology, challenged by the rise of unity, compassion, and change.

🧩 Character Archetypes

These archetypes are foundational roles that characters often fulfill in stories. They help structure narrative purpose and emotional function, while still allowing room for complexity and depth.

🟢 Protagonist (The Hero)

  • The central figure the audience follows.
  • Drives the story through action, decisions, and growth.
  • Example: Adira — determined, flawed, and on a journey of identity and leadership.

🔵 Deuteragonist

  • Second-most important character; often supports or contrasts the protagonist.
  • Offers emotional grounding or alternative viewpoints.
  • Example: Freyana — emotionally supportive, conflicted, and nurturing.

🔴 Antagonist

  • Opposes the protagonist’s goals, directly or ideologically.
  • Creates conflict and tests the hero’s resolve or morals.
  • Example: Lorak — power-driven rival and thematic shadow of Torion.

🟠 Foil

  • Contrasts with another character to highlight key traits.
  • Not necessarily an enemy — often challenges or complements the hero.
  • Example: Dhoron — hardened realist who exposes Adira’s naivety.

🟡 Mentor

  • Provides wisdom, training, or life lessons.
  • Often guides the hero through internal or external challenges.
  • Example: Torion — reluctant guardian. Eremiza — spiritual and emotional guide.

🟣 Love Interest

  • Romantic or emotional connection for the protagonist.
  • Can introduce vulnerability, tension, or growth.
  • Example: Salzo — soft-spoken builder with growing affection for Adira.

⚫ Shadow

  • A dark mirror of the protagonist.
  • Shows what the hero could become if they give in to fear, pride, or vengeance.
  • Example: Lorak — consumed by envy, obsession, and need for validation.

⚪ Trickster / Comic Relief

  • Disrupts dynamics with humor or mischief.
  • Can also reveal truths others overlook.
  • Example: Bruntus — brutish and comical, masking tragic blind loyalty.

⚙️ Static / Informer / Elder

  • Does not change significantly but provides key information, context, or moral perspective.
  • Anchors the story and guides other characters.
  • Example: Eremiza — wise elder and keeper of tribal memory.

Tone of Voice

Narrative - Book

This game is based on Tribe Chronicles, a trilogy that follows Adira and Torion’s complex and challenging journey through a prehistoric world divided between Homo sapiens and Neanderthals, where the perils of nature are just as threatening as the conflicts between tribes.

The Trilogy - Tribe Chronicles

  • Novel #1: The journey of discovery, survival, and finding belonging (Adira's growth).
  • Novel #2: The moral descent and redemption arc of Torion (a personal war within himself).
  • Novel #3: The full-scale war, legacy, and ultimate sacrifice (the fate of the tribes).

Novel #1 - Tribe of the Accord: Adira's Journey

Adira, a young huntress, embarks on a perilous quest after her father is kidnapped, uncovering the brutal divide between tribes and the forces that seek to control them.

Chapters

A physical PDF copy of the novel can be provided upon request.


Novel #2 - Tribe of the Accord: Torion - The Beast Within

Torion, the once fiercest Neanderthal warrior, struggles to survive the ruthless Ursa clan while questioning his place in a land teetering on the edge of war.

Chapters

Not Started


Novel #3 - Tribe of the Accord: The Last Stand

The final clash between tribes looms as Adira and Torion face their ultimate destinies in a battle that will determine the fate of their people.

Chapters

Not Started

Chapter 1

The book begins with Adira spotting a buck in the moorlands and pursuing it despite warnings. She observes tribespeople and contemplates tribe life, but dismisses it due to Torion's isolation. Frustrated, she misses her target. Torion scolds her for disobeying, emphasizing safety. They return to camp, and Adira helps with hunting tasks. An argument ensues about joining a tribe, causing Adira to storm off, hinting at her restlessness and conflicts with Torion. Chapter 1 introduces Adira's desire for adventure, strained relationship with Torion, and yearning for more.

Chapter 2

Adira finds refuge in a hidden den after running through the moorlands. She reflects on her argument with Torion and her longing for belonging. As she contemplates the stars and their significance, she ponders her relationship with Torion. After waking up, she decides to apologize to Torion, but upon returning to the campsite, she finds it deserted with signs of struggle. Discovering cooked food and realizing Torion expected her back, she becomes alarmed. The chapter ends with Adira sensing danger as a mysterious rustling sound reaches her ears, leaving her in suspense about the impending threat.

Chapter 3

Adira hides and eavesdrops on Igrath and Seega's conversation, realizing they may be connected to Torion's disappearance and wondering why they're after her. She observes them arguing by the fire, overhearing Torion's name. Adira contemplates silently escaping but decides to retrieve her spear for protection. Crawling to the camp's edge, she cautiously reaches for her weapon. In a tense moment, she loses her balance and falls with a noise, leaving her uncertain about whether Igrath and Seega will discover her.

Chapter 4

Adira is pursued by the Ursa clan and uses her agility to create distance through the moorlands. She devises a plan to slow them down with traps made from willow branches, finding refuge in a tall tree overlooking the river. Awakening to the Ursa chopping down her tree, Adira leaps from tree to tree, escaping their destruction. Exhausted but resilient, she narrowly avoids danger and finds herself atop a hill as the Ursa are crushed by the falling trees. Adira's relief and determination drive her forward, and she walks through the forest, eventually resting in a pine tree, vowing to rescue her father. Falling asleep with resolve, Adira prepares for the challenges ahead.

Chapter 5

Adira wakes up hungry and decides to search for food, finding a bird's nest and successfully catching a bird and eggs to eat. As she eats, she reflects on Torion, her captive father figure, and places a daisy in her hair as a symbol of her commitment to rescuing him. Encountering an eagle, she shares a connection with the creature and offers it her catch. Despite her moment of peace, Adira acknowledges her injuries and the need to climb down from the tree, preparing herself for whatever challenges lie ahead.

Chapter 6

Adira finds refuge in the treetops but must eventually descend to the forest floor. She gains confidence as she observes a rabbit, realizing that predators are likely distant. She forages for food, reflecting on her survival skills and her relationship with Torion. She ponders about the Ursa clan and considers her father's hidden past. Adira hides from Igrath and other Ursa members in a cave, narrowly avoiding discovery. As she waits, she's bitten by a snake, introducing a new danger to her already precarious situation.

Chapter 7

Adira grapples with the aftermath of being bitten by a snake. Her survival instincts kick in as she seeks a water source to wash out the venom and manages to find a pond. Despite her weakened state, she's determined to keep moving and escape the pursuing Ursa. Adira is led by an eagle to a ledge overlooking the pond, where she decides to jump in to evade the Ursa. She narrowly avoids their detection while underwater and clings to a branch. The eagle's presence offers her some hope, but her exhaustion and the effects of the snakebite become overwhelming. She manages to retrieve the flower she holds dear, but her strength wanes, and she sinks into unconsciousness, uncertain of her fate.

Chapter 8

Adira wakes up in a woodland near a small pond, finding herself tended to by a young girl named Freyana (Frey). Frey treats Adira's wounds and they engage in a conversation. Adira lies about being from a tribe, but Frey sees through it. Adira opens up about Torion being taken by tribespeople, and Frey suggests seeking help from a tribe to rescue him. Adira is hesitant but decides to stay with Frey and learn from her. They bond over a meal, and Adira falls asleep with the determination to save Torion.

Chapter 9

The chapter begins with Adira reluctantly waking up at Frey's cheerful insistence. They tend to Adira's wounds before starting their gathering lesson. Adira expresses her preference for hunting over gathering, but Frey explains her aversion to killing animals. They set off together, and Frey teaches Adira about different plants and their uses. Adira struggles with foraging and feels frustrated and unskilled compared to Frey. She contemplates her usefulness to a tribe and doubts her abilities. However, she stumbles upon a patch of mushrooms and eagerly collects them, hoping to impress Frey. When she shows Frey her haul, she discovers that the mushrooms are poisonous and must discard them.

Adira's frustration boils over, but they are interrupted by Frey's cries for help. Adira rushes to Frey's aid as she is attacked by a boar and drives it away. They have a heartfelt conversation about their respective pasts, and Adira apologizes for her behavior. Frey gifts Adira a fresh daisy to replace the damaged one in her hair. As they return to camp, they hear the Ursa's roar in the distance, signaling danger approaching.

Chapter 10

Adira and Frey hide from the approaching Ursa, taking cover beneath a dense bush. They overhear the Ursa discussing the destruction of the Cro tribe and the hunt for any remaining tribes. Adira convinces Frey that they must leave to escape the Ursa. They make a run for it, navigating through the forest and eventually reaching the edge of the canyons. Despite Frey's reluctance, they enter the dangerous territory. They encounter a pack of Dire Wolves in a cave and are overwhelmed. Just as they are about to be attacked, two shadowy figures intervene, and Adira loses consciousness.

Chapter 11

Adira wakes up to find herself and Frey in a small alcove near a fire. They are rescued by Salzo and Dhoron from a dire wolf den. Adira and Frey introduce themselves and explain their situation to the men. Dhoron is initially skeptical, but Salzo convinces him to help. Adira mentions the Ursa and their destructive nature, and Salzo reveals that their tribe also hides from them.

Dhoron remains cautious about accepting the girls into their tribe, but they decide to travel together at sunrise. Adira reflects on the perception of outsiders and finds comfort in the kindness of those she has encountered. Salzo's eagle, Keechi, takes a liking to Adira. As they rest, Frey expresses her fear of joining a tribe, but Adira assures her they need the tribe's help. Adira contemplates Torion's views on independence and falls asleep to Salzo's soothing song.

Chapter 12

Adira and Frey struggle to keep up with Salzo and Dhoron as they travel through the canyons towards the Shadowy Forest. The intense heat and lack of water make the journey difficult. Upon entering the forest, the group is enveloped in darkness and must rely on Salzo's guidance. Adira accidentally provokes a bear, leading to a tense encounter. Salzo and Dhoron fend off the bear while Adira feels guilty for her mistake. Dhoron sustains injuries, and Frey tends to his wounds. They set up camp to allow Dhoron to rest and recover.

Chapter 13

Adira helps set up camp, gathering sticks for the fire while feeling Dhoron's disapproval. The tension between them escalates as Dhoron belittles Adira's usefulness and rejects her as a member of the tribe. Adira argues that they need to fight the Ursa, but Dhoron insists on prioritizing the safety of their tribe by staying hidden. Adira storms off into the woods, feeling rejected and alone.

Salzo follows her and tries to comfort her, comparing Dhoron's behavior to a defensive hedgehog. Adira realizes that she is the one pushing people away with her spiky exterior. Salzo encourages her not to give up and assures her that the tribe will accept her if she proves herself. They return to the camp, and Adira volunteers to take the first watch. The chapter ends with Adira watching the flames of the fire, determined to earn the trust of the tribe, even if Dhoron still resents her.

Chapter 14

Adira and her group journey through the Shadowy Forest towards the Falls tribe's camp. They encounter Tusky Falls, a remarkable waterfall, and safely traverse its path. Upon reaching the camp, Adira experiences relief and unease about her place. They meet Eremiza, who knew her father Torion, and he explains his vision for a cooperative tribe. Adira agrees to prove herself to the tribe.

At a gathering, Dhoron downplays the Ursa threat, leading Adira to confront him. She agrees to keep the truth quiet. Adira aids Frey, forming a bond, and receives treatment from the tribe's healers. The chapter delves into Adira's emotions about joining the tribe, her frustration with Dhoron's deceit, and her growing connection with Frey.

Chapter 15

Adira adjusts to tribal life, completing chores for her recovery. Seeking information about her father, she visits Eremiza, who provides trivial anecdotes. Restless, she contemplates rescuing her father alone or seeking help from the tribe. Adira spends time with Frey and Salzo, sharing concerns about fitting in. Salzo reveals his background as an Aquilla tribe survivor and offers to support Adira in leaving to save her father.

Adira and Salzo find solace in a hidden clearing, bonding over their struggles. Salzo explains Dhoron's fear of the Ursa and his value for tribe safety. He and Adira grow closer, sharing gratitude and encouraging her to earn the tribe's trust. Adira catches a hare and considers joining the hunters to save her father.

Chapter 16

Adira experiences a disturbing nightmare in which she tries to reach Torion's voice but is unable to find him. She wakes up in a panic and struggles with the fear of forgetting her father's face. Determined to prove herself and contribute to the tribe, Adira decides to join the hunting clan despite the initial resistance from Dhoron, the leader. She confronts Dhoron and Salzo intervenes, persuading Dhoron to let her train with them.

Adira faces harsh training and criticism from Dhoron, who constantly challenges her. She tries to learn the hunting formations but feels inadequate and restricted. Frustrated with Dhoron's insults towards her father, Adira confronts him, and their argument escalates into a physical altercation. Eremiza intervenes, reprimanding both of them and urging them to find common ground. He reveals Dhoron's past pain and emphasizes the importance of seeking resolution. Adira begins to understand the need to choose her battles and find a way to coexist with Dhoron.

Chapter 17

In Chapter 17, Adira continues to follow Eremiza's advice and avoids engaging with Dhoron's provocation. She joins the other hunters for formation practice and impresses Salzo with her confidence. Adira expresses her newfound connection to the tribe during the formations, and Salzo shares his own perspective on the matter. After a rigorous training session, Adira approaches Dhoron and expresses her concern for her father's safety.

Dhoron initially refuses to help but is shaken by Adira's words and storms off. Adira joins the others for the evening meal and reveals her conversation with Dhoron. Later, Dhoron requests a private conversation with Adira and agrees to give her a chance to prove herself by going on a bison hunt. He warns her not to risk the lives of the tribe for her personal interests. Adira accepts the challenge and prepares for the hunt.

Chapter 18

Adira prepares for a bison hunt with the tribe. She sharpens her spear and assures her worried friend Frey that she will be careful. As they reach the Eastern Meadows, Adira is surprised to learn that she will be leading the attack on a weak bison. With hesitation, she takes the lead and calls for the formation of the wolf. However, she soon realizes that Dhoron had misled her, as the bison they targeted was actually the lookout for the herd, and they find themselves in the midst of a stampede. Adira struggles to keep up with the tribe and feels isolated at the edge of the formation.

She decides to trust her instincts and weaves through the herd to get downwind, narrowly avoiding the charging bison. Seeking refuge on a rock formation, she spots Keechi, the eagle, and follows him back to the tribe. Adira regains her composure and leads the hunters to trap and kill the injured bison. Despite Dhoron's criticism, Adira stands her ground and receives praise from the other hunters. They divide the bison's meat and head back to camp, with Adira feeling a sense of accomplishment and newfound confidence.

Chapter 19

Adira experiences acceptance from the tribe after a successful hunt, realizing she's becoming one of them. She refrains from describing the hunt's details to spare Frey's anxiety. During a feast, Salzo reveals that Dhoron is unhappy due to Adira's success. Despite her popularity, Adira believes it's about the meat, not acceptance. Eremiza officially welcomes Adira and Frey into the tribe.

Adira shocks them by mentioning the Ursa threat and plans to gather information, but Frey refuses to join. Adira's determination to rescue her father conflicts with the tribe's safety. Eremiza warns her against the plan, but Adira chooses her father. After clashing with Dhoron and arguing with Frey, Adira decides to leave for her father, feeling she doesn't belong in the tribe, leading to a bitter end between her and Frey.

Chapter 20

Adira readies for the journey to the Ursa settlement in the north, training alongside Dhoron and the hunters. They bond over their shared goal, despite past differences. The tribe gathers for their departure, though Adira notices Frey's absence, leaving her hurt. Adira speaks with Eremiza, who discloses his Ursa past, cautioning her against the rescue mission, which she rejects. Frey surprises Adira by joining the expedition, expressing loyalty.

They reunite with Dhoron and Drad, and with Adira leading, the newly named clan of the Falls sets out, bid farewell by the tribe, on their perilous path towards the Ursa settlement in the north.

Chapter 21

Adira and her companions cautiously advance through the Shadowy Forest, but are suddenly confronted by the voice of the Ursa. They hide as the Ursa hunters approach, attempting to evade them. Adira's plan falters when Drad makes noise, leading to a chase. The group flees through the forest, fearing failure, until Salzo devises a trap to ensnare the Ursa in a pit. Although conflicted about resorting to violence, the plan succeeds.

After a rest, Adira tends to her wound, reflecting on the necessity of violence for survival. Frey expresses concern, urging Adira to prioritize non-lethal options. They discuss plans, with Dhoron emphasizing Adira's pivotal role. Adira takes her watch, bearing the weight of responsibility for her friends and tribe as they prepare for the perilous journey to the Ursa camp.

Chapter 22

The group cautiously advances through the Shadowy Forest, mindful of their presence. As they near the canyons, Adira senses Frey's apprehension, knowing they're about to confront dire wolves. When the wolves charge, Frey panics, but Dhoron's unique communication with the wolves prevents an attack. They navigate the wolf territory cautiously, shielding themselves from growling wolves, and continue on.

After setting up camp in a cave, Adira attempts to mend her strained relationship with Frey. Frey reveals her feelings of burden and fear of losing their friendship. Adira assures her support, though Frey remains distant, finding solace in Adira's presence. Amid their talk, Salzo shares his journey to belonging with the Falls tribe, teaching Adira the importance of understanding others' struggles. As the chapter concludes, the clan plans their navigation, and Adira feels hopeful about reconciling with Frey.

Chapter 23

The group is less cheerful as they approach the canyons, where they locate a vantage point overlooking the Ursa camp, opting for safety and cover. While climbing, Adira is reminded of their mission's gravity as Dhoron becomes stressed. From the peak, they appreciate the landscape before descending to witness the Ursa camp's grandeur. Adira grapples with seeing her father Torion among Ursa hunters but follows Eremiza's advice to stay away.

The group disputes how to proceed, with Adira wanting more information by following the hunters, but Dhoron accuses her of loyalty to the Ursa. Defying their decision, Adira descends alone to catch up with Torion, ultimately witnessing his hunting prowess. However, Igrath appears, taunting her and revealing his injuries while summoning Torion and the others.

Chapter 24

Igrath overpowers Adira and draws the attention of Torion and other Ursa hunters. Torion's cold denial of recognition shatters her hopes, while Igrath reveals Torion as her father and taunts him for betraying the Ursa. Lorak, Torion's brother, confirms this, and Adira briefly fights back against Lorak but fails. Lorak discloses Torion's past as a renowned Ursa hunter, including his involvement in the destruction of the Aquilla tribe and how Torion rescued Adira, a dark-haired girl, from the wreckage.

Adira struggles to accept the truth that Torion killed her family and took her as his own. She pleads with Torion, questioning the revelations, but Lorak insists on the truth, pushing her to confront her father's actions, ultimately leading to Adira's emotional breaking point.

Chapter 25

Adira's rage leads her to attack Lorak, but Torion intervenes, engaging in a fierce struggle. Amid the chaos, approaching mammoths provide a temporary diversion. Adira and Dhoron face attacks from Igrath and Bruntus, but they are rescued by Drad and Keechi. Unfortunately, Drad is killed in the fight.

Navigating through stampeding mammoths, Adira and Dhoron escape Torion's grasp and see him in a new, unsettling light. As they reach the mountains, the injured Ursa hunters emerge, and Lorak warns of impending Ursa pursuit. The chapter ends with the unsettling realization that the Ursa are on their trail.

Chapter 26

Adira grapples with emptiness and guilt as they make their way back to Tusky Falls. Dhoron's injuries lead to tension between them, as he blames Adira for Drad's death. Despite her silent withdrawal, the group takes precautions to avoid leaving a trail for the Ursa. Sheltering in a cave for the night, Adira and Salzo share a watch and grow closer through conversation, discussing her complicated past involving Torion, who is her father.

Although she avoids delving too deep, their bond strengthens. As they continue their journey, Frey expresses loyalty to Adira, reconciling their friendship. Acknowledging their challenges and uncertain future, they prepare to return to Tusky Falls.

Chapter 27

The clan returns to the Falls tribe, met with a mix of anticipation and somberness. The absence of Drad is deeply felt, particularly by his mate Ilya, and Adira's guilt weighs heavily, even considering exile as a means to spare Ilya's pain. Eremiza addresses the tribe, paying tribute to Drad's sacrifice and emphasizing the urgency of the impending Ursa attack. Adira struggles with guilt during the feast but is comforted by Salzo, who reminds her of Drad's sacrifice.

She finds Dhoron mourning alone and expresses gratitude for his role in her growth as a fighter. Determined to face the Ursa, Adira crushes a daisy symbolizing her past and embraces her dedication to the tribe. Joined by Salzo and Frey, they find strength in each other's company as Keechi soars into the sunset, symbolizing Adira's newfound sense of identity and belonging within the tribe.

Narrative - Game

SectionDescription
OverviewThis document is a loose translation of the book to the game using a collection of story beats from the novel that drive the story forward.
StatusDraft
Version2.0

Description

This narrative follows the journey of Adira, a young huntress, as she navigates through a world filled with challenges, allies, and enemies. The story is divided into chapters, each depicting a significant event or turning point in her quest. Players will experience Adira's growth, relationships, and confrontations, all set against a rich, immersive backdrop.

Chapters

Each game chapter will range from 5-15 minutes on average. The total game time will be roughly 3 to 5 hours of gameplay. A breakdown of each chapter can be found below by clicking the links provided.

#TitleDescriptionDuration
01A Hunt BeginsAdira hunting a deer, failing, and being confronted by Torion10m
02The Proud HunterAdira leaving to hunt a rabbit to prove her own worth15m
03Clash and FlightAdira coming back to find the antagonist Ursas, then being chased and falling down a cliff10m
04Cliffside EscapeAdira being chased by the Ursa Clan, fleeing and falling down a cliff into water15m
05A New FriendAdira meeting her best friend Freyana, learning and saving from clutches10m
06The GatheringAdira learning gatherer skills from Freyana + helping Freyana escape a boar15m
07Into the CanyonsAdira and Freyana ambushed by the Ursa tribe, ending up in the Canyons15m
08Allies in the CaveReaching the Dire Wolf cave + meeting Dhoron and Salzo15m
09Journey to the Fall’sAdira and Freyana travelling to the Fall’s village15m
10Tribe LifeAdira meeting the villagers5m to 60m (TBC)
10.1Training with DhoronAdira and Dhoron’s training15m
10.2A Moment with SalzoAdira and Salzo’s special moment5m
10.3Among the BisonAdira and the Bison herd15m
10.4Secrets of the PastTorion’s past revealed, tension with Freyana, prep for Ursa hideout15m
11Mountain TrekAdira and clan travelling through the mountains15m
12Lone RunnerAdira running away + confronting Torion10m
13Final ShowdownAdira’s gang reunites + Boss battles with Igrath and others15m
14The End CreditsEnding/Credits-

GDD - Narrative - Chapter 1

Chapter 1

  • Title: A Hunt Begins
  • Description: Adira hunting a deer, failing, and going back home with Torion
  • Duration: 10m

What happens?

We meet Adira, a young, tribeless hunter. She’s alone in the wild when she spots a deer — a rare sight in these parts, and a much better catch than the slim pickings her father’s traps usually produce. Against her father’s orders, she abandons the traps to stay with the deer. However, after some tailing it, she needs to run over a leaf carpet — the rustling is too loud, and scares off the deer. The deer leaps away from the scene, and Adira is unable to follow. A disgruntled Adira is found empty-handed by Torion, who is furious at her disobedience. “I was trying to catch a deer,” she says, but Torion ignores her: “There are no deer in these parts. You saw something else.” She tries to argue back, but he will have none of it: “You will come with me back to camp,” he barks. And there’s little she can do about it.

Nightime. Their camp is made of two tents and a bonfire. They live by themselves in the wilderness — tribeless and all alone, save for one another. They sit around the fire, eating something from Torion’s “slim pickings”, while he goes on and on about the importance of patience and timing, of observing patterns and learning your prey’s moves, of using the environment to your favor, of taking advantage of what nature provides, and of mastering every single skill Adira does not possess… which is why he will guide her. Adira is equal parts offended and grateful: although she could see the verbal abuse coming from miles away, she wasn’t quite expecting that last bit. He’s actually willing to teach her. “Let us rest,” he says. “At first light, we hunt.”

How does it drive the story forward?

  • Establishes Adira's character, her desires to join a tribe and her relationship with Torion. Sets the stage for the player's journey and introduces the core gameplay mechanics.

What are the key moments in order?

  • Scene 1 It's an early morning, and Adira appears for the first time to the Player.
  • Scene 2 Adira uses her spear (Equipped from the beginning) to break through a destructible obstacle so she can proceed.
  • Scene 3 Adira rolls over a few obstacles to proceed through the level.
  • Scene 4 Adira notices the Deer in the middle of the room, the Deer runs off.
  • Scene 5 As she tries to walk towards the direction of the Deer, the leaf carpet blocks her path, and she is forced to side track via a different path to continue the pursuit of the Deer.
  • Scene 6 As she makes her way through this different path, she notices a few tribespeople talking, and ponders/narrates being part of a tribe.
  • Scene 7 Adira chases Deer for 1 more room, and then eventually tries to attack the Deer, but fails and it gets away.
  • Scene 8 Torion comes and we hear rumbling, screen shake. Torion's introduction strikes fear into Adira, 'ADIRA!'. Voice is unknown, name is '???'.
  • Scene 9 Once they've spoken, Torion leads the way back to the Campsite, fades to black.
  • Scene 10 They are seated around the Campfire back at the Campsite where they discuss the hunt together in the morning before Adira sleeps.

What locations are required?

  • Moorlands

What music/audio is required?

  • Introductory music to Adira with her trying to hunt a deer and failing that layers over time.
  • The deer chase.
  • Music of Torion turning up angry.

GDD - Narrative - Chapter 2

  • Title: The Proud Hunter
  • Description: Adira leaves the village to hunt a rabbit on her own, determined to prove her worth after Torion’s disapproval.
  • Duration: 15m

What happens?

The next morning, Torion is ready and waiting for Adira, and she has much to learn. He points out she is yet too inexperienced to catch something as big as a deer. That was her mistake. They will start small. Torion helps her find the trails of a rabbit, and while they advance, he teaches her new moves (like the spear attack) and helps her navigate around the area. However, he helps as much as he condescends, and she learns as much as she questions. Adira is flustered, Torion is furious. He won’t be around forever. It’s about time she learned to fend for herself if she is to live on her own… and that’s when she snaps: the only reason she has to learn these things is because they’re on their own; if they lived in a tribe, with other people to help each other, this wouldn’t be necessary. Torion scoffs. So Adira thinks she is good enough without him? She thinks he’s on her way? If she truly believes that, then he would very much like to see what she is capable of.

Boss Battle: fight Torion

After winning, Adira says she’s better than he thinks, he should give her more credit, but Torion is fuming: so she’s beaten her father, a man who would not hurt nor harm her, and she thinks this proves anything? Adira truly is a child who knows nothing of the world, and she would do well to remember that. Torion goes back to camp, while Adira remains in the rabbit’s trail. She will catch it and prove — to herself, more than anyone else — that Torion is wrong, and she is not a child. In the end, she reaches an area deep in the Moorlands where she catches the rabbit. For all the grievances she has for her father, the truth is she can’t wait to show him her catch. He’ll be so proud of her this time. He has to be! Fade to black…

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira sneaks out early in the morning with her spear]
  • Scene 2 – [e.g., She tracks a rabbit and reflects on past hunts with Torion]
  • Scene 3 – [e.g., She succeeds in the kill, but hears distant howls…]

What characters are involved?

  • Adira

What locations are required?

  • Forest | Riverbank | Hunting Trail

What music/audio is required?

  • Ambient | Tension | Emotional | Mystery

GDD - Narrative - Chapter 3

  • Title: Clash and Flight
  • Description: Adira returns to the village only to find it under attack by Ursas; she is spotted and chased, ultimately tumbling down a cliff to escape.
  • Duration: 10m

What happens?

We cut back close to camp – a stone’s throw away. Adira is eager to show her catch, but something feels wrong — the air is strangely stale, birds do not chirp… as she moves closer, a shadowy figure moves away from her… “Who’s there?”, she asks, but to no answer. The music tenses up as she approaches camp, where their bonfire has been trampled over; their tents are torn, ravaged and broken. “Father? Torion?”. But again, no answer. Then, she sees a shadow moving and strange voices echoing. “They’re coming!”.

Adira hides behind their tents just in time to avoid two strange, large people wearing bear pelts. Igrath and Seega discuss her father (“He called for a girl when we took him”). When Adira’s about to leave, though, something cracks under her feet and she is seen by them. Seega calls for reinforcements, while Igrath attempts to catch her. “Torion’s girl!,” Igrath shouts. She fights him off just in time to escape the other approaching Ursa. “Get her!”, they shout.

She is chased by the Ursa clan in an action-packed sequence through the woods, ending in a daring escape jumping off a cliff. We fade to black to hear the sound of water…

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira approaches the village and sees smoke in the distance]
  • Scene 2 – [e.g., She witnesses Ursas ransacking the area and hides]
  • Scene 3 – [e.g., Spotted by a scout, she runs and eventually slips down a cliffside]

What characters are involved?

  • Adira | Ursas (Antagonists)

What locations are required?

  • Village Outskirts | Forest Ridge | Cliffside Path

What music/audio is required?

  • Tension | Chase | Combat | Emotional

GDD - Narrative - Chapter 4

  • Title: I Dream of You
  • Description: Injured and pursued, Adira flees deeper into unknown terrain, ultimately falling from the cliff into a river below to narrowly escape the Ursa Clan.
  • Duration: 15m

What happens?

We’re taken into a flashback scene: we’re back in the camp, their tents still standing and their bonfire shining bright. Adira stands alone, when Torion arrives and motions for her to follow him.

Adira follows him through the meadows. “Where are we going?,” she asks. “You will see,” he replies.

After a short walk, they arrive at a daisy patch, a place Adira had never known existed. “This is beautiful,” she says, amazed. Then, Torion plucks a flower and reaches out to her. “This daisy is like a little sun,” he says. “It will make you shine bright.”

As he places the flower in her hair…

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira limps through dense woods, hearing Ursa shouts behind her]
  • Scene 2 – [e.g., She finds herself at a dead end above a river canyon]
  • Scene 3 – [e.g., Cornered, she jumps — plunging into the water below]

What characters are involved?

  • Adira | Ursa Scouts

What locations are required?

  • Forest | Cliff Edge | River Below

What music/audio is required?

  • Tension | Chase | Emotional | Ambient

GDD - Narrative - Chapter 5

  • Title: A New Friend
  • Description: Washed ashore and disoriented, Adira is discovered by Freyana, a kind but cautious girl who saves her from danger and brings her to safety.
  • Duration: 10m

What happens?

Adira wakes up inside a tent, a girl stroking her hair — in the same motion as her dream-father. Adira is scared and confused, but the girl tries to tranquilize her, saying her flower was lost in the water, she was just trying to give her a new one. But Adira remains wary, and so the girl introduces herself as Freyana — or Freya. She’s tribeless, same as Adira, her home destroyed by a band of warriors clad in bear skins — a description Adira promptly recognises. They’ve both been hurt by the Ursa.

Then, Freya offers Adira a bowl of soup, which helps her recover some strength. Adira is thankful, especially when Freya says she’s going to make more. However, she is running out of ingredients… to which Adira replies she can help. She can pick the ingredients Freya needs while she stays here and tends to the food.

So Freya gives Adira a “quest” of things to forage (like “pick up 5 brown mushrooms”). Adira can now leave their refuge to find whatever ingredients Freya needs, exploring the area and picking up items. But during this outing, in one of the locations, Adira is caught off-guard and bit by a snake. Her father has told her about these creatures and the strength of their poison — she knows she’s going to die.

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira wakes on the riverbank, weak and injured]
  • Scene 2 – [e.g., Freyana appears and defends her from a wild creature]
  • Scene 3 – [e.g., They talk cautiously, and Freyana offers to take her somewhere safe]

What characters are involved?

  • Adira | Freyana

What locations are required?

  • Riverbank | Woodland Shelter

What music/audio is required?

  • Emotional | Ambient | Mystery | Somber

GDD - Narrative - Chapter 6

  • Title: The Gathering
  • Description: Freyana teaches Adira essential gatherer skills, and the two bond while foraging — until a wild boar attacks and they must work together to survive.
  • Duration: 15m

What happens?

Poisoned and desperate, Adira goes back to Freya, who immediately notices there’s something wrong with her. Adira reveals the darkest of truths: she’s been bitten, she’s doomed.

And yet, for such a terminal thing, Freya hardly seems moved. She asks Adira what kind of snake it was, and realizes that, as harmful as its poison is, it’s hardly deadly. With some medicine, Adira should be good as new. Adira is ashamed — and conflicted; her father was such a knowledgeable man, with so much wisdom to share — but at least she has the mushrooms they need. Except that she doesn’t. Freya also explains the mushrooms she took may seem like the ones they need, but are actually a venomous kind — and unlike the snake, this one is lethal.

For the first time, Adira actually opens up to Freya: she wanted to be useful, but maybe her father was right. Maybe she is a child after all. A child who knows nothing of the world.

Still, they do need their ingredients, and since Adira also needs to understand foraging, perhaps Freya could take her this time and kill two birds with one stone. She can teach Adira.

This time, Freya takes Adira into the woods, where they pick up things together, while they have the chance to interact and Adira talks about feeling useless, about barely being able to survive on her own. Her father’s been gone for barely a moon and she’s already cheated death at least a few times — how many more until she runs out of second chances? Freya however is not quite so grim. She manages to see the positive side of things, and she feels happier opening up about her past. Her tribe and her family may be gone — claimed by the Ursa’s relentless conquering — but at least she’s here, she has a new friend, and they can help each other out.

Adira is still not convinced, when they’re attacked by a boar. For all of Freya’s resourcefulness, she’s no match for such a savage beast, and it falls to Adira to defend her. The boar is a terrible foe, but Adira manages to win. Finally, a win for Adira. She is strong after all. Perhaps stronger than she herself knows. And for the first time, she doesn’t feel like such a weight. They can go back with their findings and her pride.

And this would make for a great night, if the Ursa weren’t waiting for them back at the refuge.

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Freyana shows Adira how to identify edible plants and avoid poisonous ones]
  • Scene 2 – [e.g., They begin to trust one another, sharing parts of their past]
  • Scene 3 – [e.g., A boar charges them; they survive by outsmarting it together]

What characters are involved?

  • Adira | Freyana

What locations are required?

  • Forest Glade | Foraging Trail | Boar Den

What music/audio is required?

  • Ambient | Emotional | Tension | Combat

GDD - Narrative - Chapter 7

This Chapter has not been started
  • Title: Into the Canyons
  • Description: While traveling together, Adira and Freyana are ambushed by Ursa scouts; in the chaos, they are forced to flee into the treacherous canyon lands.
  • Duration: 15m

What happens?

[A prose-style breakdown of the story beats in this chapter. Focus on character choices, dialogue, revelations, and any impactful changes to relationships, world state, or lore.]

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira and Freyana travel through a sunlit clearing, unaware they are being watched]
  • Scene 2 – [e.g., Ursa scouts strike suddenly; a frantic escape begins]
  • Scene 3 – [e.g., The girls leap into a narrow canyon to lose their pursuers, unsure where the path leads]

What characters are involved?

  • Adira | Freyana | Ursa Scouts

What locations are required?

  • Woodland Pass | Canyon Entrance | Cliff Path

What music/audio is required?

  • Tension | Chase | Ambient | Mystery

GDD - Narrative - Chapter 8

This Chapter has not been started
  • Title: Allies in the Cave
  • Description: Adira and Freyana take refuge in a cave, only to discover it’s inhabited by two strangers — Dhoron and Salzo — who offer unexpected help.
  • Duration: 15m

What happens?

[A prose-style breakdown of the story beats in this chapter. Focus on character choices, dialogue, revelations, and any impactful changes to relationships, world state, or lore.]

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., Adira and Freyana, exhausted, enter the cave to hide]
  • Scene 2 – [e.g., They are startled by Dhoron and Salzo — who were tracking Ursa movements]
  • Scene 3 – [e.g., After a tense exchange, they decide to travel together]

What characters are involved?

  • Adira | Freyana | Dhoron | Salzo

What locations are required?

  • Canyon Cave | Inner Chamber

What music/audio is required?

  • Ambient | Mystery | Tension | Emotional

GDD - Narrative - Chapter 9

This Chapter has not been started
  • Title: Journey to the Fall’s
  • Description: With new allies in tow, Adira and Freyana journey toward the Fall’s village — a hidden settlement that may offer safety, guidance, and deeper truths.
  • Duration: 15m

What happens?

[A prose-style breakdown of the story beats in this chapter. Focus on character choices, dialogue, revelations, and any impactful changes to relationships, world state, or lore.]

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., The group sets off across varied terrain, learning more about each other]
  • Scene 2 – [e.g., Dhoron shares vague hints about the Fall’s people and their role in resisting the Ursas]
  • Scene 3 – [e.g., As they approach the village border, Adira begins to sense the magnitude of what lies ahead]

What characters are involved?

  • Adira | Freyana | Dhoron | Salzo

What locations are required?

  • Canyon Exit | Valley Path | Fall’s Village Border

What music/audio is required?

  • Ambient | Emotional | Mystery | Hopeful

GDD - Narrative - Chapter 10

This Chapter has not been started
  • Title: Tribe Life
  • Description: Adira and her companions arrive at the Fall’s village, where she encounters new faces, customs, and a way of life very different from her own.
  • Duration: 5m to 60m (TBC)

What happens?

[A prose-style breakdown of the story beats in this chapter. Focus on character choices, dialogue, revelations, and any impactful changes to relationships, world state, or lore.]

How does it drive the story forward?

  • Progresses the main narrative by...
  • Reveals key lore or backstory through...
  • Evolves character dynamics, especially between...

What are the key moments in order?

  • Scene 1 – [e.g., The group is welcomed cautiously by the Fall’s tribe]
  • Scene 2 – [e.g., Adira observes their peaceful way of life and feels out of place]
  • Scene 3 – [e.g., She begins to form new connections — and tensions stir under the surface]

What characters are involved?

  • Adira | Freyana | Dhoron | Salzo | Village Elder | New NPCs

What locations are required?

  • Fall’s Village | Communal Grounds | Elder’s Tent | Surrounding Fields

What music/audio is required?

  • Ambient | Emotional | Mystery | Hopeful | Somber

Chapter 11

This Chapter has not been started

Chapter 12

This Chapter has not been started

Chapter 13

This Chapter has not been started

Chapter 14

This Chapter has not been started

Branding

Work in progress

Branding

Work in progress

Moodboard

Work in progress

UX Design

The game UX designer’s job is to take the existing rules and mechanics of the game and make sense of them for the end-user. This means helping players get a handle on what they are actually supposed to be doing in the game.

  • Researching player needs, preferences, and behaviors to inform design decisions
  • Creating wireframes, prototypes, and other design documents to communicate and iterate on design ideas
  • Collaborating with game developers, artists, and other team members to ensure that game mechanics, user interfaces, and other design elements are consistent and cohesive
  • Designing user interfaces and menus that are intuitive, easy to use, and visually appealing
  • Creating game tutorials and onboarding experiences that effectively introduce players to game mechanics and controls
  • Testing and evaluating designs with players to identify areas for improvement and make iterative changes
  • Considering accessibility and inclusivity in design decisions to ensure that games are playable by as many people as possible

Consistent UX in a video game is crucial for several reasons:

  • Improved Player Experience: Consistency in design ensures players can intuitively understand the game’s interface and mechanics without constant learning or confusion. This helps create a smooth, immersive experience that keeps players engaged.

  • Reduced Cognitive Load: When UI elements and interactions behave consistently, players can focus on the game itself rather than struggling with inconsistent controls or navigation. It prevents frustration by allowing players to predict how the game will respond to their actions.

  • Enhanced Accessibility: Consistent design helps accommodate a wide range of players, including those who may have accessibility needs. Clear, repeatable design patterns make it easier for players to navigate and interact with the game in familiar ways.

  • Brand Identity & Aesthetic Cohesion: A consistent UX reinforces the game’s theme and visual identity, giving the entire experience a cohesive feel. This adds to the game’s professionalism and can enhance its emotional impact on players.

  • Smoother Learning Curve: Players can quickly learn and master the game mechanics if interface and interaction patterns remain the same throughout. This allows for more complex gameplay without overwhelming the user.

UX Principles

These are the UX principles we'd like to apply to Tribe of the Accord in the context of the 'User' AKA Player of the game.

Controls and Feedback

  • Intuitive and simple controls.
  • Clear feedback on player actions (visual and audio).
  • Contextual action prompts (only when needed).
  • Smooth, non-sluggish and responsive player movement/attacks.
  • Vibration or haptic feedback to reinforce player actions (for controllers).
  • Use audio cues to differentiate between enemy types or attack patterns.
  • Provide visual or haptic feedback when low on health.

User Interface and HUD

  • Minimal and non-intrusive HUD.
  • Visual hierarchy to focus on key elements (e.g., enemies, objectives).
  • Avoid overcrowding the screen.
  • Provide clear and consistent visual distinction between interactive and non-interactive elements.
  • Ensure important information is always visible (e.g., health bars, focused weapon, items).
  • Use consistent iconography and symbols for items and actions.
  • Offer a quick-access inventory or action wheel for frequently used items.
  • Provide clear labels for game settings, with explanations of each option.
  • Ensure responsive menus with fast navigation.
  • Create scalable UI elements for different screen sizes or resolutions.
  • Create consistent UI shaped around a defined branding and theme.

Camera and Navigation

  • Camera follows player smoothly without disorienting movements.
  • Offer an in-game map with markers for important locations.
  • Implement dynamic lighting to guide players subtly without over-explaining.
  • Provide visual or audio cues for off-screen threats or important events.

Progression and Difficulty

  • Clear mission objectives and progress tracking (e.g., maps, quest logs).
  • Enable auto-saving to reduce frustration from lost progress.
  • Reward exploration with secrets, items, or lore.
  • Balanced difficulty progression (avoid spikes).
  • Gradual introduction of new mechanics and abilities.
  • Maintain a consistent difficulty curve, ensuring steady challenge without sudden spikes.
  • Provide clear goals and sub-goals to prevent confusion during quests.
  • Include a "New Game+" or replayability feature to enhance long-term engagement.
  • Provide clear distinctions between quest types (main vs. side quests).
  • Implement vibration or haptic feedback to reinforce player actions (for controllers).

Accessibility

  • Allow key rebinding and control customization.
  • Include accessibility options like colorblind mode and audio adjustments.
  • Independent volume controls for sound effects, music, and voice.
  • Include an option to pause or slow down the game for accessibility or more casual play.
  • Fonts should be legible with multi-lingual support for those who speak languages other than English - Example font

Audio and Visual Cues

  • Audio cues for important in-game events.
  • Provide visual indicators for invincibility frames or damage immunity during specific actions.
  • Use clear visual or audio alerts when a critical event occurs (e.g., boss battles).

Onboarding and Tutorials

  • Gradual introduction of new mechanics and abilities.
  • Avoid 'sign-post' tutorials and instead rely on environmental cues for teaching.
  • Provide optional hints or tips for challenging puzzles or tasks if the User stalls.

Game Flow and Immersion

  • Forgiving design with checkpoints and recovery options.
  • Clear fail states and quick recovery options.
  • Allow players to skip cutscenes or dialogues if they choose.
  • Implement clear loading indicators to manage player expectations.
  • Use consistent pacing to prevent too much downtime or overwhelming action.
  • Ensure fast and efficient loading times to maintain immersion.
  • Support multiple save slots to give players flexibility.

Story and Engagement

  • We need to strike a good balance ratio between storytelling (non-engagement) and action (engagement), with action being the focus.
  • Allow players to review story cutscenes, dialogue, or important info in a log or journal.
  • Provide a "New Game+" or replayability feature to enhance long-term engagement.

Performance and Optimization

  • Ensure consistent framerate and performance across platforms.
  • The User should not feel that the game is stuck/frozen at any point.

UX - Viewport

The viewport of the game is 16:9, which means the game can scale up to different screen sizes at that same ratio.

  • 1280x720
  • 1920x1080
  • 3840x2160

Viewport 640x360

All artwork is designed with a total of 640 pixels wide and 360 pixels height. All game assets are designed in a 640x360 view but then upscaled by 2.

Viewport 1280x720

Tilesets are designed using 32x32 tiles. Meaning you can place a total of 20 tiles wide and 11.25 (rounded up to 12) tall. These are scaled up to be 64x64 sized tiles on a viewport 1280x720.

Viewport 1280x720

All pixel art work should be defined in these proportions to avoid 'mixels'.

The term "mixels" refers to the mixing of different pixel sizes or resolutions in pixel art, which can result in an inconsistent and jarring visual appearance. Pixel art typically relies on a uniform pixel size to maintain a cohesive and clean look. When mixels occur, certain elements of the design may appear larger, sharper, or blurrier than others, disrupting the overall aesthetic.

UI

Work in progress

Tribe of the Accord - Material Theme Colors

Color Shades

ShadePrimary - #B85D49Secondary - #906F68Tertiary - # 877548Neutral - #7E7573Neutral-Variant - #857370
0#000000#000000#000000#000000#000000
5#2A0200#1F0B07#171000#15100F#190E0C
10#3E0500#2B1611#241A00#201A19#241916
15#4E0D03#37201B#302401#2B2423#2F2320
20#5D180B#432A25#3C2F08#362F2D#3A2D2B
25#6B2315#4F352F#483A12#413A38#463835
30#7A2E1F#5C403A#54451C#4D4543#524340
35#8A3929#694B45#605127#59514F#5E4F4C
40#994533#765751#6D5D31#655C5B#6B5B57
50#B85D49#906F68#877548#7E7573#857370
60#D77561#AC8981#A28F5F#998E8C#9F8D89
70#F78F79#C8A39B#BEA977#B4A9A7#BBA7A3
80#FFB4A4#E5BEB5#DAC490#D0C4C2#D7C2BE
90#FFDAD3#FFDAD3#F8E0AA#ECE0DD#F4DED9
95#FFEDE9#FFEDE9#FFEFCF#FBEEEB#FFEDE9
98#FFF8F6#FFF8F6#FFF8F1#FFF8F6#FFF8F6
99#FFFBFF#FFFBFF#FFFBFF#FFFBFF#FFFBFF
100#FFFFFF#FFFFFF#FFFFFF#FFFFFF#FFFFFF

Light and Dark Theme Variants

Color NameLight Theme Hex CodeLight Theme Color PreviewDark Theme Hex CodeDark Theme Color Preview
Primary#873727#873727#FFB4A4#FFB4A4
Surface Tint#994533#994533#FFB4A4#FFB4A4
On Primary#FFFFFF#FFFFFF#5D180B#5D180B
Primary Container#B55A47#B55A47#B55A47#B55A47
On Primary Container#FFFFFF#FFFFFF#FFFFFF#FFFFFF
Secondary#805349#805349#F3B9AD#F3B9AD
On Secondary#FFFFFF#FFFFFF#4B261F#4B261F
Secondary Container#FFCCC1#FFCCC1#5A332B#5A332B
On Secondary Container#5F372E#5F372E#FFC4B7#FFC4B7
Tertiary#6B5F00#6B5F00#E8D563#E8D563
On Tertiary#FFFFFF#FFFFFF#383100#383100
Tertiary Container#BDAC3E#BDAC3E#BDAC3E#BDAC3E
On Tertiary Container#262000#262000#262000#262000
Error#BA1A1A#BA1A1A#FFB4AB#FFB4AB
On Error#FFFFFF#FFFFFF#690005#690005
Error Container#FFDAD6#FFDAD6#93000A#93000A
On Error Container#410002#410002#FFDAD6#FFDAD6
Background#FFF8F6#FFF8F6#1A1110#1A1110
On Background#221A18#221A18#F0DFDB#F0DFDB
Surface#FFF8F6#FFF8F6#1A1110#1A1110
On Surface#221A18#221A18#F0DFDB#F0DFDB
Surface Variant#F8DCD7#F8DCD7#55423F#55423F
On Surface Variant#55423F#55423F#DBC1BB#DBC1BB
Outline#88726E#88726E#A38C87#A38C87
Outline Variant#DBC1BB#DBC1BB#55423F#55423F
Shadow#000000#000000#000000#000000
Scrim#000000#000000#000000#000000
Inverse Surface#382E2C#382E2C#F0DFDB#F0DFDB
Inverse On Surface#FFEDE9#FFEDE9#382E2C#382E2C
Inverse Primary#FFB4A4#FFB4A4#994533#994533

Example

Light Palette Dark Palette

New Colour mappings

Hex Code A is the SimpleBox Theme remapped to the new Tribe of the Accord Colour palette (Hex Code B).

Hex Code AHex Code BGodot Reference AGodot Reference B
3229462b2423Color( 0.196078, 0.160784, 0.278431, 1 )Color( 0.168627, 0.141176, 0.137255, 1 )
463B7733413A38Color( 0.278431, 0.231373, 0.470588, 0.2 )Color( 0.254902, 0.227451, 0.219608, 1 )
4DA5FF33d57562Color( 0.301961, 0.65098, 1, 0.2 )Color( 0.839216, 0.458824, 0.384314, 1 )
495BAFFF5c403aColor( 0.29, 0.36, 0.69, 1 )Color( 0.360784, 0.25098, 0.227451, 1 )
4DA5FFFFb85d49Color( 0.301961, 0.65098, 1, 1 )Color( 0.721569, 0.364706, 0.286275, 1 )
463B77FF413a38Color( 0.278431, 0.231373, 0.470588, 1 )Color( 0.254902, 0.227451, 0.219608, 1 )
FFF9D1FFdac490Color( 1, 0.976471, 0.823529, 1 )Color( 0.854902, 0.768627, 0.564706, 1 )
FFF9D133ffefcfColor( 1, 0.976471, 0.823529, 0.2 )Color( 1, 0.937255, 0.811765, 1 )

This table now includes the correct mapping of the hex codes in the fourth column in the Color format so you can update it.

Style Kit

Work in progress

Getting Started

Work in progress

Game Design Principles

Work in progress

Game Design Principles

Work in progress

Getting Started

Work in progress

GDD - Genre

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the genre of the game Tribe of the Accord.
StatusDraft
Version1.0

Description

'Tribe of the Accord' is categorized as an 'Action Adventure' video game set in a Stone Age environment. The story centers on Adira, a young girl raised by Torion. The game follows a linear narrative that highlights Adira's growth into an independent survivalist. Players undertake quests, engage in dialogues, and witness the evolving relationship between Adira and her father, Torion, as they follow the narrative depicted in the novel adaptation.

Here are the main features that align it with the action-adventure classification:

  1. Exploration and Navigation:

    • The game involves exploring a vast, interconnected world filled with various themed locations. Players must navigate through different regions, discovering secrets, hidden areas, and new paths.
  2. Combat and Action Mechanics:

    • It includes real-time combat with a variety of wild enemy creatures and clan members. Players use melee weapons, ranged attacks, and special abilities to defeat foes. The combat is fast-paced and skill-based, requiring quick reflexes and strategic thinking.
  3. Puzzle-Solving:

    • The game incorporates puzzles that players must solve to progress. These puzzles often involve environmental interactions, finding keys, or manipulating objects to unlock new areas.
  4. Character Progression:

    • Players can upgrade their character, enhancing abilities and acquiring new skills and weapons. This progression is often tied to exploration and combat, rewarding players for their efforts.
  5. Story and Lore:

    • Tribe of the Accord features a narrative that unfolds as players explore the world. The story is conveyed through visuals, environmental storytelling, and interactions with NPCs, creating a rich and immersive experience.
  6. Atmospheric and Aesthetic Design:

    • The game’s visual and audio design contributes to its immersive experience. The atmospheric soundtrack and distinctive pixel art style create a unique world for players to engage with.
  7. Non-linear Gameplay:

    • Players can often choose the order in which they tackle various regions or objectives, adding a level of freedom and personalization to the gameplay experience.

These elements combine to create a gameplay experience that blends action, exploration, puzzle-solving, and storytelling, which are hallmarks of the action-adventure genre.

GDD - Genre

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the genre of the game Tribe of the Accord.
StatusDraft
Version1.0

Description

'Tribe of the Accord' is categorized as an 'Action Adventure' video game set in a Stone Age environment. The story centers on Adira, a young girl raised by Torion. The game follows a linear narrative that highlights Adira's growth into an independent survivalist. Players undertake quests, engage in dialogues, and witness the evolving relationship between Adira and her father, Torion, as they follow the narrative depicted in the novel adaptation.

Here are the main features that align it with the action-adventure classification:

  1. Exploration and Navigation:

    • The game involves exploring a vast, interconnected world filled with various themed locations. Players must navigate through different regions, discovering secrets, hidden areas, and new paths.
  2. Combat and Action Mechanics:

    • It includes real-time combat with a variety of wild enemy creatures and clan members. Players use melee weapons, ranged attacks, and special abilities to defeat foes. The combat is fast-paced and skill-based, requiring quick reflexes and strategic thinking.
  3. Puzzle-Solving:

    • The game incorporates puzzles that players must solve to progress. These puzzles often involve environmental interactions, finding keys, or manipulating objects to unlock new areas.
  4. Character Progression:

    • Players can upgrade their character, enhancing abilities and acquiring new skills and weapons. This progression is often tied to exploration and combat, rewarding players for their efforts.
  5. Story and Lore:

    • Tribe of the Accord features a narrative that unfolds as players explore the world. The story is conveyed through visuals, environmental storytelling, and interactions with NPCs, creating a rich and immersive experience.
  6. Atmospheric and Aesthetic Design:

    • The game’s visual and audio design contributes to its immersive experience. The atmospheric soundtrack and distinctive pixel art style create a unique world for players to engage with.
  7. Non-linear Gameplay:

    • Players can often choose the order in which they tackle various regions or objectives, adding a level of freedom and personalization to the gameplay experience.

These elements combine to create a gameplay experience that blends action, exploration, puzzle-solving, and storytelling, which are hallmarks of the action-adventure genre.

GDD - Progression & Rewards

Abilities

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the Progression and Rewards that players will acquire in the game Tribe of the Accord.
StatusWork In Progress
Version2.0

Abilities

These are all of the abilities that Adira will acquire during the playthrough. Abilities are defined as gameplay mechanics that change the moment to moment gameplay and allow players to have more options when interacting with the game.

1. Spear

Spear is one of the primary weapons that Adira has.

1.1. Spear Throw

SectionDescription
DescriptionThe Spear Throw ability allows the player to hurl their spear over a distance to hit enemies, interact with environmental objects, or trigger distant switches.
Gameplay RolePrimarily a combat tool, this ability also serves as a method of interacting with objects from a distance. It is ideal for targeting enemies before they close in on the player, and for solving puzzles that require hitting objects or switches in hard-to-reach places.
Unlock ConditionsTBA till narrative is finalized. We want this to be introduced at the start or 10% into the game.
-------------------------------
Control/InputsUse analog stick to activate aiming mode, choose direction to shoot using analog stick, RT to shoot.
ModifiersTBA
-------------------------------
Art & AnimationThis section describes the art and animation that would be needed for the ability.
InitiationRight after the analog stick is moved, Adira will pull her spear back and get in the throwing position.
ActivationUpon activation, the player character plants the spear into the ground or designated point.
ExecutionUpon release, the character throws the spear in a fluid motion while moving a little forward so it feels like she is using her body's momentum. The spear flies in a straight line with a trail of energy behind it.
CooldownAfter the throw, the character briefly returns to an idle stance.
-------------------------------
Technical SpecsThese are the technical foundations for the ability.
Range400, Subject to playtesting
Damage50, subject to playtesting
Cooldown TimeAfter throw, until Adira returns to idle animation which would be around 0.5 seconds. After that, she can't throw the spear until she goes and collects it from the enemy.
Energy Cost20 points, subject to playtesting
Hitbox DetailsThe tip of the spear is the only hitbox, but the rest of the spear does not have a hitbox.
-------------------------------
Audio SpecsWe will need some juicy sound effects to land the punchyness of the spear throw because it is one of the core abilities.
ActivationA slight whoosh while pulling the spear back.
ExecutionA fast swoosh as the spear flies through the air. 2 slightly different SFX for each to have some variety.
ImpactThis will need multiple effects - a thud for when the spear hits the ground or an enemy that has frontal defence. A meat cleaving sound for if it hits flesh of an enemy. 2 slightly different SFX for each to have some variety.
-------------------------------
VFXWhat is said about the audio can also be said about the VFX - we need it JUICY.
ActivationNO VFX needed.
ExecutionSpeed lines around the spear.
ImpactSmall dust cloud or sparks and a small pinch on the impact location if the spear has the potential to stick in, depending on the surface. Add variation for smokes to have variety
-------------------------------
Special CaseIf, during the Activation phase of the animation, players are hit by enemies/traps, they will be stopped.
Fail CasesIf the player throws the spear into the pit, it is an immediate fail state and the spear will return to the nearest surface where the player has to collect it from. Subject to change based on playtesting.
SynergiesTBA
-------------------------------
Ability ProgressionAbilities could have gameplay related upgrades, they will be listed here.
Upgrade 1An ability that stuns every enemy if Adira charges it enough.
Upgrade 2TBA.
Upgrade 3TBA.

1.2. Pole Vault

SectionDescription
DescriptionThe Pole Vault ability allows the player to leap over gaps, obstacles, or enemies by using their spear as a vaulting pole. It serves both as a traversal tool and an evasive maneuver in combat.
Gameplay RolePrimarily used for traversal, enabling the player to cross wide gaps or evade enemy attacks. It can also be used to quickly reposition in combat scenarios.
Unlock ConditionsTBA till narrative is finalized. We want this to be introduced 20-30% into the game.
-------------------------------
Control/InputsPress B or RT (subject to change based on further design decisions). Need to be running/moving to activate. Input doesn't work if not moving.
ModifiersTBA
-------------------------------
Art & AnimationThis section describes the art and animation that would be needed for the ability.
Initiation(once moving) Adira will stab the spear in front of her and jump towards it while launching herself into the air.
ActivationUpon activation, the player character plants the spear into the ground or designated point.
ExecutionThe player character vaults over the gap or obstacle, with a smooth, high-reaching leap animation. The player flips mid-air for added style. Maybe we could have 2-3 flip variations for variety.
CooldownAfter landing, the player regains their stance, transitioning smoothly back to their walking or combat-ready position.
-------------------------------
Technical SpecsThese are the technical foundations for the ability.
Range100, but Subject to playtesting
DamageNA
Cooldown Time0.5 seconds, subject to playtesting. Adira can instantly roll the moment she lands. We won't tutorialize it, but it will be a mechanic for those who want to discover it
Energy Cost20 points, subject to playtesting
Hitbox DetailsThere will be i-frames/avoid frames on the pole-vault for small-large enemies. The pole vault will be blocked by aerial enemies or XL sized enemies. In case of enemy attack, Initiation and Cooldown are the only times Adira can be hit.
DamageNA
-------------------------------
Audio SpecsWe will need some juicy sound effects to land the punchyness of the pole vault because it is going to be one of our biggest HOOKS.
ActivationA crunchy thud as the spear is planted into the ground or object.
ExecutionA soft whoosh sound as the player leaps into the air.
ImpactA light landing thud as the player touches down on the other side.
-------------------------------
VFXWhat is said about the audio can also be said about the VFX - we need it JUICY.
ActivationA dust cloud kicks up when the spear is planted, and a brief wind trail follows the player as they vault.
ExecutionSpeed lines/mist around Adira's body when she is twisting.
ImpactSmall dust clouds or sparks appear upon landing, depending on the surface.
-------------------------------
Special CaseIf, during the Activation/Execution phase of the animation, players collide with walls, aerial enemies or XL sized enemies, they will be stopped. One addition can be that they get stunned in such cases and open to attack. This is to limit people from blindly spamming the ability outside of stamina needs.
Fail CasesIf the player pole vaults into a pit, it is an immediate fail state. Subject to change based on playtesting.
SynergiesTBA
-------------------------------
Ability ProgressionAbilities could have gameplay related upgrades, they will be listed here.
Upgrade 1TBA.
Upgrade 2TBA.
Upgrade 3TBA.

1.3. Spear Hookshot

SectionDescription
DescriptionThe Spear Hookshot allows the player to throw their spear with an attached rope, which can latch onto objects or enemies. Depending on the size and weight of the target, the player can either pull the object towards them or get pulled towards the object, enabling traversal or getting into advantageous positions against enemies.
Gameplay RoleThis ability serves both as a traversal/puzzle solving tool and combat instrument. It enables players to pull distant objects/enemies towards them or vice versa depending on the size of the target. It can also be used in combat to pull enemies toward the player or vice versa.
Unlock ConditionsTBA till narrative is finalized. But we want this ability to be unlocked 40-50% into the game
-------------------------------
Control/InputsOnce the spear is thrown, press B or RT after spear lands. Subject to change based on playtesting. If the input is do the spear hits a valid object, it latches on and initiates either a pull or a drag, depending on the object’s size.
ModifiersTBA
-------------------------------
Art & AnimationThis section describes the art and animation that would be needed for the ability.
Initiation(once SPEAR THROW is done and input has been registered) Adira will give a hard tug on the rope.
ActivationAfter initiation, Adira will pull herself towards target or get pulled. If she gets pulled, she does a twist/flip like movement. (reference Sekiro's grapple mechanic)
ExecutionUpon target reaching Adira/Adira reaching target, depending on the object/enemy size, the moving object would come to a stop in a decelerating motion right in front of the target object.
CooldownAfter decelerating, the character/object returns to an idle stance.
-------------------------------
Technical SpecsThese are the technical foundations for the ability.
Range400, Subject to playtesting
DamageNA, subject to playtesting
Cooldown TimeAfter hookshot, until Adira returns to idle animation which would be around 0.5 seconds. After that, she can't throw the spear until she goes and collects it from the enemy.
Energy Cost20 points, subject to playtesting
Hitbox DetailsThe tip of the spear is the only hitbox. The rest of the spear shall not be considered a hitbox.
-------------------------------
Audio SpecsThese are the sound effects we would need for the ability.
ActivationA slight whoosh while pulling the spear back.
ExecutionA fast swoosh as the spear flies through the air. 2 slightly different SFX for each to have some variety.
ImpactThis will need multiple effects - a thud for when the spear hits the ground or an enemy that has frontal defence. A meat cleaving sound for if it hits flesh of an enemy. 2 slightly different SFX for each to have some variety.
-------------------------------
VFXThese are the visual effects we would need for the ability.
ActivationNO VFX needed.
ExecutionSpeed lines on moving object.
ImpactNA
-------------------------------
Special CaseIf, during the Activation phase of the animation, players are hit by enemies/traps, they will be stopped.
Fail CasesIf the player throws the spear into the pit, it is an immediate fail state and the spear will return to the nearest surface where the player has to collect it from. Subject to change based on playtesting.
SynergiesTBA
-------------------------------
Ability ProgressionAbilities could have gameplay related upgrades, they will be listed here.
Upgrade 1The hookshot pull damages enemies.
Upgrade 2Chain hookshot.
Upgrade 3The hookshot lands you behind enemies.

1.4. Charged Spear Attack

SectionDescription
DescriptionThe Charged Spear Attack allows the player to charge their spear by holding the attack button, gathering energy for a powerful forward thrust. The attack can pierce through multiple enemies or objects, dealing increased damage.
Gameplay RoleThe Charged Spear Attack is a combat ability that rewards players for timing and precision. It is useful in combat, offering players a versatile tool for dealing with crowds, breaking barriers, or defeating stronger enemies.
Unlock ConditionsTBA till narrative is finalized. But we want this ability to be unlocked 10-20% into the game
-------------------------------
Control/InputsHold (X) or (Square) to charge attack. Charge up time is 2 seconds
ModifiersTBA
-------------------------------
Art & AnimationThis section describes the art and animation that would be needed for the ability.
Initiation(once SPEAR THROW is done and input has been registered) Adira will give a hard tug on the rope.
ActivationThe player pulls the spear back, and the spearhead begins to glow faintly. As the charge increases, the glow intensifies, and particles of energy surround the spear tip. The player’s stance becomes more focused and tense.
ExecutionUpon release, the player thrusts the spear forward in a quick, powerful motion. The spear leaves a trail of glowing energy behind it as it moves forward. Enemies hit by the attack show a brief impact flash.
CooldownAfter finishing the move, Adira returns to an idle stance.
-------------------------------
Technical SpecsThese are the technical foundations for the ability.
Range200, Subject to playtesting
Damage50, subject to playtesting
Cooldown TimeNo such cooldown time.
Energy Cost30, subject to playtesting
Hitbox DetailsAs per the animation of the charged speed
-------------------------------
Audio SpecsThese are the sound effects we would need for the ability.
ActivationA faint humming noise that increases in intensity as the charge builds up.
ExecutionA sharp, stabbing sound as the spear thrusts forward, followed by a satisfying impact noise if it hits enemies or objects. A smooth slicing sound when the spear passes through multiple enemies or objects.
ImpactA skidding sound as it comes to a halt
-------------------------------
VFXThese are the visual effects we would need for the ability.
ActivationA circular smoke forms around Adira starts forming around Adira.
ExecutionThe smoke circulates and converges towards the center and a small dust cloud appears before she launches off. The launching has some speed lines as well.
ImpactEvery time an enemy is hit, it makes a jabbing sound.
-------------------------------
Special CaseThe attack is cancelled if the button is released before the charge is complete.
Fail CasesTBA, subject to playtesting.
SynergiesTBA
-------------------------------
Ability ProgressionAbilities could have gameplay related upgrades, they will be listed here.
Upgrade 1The hookshot pull damages enemies.
Upgrade 2Chain hookshot.
Upgrade 3The hookshot lands you behind enemies.

2. Axe

Axe is one of the primary weapons that Adira has.

2.1. Axe Boomerang Throw (T)

SectionDescription
DescriptionThe Axe Boomerang Throw allows the player to throw their axe in a boomerang-like arc, striking enemies in its path both on the way out and back. The axe travels in a wide arc, hitting multiple enemies or environmental objects.
Gameplay RoleThis ability functions as both an offensive and utility tool. It enables the player to deal damage to multiple enemies at once, hit switches or destructible objects from a distance, and trigger environmental interactions in a wide radius.
Unlock ConditionsTBA till narrative is finalized. But we want this ability to be unlocked 50% into the game
-------------------------------
Control/InputsUse analog stick to activate aiming mode (with axe equipped), choose direction to shoot using analog stick, RT to shoot. Subject to change based on playtesting
ModifiersTBA
-------------------------------
Art & AnimationThis section describes the art and animation that would be needed for the ability.
InitiationAdira holds the axe at her side, ready to throw when prompted.
ActivationUpon pressing RT, Adira throws the axe in a twisted motion.
ExecutionThe axe travels an arc damaging all enemies in it's path and returns to Adira.
CooldownAfter landing, the character/object briefly returns to an idle stance.
-------------------------------
Technical SpecsThese are the technical foundations for the ability.
Range100, Subject to playtesting
Damage30, subject to playtesting
Cooldown TimeAfter throwing, Adira returns to idle animation after catching which would be around 0.5 seconds.
Energy Cost20, subject to playtesting
Hitbox DetailsThe axe will be a spinning object with a radius of 20px, subject to playtesting.
-------------------------------
Audio SpecsThese are the sound effects we would need for the ability.
ActivationA swish as Adira pulls the axe back.back.
ExecutionA sound of the axe spinning. Contextual, but we will need a sound for the axe slicing and dicing enemies
ImpactSound of Adira grabbing the axe back.
-------------------------------
VFXThese are the visual effects we would need for the ability.
ActivationNA
ExecutionNA
ImpactNA
-------------------------------
Special CaseIf, during the Activation phase of the animation, players are hit by enemies/traps, they will be stopped.
Fail CasesIf the player throws the axe into the wall, it is an immediate fail state and the axe will return to Adira. Same goes for enemies that might block attacks from one side. Subject to change based on playtesting.
SynergiesTBA
-------------------------------
Ability ProgressionAbilities could have gameplay related upgrades, they will be listed here.
Upgrade 1TBA
Upgrade 2TBA
Upgrade 3TBA

Systems

Flow/Zone System Design Overview

Players build a "Zone" or "Flow" meter by performing positive actions like dodging attacks or hitting enemies. As the meter fills, the player's attack power or other attributes improve. Negative actions, such as taking damage, reduce the meter, lowering these bonuses. |

Theoretical Design

FeatureDetails
Segmented or Smooth (?)Decision pending: Divide the bar into segments or implement smooth progression.
Alternative: Introduce two segments where special effects unlock at 80% or higher (TBA).
Decay SystemThe bar decays over time when inactive, encouraging aggressive or skillful play.
Timer NeededTrack inactivity duration and implement decay rates.
Visual/Audio FeedbackClear feedback (e.g., glowing effects, sound cues) that intensify as the bar fills.
Example: Adira could have steam surrounding her at maximum zone state.
-------------------------------
Trigger TypeActions
-------------------------------------------------------------------------------------------------------------------------------
Basic TriggersHitting enemies, dodging, parrying.
Advanced TriggersPerforming combos, landing critical hits, perfect dodges (Bayonetta-like mechanics pending).
-------------------------------
Penalty TypeActions
-------------------------------------------------------------------------------------------------------------------------------
Core PenaltyTaking damage reduces the Zone bar.
Optional PenaltyPoor performance in skill-based tasks like dodging too early.
-------------------------------
ThresholdBonus
-------------------------------------------------------------------------------------------------------------------------------
Gradual FillIncreases attack power or speed gradually.
Maxed OutUnlocks special skills or abilities (tentative).
Other EffectsPrevents players from tanking hits without repercussions.
-------------------------------
ProsDetails
-------------------------------------------------------------------------------------------------------------------------------
Encourages Skillful PlayRewards timing, execution, and combat precision. Adds depth without new mechanics.
Player EngagementFeedback loops with VFX/SFX keep players invested.
CustomizabilityBalance tweaks possible via thresholds, decay rates, and effects.
StreamliningCombines attack power bonuses and stamina into a single system.
-------------------------------
ConsDetails
-------------------------------------------------------------------------------------------------------------------------------
Balance ChallengesSkilled players dominate; casual players may struggle. Solution: Support via items/foods.
UI ComplexityRisk of overloading the UI or creating confusion.
Scaling IssuesRequires careful balance to ensure meaningful but not overpowering effects.
-------------------------------
Narrative Implications
Narrative RoleThe Zone system ties to Torion's teachings on patience and focus, integrating story and gameplay.
-------------------------------
FeatureDetails
-------------------------------------------------------------------------------------------------------------------------------
Dual EffectsFoods restore HP, increase Zone Bar, or both. Simplifies consumables into two resources.
Cost of ConsumptionMid-combat use triggers cooldowns/animations to prevent spamming (tentative).
Inventory LimitsForces strategic choices on food selection.
-------------------------------
Food EffectsPurpose
-------------------------------------------------------------------------------------------------------------------------------
Zone-Boosting FoodsIncreases Zone Bar.
HP Recovery FoodsRestores HP.
Hybrid FoodsRestores both HP and Zone Bar.
Build FoodsSupports Zone or HP build-up with specific bonuses.
-------------------------------
Strategic ConsiderationsDetails
-------------------------------------------------------------------------------------------------------------------------------
Trade-offsZone-boosting foods may lack HP recovery, forcing strategic choices.
Overuse of healing foods could accelerate Zone decay.
Crafting SystemGather ingredients to craft foods. Example: Combine "Red Berries" + "Wild Honey" for Berry Jam.
Rare FoodsRare/high-cost items fully restore HP + Zone but have limited availability.
-------------------------------
Unique FoodsDetails
-------------------------------------------------------------------------------------------------------------------------------
Risk-Reward FoodsOvercharges Zone Bar but increases decay when hit.
Zone-Exclusive FoodsEffective only when Zone Bar is above certain thresholds.
Environmental FoodsUnique effects based on environment or enemies.
-------------------------------

Final Notes

| Summary | The Zone system replaces stamina, combining attack bonuses and strategic play into one mechanic. | | | Encourages skillful combat while offering depth through items, foods, and combat mastery. |

Ideas/Systems

These are some ideas that are not set in stone.
  • Charged Spear Is Faster When Part Of A Combo
  • Dodging At The Perfect Time With Spear Equipped Gives You A Speed Boost
  • Dodging At The Perfect Time With Axe Equipped Gives You A Damage Boost
  • A Consumable Allows Adira To Increase Damage Every Time She Hits Without Getting Hit
  • Maybe Gloves Or Something Can Be An Upgrade That Allows Her To Grip On To Stuff That In Turn Allows Her To Climb Stuff
  • Weapon Switch Should Have A Axe Sound And A Spear Sound
  • Bosses can use your buffs/debuffs.

GDD - Bosses

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of Bosses in the game, Tribe of the Accord.
StatusDraft
Version1.0

Description

This document will detail all the necessary requirements/vision for the bosses, including but not limited to attack patterns, references, animation requirements, etc.

Before we get into design, here are the basic principles we must follow while designing every boss:

  • Every boss needs to be a test of skill of some sort.
  • Every boss needs to have a narrative hook - with a beginning, climax, and end.
  • Every boss should be a change of pace compared to the previous boss.

Boss List

Below is the list of bosses that we have decided to include as of now. This list is subject to change based on how the narrative develops.

  1. Torion
  2. Igrath
  3. Boar
  4. Dire Wolves
  5. Dhoron
  6. Bison (it will be a stampede during Dhoron’s hunt)
  7. Mammoth
  8. Bruntus (club weapon)
  9. Igrath

Boss Animations

  • Idle
  • Walk
  • PreCharge/Telegraph
  • Run/Charge
  • Attack #1
  • Attack #2
  • Attack #3 (Bosses would support up to 3 different attacks)
  • Hurt
  • Stagger
  • Death
  • Taunt (When first seeing the boss and the player will feel intimidated)
  • Angry (Could be a roar/some form of frustration from the boss that things aren’t going as planned for them, used as a transition between phases)

Sequence of Boss Battle

sequenceDiagram
    participant Player
    participant Boss
    participant StateMachine
    participant BehaviorManager
    participant HealthSystem

    Player->>+Boss: Enters boss arena
    Boss->>Player: Taunt (Dialogue or Animation)
    Boss->>StateMachine: Enter Idle State
    StateMachine->>BehaviorManager: Trigger Phase 1 Behavior

    loop Phase 1
        BehaviorManager->>Boss: Select Attack (Attack 1, Attack 2, etc.)
        Boss->>Player: Execute Attack
        Player->>Boss: Counter-Attack/Damage
        Boss->>HealthSystem: Update Health
        HealthSystem-->>BehaviorManager: Check Health Threshold
        alt Health > 50%
            BehaviorManager->>StateMachine: Continue Phase 1
        else Health <= 50%
            BehaviorManager->>StateMachine: Trigger Phase Transition
        end
    end

    StateMachine->>Boss: Play Phase Transition Animation
    StateMachine->>BehaviorManager: Trigger Phase 2 Behavior

    loop Phase 2
        BehaviorManager->>Boss: Select Attack (Combo Attacks, Enhanced Moves)
        Boss->>Player: Execute Attack
        Player->>Boss: Counter-Attack/Damage
        Boss->>HealthSystem: Update Health
        HealthSystem-->>BehaviorManager: Check Health Threshold
        alt Health > 0%
            BehaviorManager->>StateMachine: Continue Phase 2
        else Health <= 0%
            BehaviorManager->>StateMachine: Trigger Death Sequence
        end
    end

    StateMachine->>Boss: Play Death Animation
    Boss->>Player: Boss Defeated (End Encounter)

1. Detailed Boss Breakdowns

1.1. Torion

  • Location: Campsite
  • Narrative Hook: He is a classic dad who wants to teach Adira the ways of life, but she chooses to defy him to prove her worth every time.
  • Personality traits: He is calm and collected and only moves when necessary. He is a precise fighter.
  • Personality type references:
    • Endeavor (My Hero Academia)
    • Thors (Vinland Saga)
    • Kratos (God of War 2018)
  • Boss mechanic references:
    • Honda Tadakatsu (Nioh) because of the spear
    • The Hanged Man (Hyper Light Drifter)
  • Number of phases: 2
  • Boss Attributes:
    1. Total Enemy Health: 200
    2. Light Damage: 20
    3. Medium Damage: 40
    4. Heavy Damage: 60

Individual attacks:

Phase 1

1. Spear Thrust (Basic Melee)

  • Description: Thrusts spear in player’s direction.
  • Telegraph: Pulls spear backwards.
  • Range: Medium-Long linear towards player.
  • Activation Range: Short-Mid.
  • Damage: Moderate.
  • Dodge: Dodge away, diagonally, or to the side.

2. Around the World

  • Description: Spins in a circle with the spear, damaging anything in range.
  • Telegraph: Pulls spear in the opposite direction of the spin.
  • Range: Short, around the enemy along with some forward momentum.
  • Activation Range: Short.
  • Damage: Light.
  • Dodge: Dodge away.

3. Half Around the World (Heavy Attack)

  • Description: Lunges towards the player and swings the spear horizontally.
  • Telegraph: Running towards player and lunge.
  • Range: Towards the player.
  • Activation Range: Mid.
  • Damage: High.
  • Dodge: Roll away from the attack.

Phase 2

4. Spear Thrust + Half Around the World + Speed up (Combo)

  • Description: Combines spear thrust and around the world sequentially with each attack and is faster - so less telegraph time + attacks are faster.
  • Telegraph: Follows respective attacks telegraphing in combination.
  • Range: Moderate if one of the two lands, high if both land. Combo is dodgeable even if one hit lands.
  • Activation Range: Short-Mid.
  • Damage: Low per hit, but fired in a rapid sequence.
  • Dodge: Move laterally to avoid the hits.

5. Repeated Around the World

  • Description: Torion will spin multiple times and follow Adira wherever she goes. Can chain repeatedly.
  • Telegraph: Follows respective attacks telegraphing but with more buildup.
  • Range: Light if hit lands once. Combo can't be escaped from if caught in.
  • Activation Range: Mid.
  • Damage: Low per hit, but fired in a rapid sequence.
  • Dodge: Move laterally to avoid the hits.

Behavior:

Torion is a calm fighter, so he will only walk around the arena and launch attacks when Adira is in range.

What we want the player to be challenged on:

  • Basic movement
  • Weapon range
  • Dodge roll

1.2. Igrath

  • Location: Campsite/Final Location
  • Narrative Hook: He is the main antagonist of this game, and when Adira finds Igrath for the first time in the story, Torion is missing. Psychologically, this will immediately indicate to the players that Igrath is pretty strong if Torion, who is extremely strong himself, had gone missing. With the addition of good music, VFX, and unique animations, Igrath could be perfect as the first and the narratively last boss of the game.
  • Personality traits: He is a bit of an anarchist, very erratic with his actions, and that should reflect in his movements too. His attacks should be more vicious and lack technique.
  • Personality type references:
    • Mugen (Samurai Champloo)
    • Trevor (GTA 5)
    • Arkham (DMC3)
  • Boss mechanic references:
    • Godfrey (Elden Ring) because of the axe
    • Nosk (Hollow Knight) for the erratic movement
  • Number of phases: 3 (only 1 will be available for the first fight at the campsite)

Individual attacks:

Phase 1

1. Axe Slash (Basic Melee)

  • Description: Swings axe in a wide arc in front of it.
  • Telegraph: Swings the axe in the opposite direction for buildup.
  • Range: About 180 degrees towards the player.
  • Activation Range: TBA.
  • Damage: Moderate.
  • Dodge: Dodge away or to the side.

2. Reverse Hit (Stun)

  • Description: Uses the other end of the axe for a quick attack.
  • Telegraph: Pulls back the axe.
  • Range: Vertically in front of the boss towards the player.
  • Activation Range: TBA.
  • Damage: Light, but causes a short stun.
  • Dodge: Dodge away or diagonally in his direction to sneak in a back attack.

3. Axe Smash (Heavy Attack)

  • Description: Lunges towards the player and swings the axe in a vertical smash.
  • Telegraph: Running towards player and lunge.
  • Range: Towards the player.
  • Activation Range: TBA.
  • Damage: High.
  • Dodge: Roll to the side right before the axe hits the ground.

4. Retaliate (Light Attack)

  • Description: If a player rolls behind and is being greedy with attacks, Igrath turns back and immediately does an axe slash.
  • Telegraph: Sprite shake.
  • Range: About 270 degrees towards the player.
  • Activation Range: TBA.
  • Damage: Light.
  • Dodge: Roll away from the attack.

Phase 2

5. Axe Slash + Axe Smash + Speed up (Combo)

  • Description: Combines axe slash and smash simultaneously with each attack and is faster - so less telegraph time + attacks are more frenetic.
  • Telegraph: Follows respective attacks telegraphing.
  • Range: Moderate if one of the two lands, high if both land. Combo is dodgeable even if one hit lands.
  • Activation Range: TBA.
  • Damage: Low per hit, but fired in a rapid sequence.
  • Dodge: Move laterally to avoid the hits.

6. Reverse Hit Stun + Axe Slash

  • Description: Combines reverse hit stun + axe slash/smash. This is a commit attack.
  • Telegraph: Same as reverse hit stun.
  • Activation Range: TBA.
  • Damage: Moderate if you don’t get caught in the stun, high if both attacks land. If caught in stun, can’t avoid the second attack.
  • Dodge: Run or roll to stay ahead of the sweeping beam.

Phase 3

7. Reverse Hit Stun + Axe Slash + Axe Smash + Shockwave with Phase 2 speed (Combo)

  • Description: Axe attack from before happens 2 times in a row without breaks where Igrath tracks Adira. Third attack causes a shockwave.
  • Telegraph: Same as the Axe attack, but it takes a little longer.
  • Range: Moderate if one of the two lands, high if both land. Combo is dodgeable even if one hit lands.
  • Activation Range: TBA.
  • Damage: Moderate per hit, high if taking all 3 hits.
  • Dodge: Move laterally to avoid the hits.

8. Axe Slash + Axe Slash + Axe Smash + Shockwave with Phase 2 speed (Combo)

  • Description: Axe attack from before happens 2 times in a row without breaks where Igrath tracks Adira. Third attack causes a shockwave.
  • Telegraph: Same as the Axe attack, but it takes a little longer.
  • Range: Moderate if one of the two lands, high if both land. Combo is dodgeable even if one hit lands.
  • Activation Range: TBA.
  • Damage: Moderate per hit, high if taking all 3 hits.
  • Dodge: Move laterally to avoid the hits.

Behavior:

Igrath is going to challenge Adira at all ranges. TBA abilities of the game.

What we want the player to be challenged on:

TBA

1.3. Boar

  • Location: TBA but near Freyanna
  • Narrative Hook: The boar will threaten Freyanna, and Adira will have to save her from the Boar.
  • Personality traits: It's an agile animal and can change directions quickly.
  • Personality type references: - N/A
  • Boss mechanic references:
    • Commander Gaius (Elden Ring)
    • FengXi (Wo Long)
  • Number of phases: 2

Individual attacks:

Phase 1

1. Tusk Slash

  • Description: Swings tusk in a wide arc in front of it.
  • Telegraph: Swings the tusks in the opposite direction for buildup.
  • Range: About 120 degrees towards the player.
  • Activation Range: TBA.
  • Damage: Moderate.
  • Dodge: Dodge away or to the side.

2. Tusk Poke

  • Description: Uses tusk to poke at the player.
  • Telegraph: Pulls back the tusk.
  • Range: Vertically in front of boss towards the player.
  • Activation Range: TBA.
  • Damage: Light, but causes a short stun.
  • Dodge: Dodge away or diagonally in his direction to sneak in a back attack.

3. Charged Attack

  • Description: Lunges towards the player and swings the tusk in a vertical smash.
  • Telegraph: Backward lean.
  • Range: Towards the player.
  • Activation Range: TBA.
  • Damage: High.
  • Dodge: Roll to the side right before the tusk hits the ground.

Phase 2

5. Tusk Slash + Tusk Poke Combo

  • Description: Combines tusk slash + tusk poke and is faster - so less telegraph time + attacks are more frenetic.
  • Telegraph: Follows respective attacks telegraphing.
  • Range: Moderate if one of the two lands, high if both land. Combo is dodgeable even if one hit lands.
  • Activation Range: TBA.
  • Damage: Low per hit, but fired in a rapid sequence.
  • Dodge: Move laterally to avoid the hits.

6. Repeated Charge

  • Description: Chains multiple charge attacks together.
  • Telegraph: Same as charge.
  • Activation Range: TBA.
  • Damage: Moderate if you don’t get caught in stun, high if both attacks land. If caught in stun, can’t avoid the second attack.
  • Dodge: Run or roll to stay ahead of the sweeping beam.

Behavior:

TBA

What we want the player to be challenged on:

TBA

1.6. Bison

  • Location: TBA but near Fall's Village
  • Narrative Hook: The bison will be part of the test that Dhoron gives to Adira, and she'll be compelled to prove Dhoron wrong.
  • Personality traits: It is a relatively slow animal, and while Adira can dodge it easily, its attacks hit hard.
  • Personality type references: - N/A
  • Boss mechanic references:
    • Commander Gaius (Elden Ring)
    • FengXi (Wo Long)
  • Number of phases: 2

Arena Data

Since the fight will be taking place inside a stampede, we can have the arena be stuffed with bisons running across. Ideally, we can have a group of bisons running in vertical and horizontal directions so we can have enough patterns.

Individual attacks:

Phase 1

1. Horn Poke

  • Description: Thrusts horns towards the player.
  • Telegraph: Rears back to charge.
  • Range: Vertically towards the player.
  • Activation Range: TBA.
  • Damage: Moderate.
  • Dodge: Dodge away or to the side.

2. Dust Kick

  • Description: Uses horns to hurl dust at Adira and stun her.
  • Telegraph: Rears backward.
  • Range: Short towards the player.
  • Activation Range: TBA.
  • Damage: Light, but causes a short stun.
  • Dodge: Dodge away or diagonally in his direction to sneak in a back attack.

3. Bison Charge

  • Description: The traditional bison charge - it will roughly follow the player until the bison gets exhausted.
  • Telegraph: Backward lean.
  • Range: Towards the player.
  • Activation Range: TBA.
  • Damage: High.
  • Dodge: Roll to the side right before the bison hits the ground.

Phase 2

5. Herd Control

  • Description: Emits a roar triggering changes in patterns of running bisons.
  • Telegraph: Roars at the player.
  • Range: N/A.
  • Activation Range: TBA.
  • Damage: N/A.
  • Dodge: Dodge the patterns.

6. Repeated Charge

  • Description: Chains multiple charge attacks together.
  • Telegraph: Same as charge.
  • Activation Range: TBA.
  • Damage: Moderate if you don’t get caught in stun, high if both attacks land. If caught in stun, can’t avoid the second attack.
  • Dodge: Run or roll to stay ahead of the sweeping beam.

Behavior:

TBA

What we want the player to be challenged on:

TBA

1.6. Bruntus

  • Location: TBA but in Ursa camp
  • Narrative Hook: Bruntus will not have the narrative weight but will be a huge obstacle before Adira can get to Igrath/Torion.
  • Personality traits: It's an agile animal and can change directions quickly.
  • Personality type references: - N/A
  • Boss mechanic references:
    • Troll (God of War)
    • FengXi (Wo Long)
  • Number of phases: 2

Individual attacks:

Phase 1

1. Club Jump Attack

  • Description: Grabs club with both hands, jumps towards Adira, and smashes the club into the ground.
  • Telegraph: Bruntus raises the club above his head.
  • Range: It will be a radius where the dodge roll should be a comfortable dodge.
  • Activation Range: TBA.
  • Damage: High.
  • Dodge: Dodge away.

2. Club One Arm Smash

  • Description: A vertical smash that has an extremely wide range.
  • Telegraph: Lifts club into the air with one hand.
  • Range: Vertical towards the player.
  • Activation Range: TBA.
  • Damage: Moderate.
  • Dodge: Dodge away or diagonally in his direction to sneak in a back attack.

3. Club Two Arm Smash

  • Description: Lunges towards the player and swings the club in a vertical smash with a shockwave.
  • Telegraph: Lifts club into the air with both hands.
  • Range: Vertical towards the player.
  • Activation Range: TBA.
  • Damage: High.
  • Dodge: Roll to the side or away right before the club hits the ground.

Phase 2

5. Repeated Club One Arm Smash

  • Description: Chains multiple club attacks together.
  • Telegraph: As per attack.
  • Activation Range: TBA.
  • Damage: Moderate for every attack, but once locked, the player can't escape the combo.
  • Dodge: Run or roll to stay ahead of the sweeping beam.

Behavior:

TBA

What we want the player to be challenged on:

TBA

GDD - Combat

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the core combat mechanics of Tribe of the Accord. The focus is on creating engaging and dynamic combat encounters that challenge the player's skills and offer a sense of progression and reward.
StatusDraft
Version1.0

Description

1. Combat Mechanics

1.1 Basic Elements

  • Movement
  • Attack
  • Interact
  • Dodge/Roll

We will go for a quad directional combat system (4 Directions).

1.2 Melee Combat

  • Primary weapon: Axe/Spear
  • Basic attacks: Combo system with every subsequent hit causing more damage
  • Charged attacks: The spear already has a running thrust, the axe can be a wider swing or a complete 360 degree spin.
  • Parrying: Timed block mechanic for deflecting enemy attacks or a similar mechanic where timing your counter right feels super rewarding.

1.3 Equipment and Items:

  • Secondary weapons: Bow and arrow, bombs, traps and tools
  • Consumables: Health potions, buffs, temporary weapons

1.4 Enemy Variety:

  • Basic enemies: Melee attackers, ranged attackers, and shielded enemies
  • Mini-bosses: Larger and more powerful enemies with unique attack patterns
  • Bosses: Epic encounters with distinct phases and mechanics

2. Combat Encounters

2.1 Encounter Design

  • Placement of enemies: Strategic positioning to create interesting challenges
  • Environmental hazards: Traps, obstacles, and hazards that affect both the player and enemies
  • Puzzle integration: Combat encounters intertwined with environmental puzzles to encourage creative solutions

One thing to consider would be stagger states and internal poise numbers. Every enemy should have a limit to where if they take a certain amount of damage, they get staggered. We have discussed environmental staggering as well but that has yet to be implemented.

We also have to consider a cooldown for attacks. We can’t have enemies repeatedly attacking us without taking a break.

Based on this document, here are the proposed example behavior traits of some enemies for combat.

  • RABBIT

    • No internal stagger number which basically means if you hit it, it gets staggered. It pounces once and then has a cool down of 2 seconds before it does another pounce.
  • WILD BOAR

    • It has a stagger which takes about 2 or 3 hits. It charges towards you in a linear direction and if you are in its way, it damages you. If you dodge and it hits a wall, it gets staggered. If it doesn’t hit a wall, it keeps going for a little distance and then halts for 2 seconds before turning around towards you and starting to charge.
  • DIREWOLF

    • It has a pounce combo that you have to dodge. It will pounce on you 3 times before it takes a rest, but even when it takes a rest, it maintains a distance that you have to cover up before attacking it. It has a cooldown of about 3-5 seconds before it does another combo. It’s internal stagger is again 2 hits worth of damage.

2.2 Player Reaction

This is something we will have to discuss. But we need to figure out how the player reacts to difference damages and whether it is in the production scope to make it variable or do we just make it a - damage hit + few moments of i-frames

3. Player Progression

3.1 Experience and Leveling:

  • Experience points: We could have a skill tree that unlocks various moves or craftables rather than just stat increases.

3.2 Skill Trees:

  • Axe/Spear: Enhance axe/spear techniques and combos
  • Archery: Better archery skills (like piercing arrows, triple arrows etc)
  • Traps and tools: This can be a stat based thing where we can incrementally use stat boosting

3.3 Equipment Upgrades:

  • Crafting system: Collect materials to craft and upgrade weapons, armor, and items
  • Unique items: Discover rare and powerful equipment through exploration and quests

4. User Interface:

4.1 Heads-Up Display (HUD):

It is always good to take into account things like screen shake, low health red vignette.

4.2 Combat Feedback:

  • Visual and audio cues for successful attacks, blocks, and dodges
  • Damage indicators to show hits taken and dealt or a health bar.

5. Progression and Rewards

5.1 Quests and Objectives:

  • Main storyline quests
  • Side quests and optional challenges

5.2 Exploration:

  • Hidden treasures: Secret areas with valuable loot
  • Lore collectibles: Discoverable items that reveal the game world's backstory

5.3 Achievement System:

  • Reward players for completing specific challenges and milestones
  • Unlockable cosmetics and bonuses

GDD - Controls

Cover Image Controls

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the player input through keyboard and joysticks in the game Tribe of the Accord.
StatusReady for Adoption
Version2.0

Description

1. Controller/Joystick

1.1. Gameplay

Controller Gameplay

1.2. UI

Controller UI

2. Keyboard

2.1. Gameplay

Keyboard Gameplay

2.2. UI

Keyboard UI

3. Events

3.1. Gameplay

  • Menu: This input action will open the in-game menu.

  • Inventory: This input action will open Adira's inventory.

  • Use Item: This input action will make Adira consume the currently selected item in the GUI (when you are NOT in the inventory).

  • Aim Mode: This input action will trigger Aim Mode when Adira is using an aimable/throwable weapon. If pressed again, Aim Mode will be disabled. Used only for Keyboard & Mouse.

  • Shoot: This input action will trigger a shoot action when Adira is aiming with an aimable/throwable weapon. This includes throwing a javelin.

  • Move: This input action controls character movement. Each input will move Adira in a different direction (Up, Down, Left, Right).

  • Aim: This input action is for when Adira is in Aim Mode. It will control where she is aiming. To shoot, the player will need to press the "Shoot" action.

    • When using a controller, the player will use the right stick to aim.
    • When using a keyboard, the player will use the normal move keys to aim.
  • Change Move Stance: This input action changes Adira's walk/run stance. When Adira is running, this action will switch her to walking, and vice versa. (This does not work in cutscenes and some scenes where you may be forced to walk for dramatic effect.)

  • Cycle Weapons: This input action cycles through the acquired weapons (shown in the GUI). One input will go forward and the other backward in the array of available weapons.

    • Keyboard
      • 1 - Fists
      • 2 - Spear
      • 3 - Axe
  • Cycle Items: This input action cycles through the acquired consumable items (shown in the GUI). One input will go forward and the other backward in the array of available items.

  • Roll: This input action will make Adira roll in the direction she is facing, walking, or running.

  • Attack: This input action will make Adira attack (punching, slashing, striking) in the direction she is facing, walking, or running.

  • Interact: This input action will make Adira interact with something in the game scene.

  • Map: This input action will open the map, but it can be closed via the Cancel action.

3.2. UI

  • Menu: This input action will close the in-game menu (if it is currently opened).

  • Inventory: This input action will close Adira's inventory (if it is currently opened).

  • Move: This input action changes between options. Each input will move the selector in a different direction (Up, Down, Left, Right).

  • Cycle Tabs: This input action cycles through the tabs in the currently opened UI. One input will go forward and the other backward in the array of available tabs.

  • Transfer: This input action quickly transfers an item from a storage container/crafting workbench to Adira's inventory, or from her inventory to the storage container/crafting workbench. A single input will automatically handle the transfer of the item to an empty spot.

  • Discard: This input action will discard the currently hovered/selected weapon.

  • Cancel: This input action will cancel, go back, or close something in the UI menu.

  • Equip: This input action will equip, use/consume, or craft an item.

  • Confirm: This input action will choose, accept, select, or confirm an option/item from the UI.

  • Map: This input action will close the map (if it is currently opened).

Controller

Gameplay

FunctionActionController
Move upmove_upLeft analog stick up
Move rightmove_rightLeft analog stick right
Move downmove_downLeft analog stick down
Move leftmove_leftLeft analog stick left
Aim upaim_upRight analog stick up
Aim rightaim_rightRight analog stick right
Aim downaim_downRight analog stick down
Aim leftaim_leftRight analog stick left
--LB / L1
Weapon Switchweapon_switchLT / L2
Inventoryui_inventoryView /Select
AttackattackX / Square
RollrollA / Cross
--B / Circle
InteractinteractY / Triangle
Menuui_menuMenu / Start
--RB / R1
ShootshootRT / R2
Use Itemuse_itemD-Pad Up
--D-Pad Down
Cycle Item Previouscycle_item_previousD-Pad Left
Cycle Item Nextcycle_item_nextD-Pad Right
-LS / L3
Mapui_mapRS / R3

GUI Controls

FunctionActionController
Move upui_upLeft analog stick up
Move rightui_rightLeft analog stick right
Move downui_downLeft analog stick down
Move leftui_leftLeft analog stick left
Cycle Tab Previousui_cycle_tab_previousLB / L1
Cycle Tab Nextui_cycle_tab_nextRB / R1
--LT / L2
Inventoryui_inventoryView /Select
Use Itemui_use_itemX / Square
Confirmui_confirmA / Cross
Cancelui_cancelB / Circle
Discardui_discardY / Triangle
Menuui_menuMenu / Start
Transferui_transferRT / R2
--D-Pad Up
--D-Pad Down
--D-Pad Left
--D-Pad Right
--LS / L3
--RS / R3

Keyboard

Gameplay

FunctionActionKeyboardMouse
Move upmove_upW
Move rightmove_rightD
Move downmove_downS
Move leftmove_leftA
Aim upaim_upMouse Move
Aim rightaim_rightMouse Move
Aim downaim_downMouse Move
Aim leftaim_leftMouse Move
Aim Modeaim_modeRight Click
Use Itemuse_itemQ
Menuui_menuEsc
Inventoryui_inventoryTab
AttackattackLeft Click
InteractinteractE
RollrollShift
ShootshootLeft click
--Space
Cycle Weapon Previouscycle_weapon_previousScroll up
Cycle Weapon Nextcycle_weapon_nextScroll down
Cycle Item Previouscycle_item_previousR
Cycle Item Nextcycle_item_nextF
Mapui_mapM

GUI Controls

FunctionActionKeyboardMouse
Move upui_upUP / W
Move rightui_rightRIGHT / D
Move downui_downDOWN / S
Move leftui_leftLEFT / A
Select using hoverui_move_cursorMove mouse
Cycle Tab Previousui_cycle_tab_previousQ
Cycle Tab Nextui_cycle_tab_nextE
Menuui_menuEsc
Use Itemui_use_itemLeft click
Confirmui_confirmEnter / Space
Cancelui_cancelRight click
Discardui_discardI
Inventoryui_inventoryTab
Transferui_transferO
--.
--,
--X
--Z
Mapui_mapM
--Shift

GDD - Enemies

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the enemies in game that are key to bringing the game to life and providing a challenge out in the wild to the player as she traverses the levels. All enemies that are a threat will be land based and mainly animals/creatures, but there are also human based enemies.
StatusDraft
Version1.0

Creatures

These are animal-based enemies that are scattered throughout the levels and world.


Ant

Ant

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


BeeSwarm

BeeSwarm

SectionDescription
NameBee Swarm
------------------------------------
DescriptionA buzzing swarm of bees that hovers in place or moves slowly, launching individual bees at the player.
TypeRanged
------------------------------------
Gameplay RoleA ranged enemy designed to pressure the player from a distance, forcing them to dodge incoming bee attacks or making them a priority. This enemy adds difficulty to combat by constantly harassing the player, especially when paired with other melee enemies.
Areas PresentForests, Moorlands, TBA
------------------------------------
Attack DescriptionShoots bees at the player.
------------------------------------
MovementThe swarm moves slowly across the screen, hovering slightly above the ground. It periodically shifts locations to reposition itself, but remains stationary when attacking.
BehaviorThe Swarm of Bees maintains distance from the player, continuously launching bees at a set interval. It may relocate if the player gets too close or far away.
------------------------------------
Control/InputsPlayers must dodge the incoming bees. Attacking from a distance with ranged weapons is an effective strategy.
------------------------------------
Art & AnimationDescribes the enemy's visuals and animations:
IdleThe swarm hovers in place, patrolling back and forth. If we can make them hover near shrubs, it would make a lot of sense because honeybees collect nectar.
Attack AnimationThe swarm briefly gathers energy, then shoots a bee toward the player.
Damage FeedbackWhen hit, bees scatter briefly before reforming into original formation.
------------------------------------
Telegraph & VFX RequirementsHow the enemy telegraphs its attacks and the corresponding visual effects:
Attack TelegraphBefore launching a bee, the queen bee moves its head back, indicating it is about to attack.
VFX RequirementsTBA.
------------------------------------
Technical SpecsThe technical foundations of the enemy, including stats and balancing:
Health20 HP (subject to playtesting).
Damage10 HP (subject to playtesting).
SpeedSlow hovering movement. Bees shoot quickly toward the player.
Range150pixels (subject to playtesting).
Attack IntervalThe swarm launches a bee every 2 seconds (subject to playtesting).
KnockbackModerate, subject to playtesting.
Player KnockbackModerate.
------------------------------------
Audio SpecsDescription of the enemy's sound effects:
IdleA low buzzing sound that intensifies when the swarm prepares to attack during telegraphj.
AttackA sharp buzzing sound and a swoosh as each bee is launched, followed by a faint whirring sound as the bee homes in on the player.
------------------------------------
VFXDescription of visual effects during the enemy’s actions:
IdleSmall bees flying around within the swarm, creating a faint glow or dust particles around the swarm.
AttackA streaking effect as the bee flies toward the player. When a bee hits the player, there’s a small burst of energy or sparks to signify impact.
------------------------------------
Special CaseTentative but 3 bees get launched in rapid succession at player after the bee swarm HP is gone
Fail CasesTBA
------------------------------------
Combat StrategyThe enemy's general strategy in combat:
Preferred Engagement TacticsAttacks from a range and tries to stay out of reach of the player’s melee attacks.
Optimal Player StrategiesClosing in and attacking with a spear or AoE abilities is most effective.
Environmental InteractionsIf pseudo-3D level design is implemented, the swarm should be able to climb walls seamlessly.
------------------------------------
SynergiesPairs well with melee enemies, forcing the player to dodge bee attacks while dealing with close-range threats. Also effective in tight spaces where dodging bees becomes more difficult.
------------------------------------
Enemy ProgressionVariations or stronger versions of the enemy encountered later in the game:
Variation 1TBA

Why will it be fun?

Bees being long ranged attackers makes them perfect for challenging players dealing with multiple melee enemies. Players will have to prioritize


Boar

Boar

A boar will not be a threat until you are too close to it.

Movement Pattern

A boar will be in a patrol state until it sees the player. Even after seeing the player, the boar might back off a little until the player gets too close.

Why will it be fun?

A boar is an aggressive enemy for players and will charge beyond the player and smack into hard obstacles.


Ibex

Ibex

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Rabbit

Rabbit

SectionDescription
NameRabbit
-----------------------------------------
DescriptionA quick and aggressive enemy that charges towards the player, attempting to lunge and cause damage.
TypeMelee
-----------------------------------------
Gameplay RoleThe rabbit serves as a close-range threat, constantly lunging at the player and repositioning itself to attack again. It adds pressure in combat and is especially challenging in groups.
Areas PresentForests Moorlands, TBA
-----------------------------------------
Attack DescriptionLunges at the player from a short distance, waits for a second, and starts building up next attack.
-----------------------------------------
MovementThe rabbit moves quickly across the screen, targeting the player and charging in the direction of the player.
BehaviorThe rabbit aggressively targets the player, aiming to get in close for its lunge attack. If attacked, it gets stunned or knocked back, forcing it to recover before attacking again.
-----------------------------------------
Control/InputsPlayers must dodge the lunging attack or interrupt the rabbit mid-charge with a well-timed attack. Getting too close or ignoring the rabbit leaves the player vulnerable to repeated lunges.
-----------------------------------------
Art & AnimationDescribes the enemy's visuals and animations:
IdleThe rabbit hops slightly in place in linear paths unless player is detected
Attack AnimationThe rabbit crouches momentarily before lunging at the player.
Damage FeedbackWhen hit, the rabbit gets knocked back, momentarily dazed.
-----------------------------------------
Telegraph & VFX RequirementsHow the enemy telegraphs its attacks and the corresponding visual effects:
Attack TelegraphBefore lunging, the rabbit briefly crouches and shifts its weight backward, preparing to spring forward.
VFX RequirementsSmall dust clouds for when the the rabbit lunges.
-----------------------------------------
Technical SpecsThe technical foundations of the enemy, including stats and balancing:
Health10 (subject to playtesting).
Damage5 (subject to playtesting).
SpeedFast movement.
RangeShort range lunging attack.
Attack IntervalAttacks every 3 seconds (subject to playtesting).
KnockbackHigh.
Player KnockbackNone.
-----------------------------------------
Audio SpecsDescription of the enemy's sound effects:
IdleThe sound of light footsteps or soft, rhythmic breathing.
AttackA quick rustling sound as the rabbit charges, followed by a light thud when it hits the player.
-----------------------------------------
VFXDescription of visual effects during the enemy’s actions:
IdleSlight dust particles around the rabbit’s feet as it hops in place.
AttackA brief trail effect to signify the lunge’s speed.
-----------------------------------------
Special CaseNone
Fail CasesNone
-----------------------------------------
Combat StrategyThe enemy's general strategy in combat:
Preferred Engagement TacticsCharges at the player from close range, attempting to lunge and then retreat to avoid being struck.
Optimal Player StrategiesBest handled with a spear. Time the attacks to interrupt its charge or attack after it has lunged.
Environmental InteractionsN/A
-----------------------------------------
SynergiesPairs well with ranged enemies that can distract the player, allowing the rabbit to get in close for quick attacks. Also effective in environments with limited movement space.
-----------------------------------------
Enemy ProgressionRattle Snake in Canyons with Higher Poison Effectiveness (T)
Variation 1TBA

Why will it be fun?

A rabbit is a cannon fodder enemy that will work pretty well in a crowd where it will be JUST ENOUGH to cause issues for the player.


Snake

Snake

A snake should feel threatening - its hisses should be heard as soon as you enter the vicinity and they should be able to sense you nearby regardless of sight since snakes have thermal vision or biochemical vision in nature.

SectionDescription
NameSnake
-----------------------------------------
DescriptionA slithering predator that strikes at the player with quick, venomous lunges. Can blend in the environment sometimes The precise timing to ambush its target.
TypeMelee
-----------------------------------------
Gameplay RoleThe snake strikes with quick lunges that inflict damage and TENTATIVELY status effects.
Areas PresentForests, Moorlands, TBA
-----------------------------------------
Attack DescriptionStrikes at the player from a short distance, dealing damage and potentially applying a debuff.
-----------------------------------------
MovementThe snake moves across the ground in rapid short bursts in a winding pattern to mess up with the rhythm of the player. When idle, it coils in place, blending into its surroundings.
BehaviorThe snake maintains a low profile and waits for the player to get close. When the player enters its range, it lunges forward quickly to strike. If the player moves away, the snake may try to reposition itself for another attack.
-----------------------------------------
Control/InputsPlayers must watch their surroundings for the snake’s camouflaged position and dodge or parry its strike. Players should approach cautiously and be ready to react to sudden attacks.
-----------------------------------------
Art & AnimationDescribes the enemy's visuals and animations:
IdleThe snake coils in place, swaying slightly and blending in with the environment. Occasionally flicks its tongue.
Attack AnimationThe snake briefly rears its head back before snapping forward in a quick lunge.
Damage FeedbackWhen hit, the snake briefly flattens to the ground before recoiling back into its attack stance.
-----------------------------------------
Telegraph & VFX RequirementsHow the enemy telegraphs its attacks and the corresponding visual effects:
Attack TelegraphThe snake coils tightly and raises its head before lunging forward.
VFX RequirementsTBA.
-----------------------------------------
Technical SpecsThe technical foundations of the enemy, including stats and balancing:
HealthLow to Medium (subject to playtesting).
DamageMedium (subject to playtesting).
SpeedSlow slithering movement, but fast lunging attack.
RangeShort range lunging attack.
Attack IntervalThe snake attacks every 2.5 seconds (subject to playtesting).
KnockbackLow to moderate, subject to playtesting.
Player KnockbackNone.
-----------------------------------------
Audio SpecsDescription of the enemy's sound effects:
IdleA faint rustling or slithering sound, with occasional hissing.
AttackA sharp hiss followed by a swift, snapping sound as the snake lunges. Rustling of grass as the snake slides through.
-----------------------------------------
VFXDescription of visual effects during the enemy’s actions:
IdleSubtle grass movement around the snake’s coiled and moving position, with a small glint in its eyes when it's about to attack.
AttackA quick blur effect as the snake lunges forward. A faint, dark vapor trail if poison or a debuff is inflicted (T).
-----------------------------------------
Special CaseTBA
Fail CasesTBA
-----------------------------------------
Combat StrategyThe enemy's general strategy in combat:
Preferred Engagement TacticsPrefers to wait in hiding and strike from a camouflaged position. If spotted, it may try to circle around the player before attacking again.
Optimal Player StrategiesUse ranged attacks or area-clearing abilities to expose or damage the snake from a safe distance. Pay attention to its coiling telegraph and prepare to dodge or counter its lunges.
Environmental InteractionsCan move through narrow spaces or climb over small obstacles to maintain pursuit. It can also remain hidden in tall grass or shadowed areas, adding an element of surprise.
-----------------------------------------
SynergiesPairs well with other stealthy or environmental enemies, creating situations where players must watch their surroundings closely. Also effective in narrow areas where dodging is more challenging.
-----------------------------------------
Enemy ProgressionRattle Snake in Canyons with Higher Poison Effectiveness (T)
VariationsTBA

Why will it be fun?

A snake is an uncomfortable enemy for players. It is a cannon fodder enemy in terms of HP and defense stats but can cause some serious damage with its poisoning if combined with other enemies.


Bat

Bat

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Bird

Bird

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Deer

Deer

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Mammoth

Mammoth

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Rhino

Rhino

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Spider

Spider

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Bear

Bear

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Bison

Bison

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Hornet

Hornet

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Mosquito

Mosquito

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Smilodon

Smilodon

TODO

Movement Pattern

TODO

Why will it be fun?

TODO


Wolf

Wolf

TODO

Movement Pattern

TODO

Why will it be fun?

TODO

Humans

To be discussed.

GDD - Locations

Cover Image Locations

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of the Locations in the game Tribe of the Accord and their associated tile-sets and props.
StatusDraft
Version1.0

Overview

GDD - Locations - Props

Props are used to decorate each location.

Props Overview

  1. Animal Bones
  2. Block
  3. Bush
  4. Cactus
  5. Cave
  6. Chest
  7. Hedge
  8. Hedge Prickly
  9. Hearth
  10. Hideout
  11. Hut
  12. Leaf Carpet
  13. Log
  14. Post Blockade
  15. Pond
  16. Pot
  17. Rock
  18. Signpost
  19. Spike Trap
  20. Stalagmite
  21. Statue
  22. Storage Container
  23. Stream
  24. Tent
  25. Tree
  26. Tumbleweed
  27. Waterfall
  28. Sign Post
  29. Workbench

1. Animal Bones

Bones

Description

The animal bones are used as decorative elements to enhance the game environment.

Locations used:

  1. Caves
  2. Canyons

2. Block

Block

Description

The block is used for creating obstacles and structures in various areas.

Locations used:

  1. Caves

3. Bush

Bush

Description

The bush is used as a decorative element in various areas.

Locations used:

  1. Forest
  2. Meadows

4. Cactus

Cactus

This asset has not yet been created, and this image is an AI placeholder

Description

The cactus is used as a natural obstacle and decoration in desert areas. It causes attack damage to the Player upon touching it.

Locations used:

  1. Canyons

5. Cave

Cave

Description

The cave is used as an entrance to an underground caves location. They can act as pathways between two locations as part of level design.

Locations used:

  1. Forest
  2. Moorlands

6. Chest

Chest

Description

The chest is used for storing valuable items. It can be opened by the player to reveal the item stored.

Locations used:

  1. All locations

7. Hedge

Hedge

Description

The hedge is used as a natural obstacle and decoration in various areas.

Locations used:

  1. Forest
  2. Meadows

8. Hedge Prickly

Hedge Prickly

Description

The hedge prickly is used as a natural obstacle and decoration in various areas. It causes attack damage to the Player upon touching it.

Locations used:

  1. Forest
  2. Meadows

9. Hearth

Hearth

Description

The hearth is used as a central fire pit for cooking and warmth.

Locations used:

  1. Campsite

10. Hideout

Hideout

This asset has not yet been created, and this image is an AI placeholder

Description

The hideout is used for Adira to sleep, similar to a Tent

Locations used:

  1. Forest

11. Hut

Hut

This asset has not yet been created, and this image is an AI placeholder

Description

The hut is used as a traditional dwelling.

Locations used:

  1. Campsite

12. Leaf Carpet

Leaf Carpet

Description

The leaf carpet is a temporary placement of loose leaves that disperse once the Player walks on them.

Locations used:

  1. Forest
  2. Moorlands
  3. Meadows

13. Log

Log

Description

The log is used as a natural obstacle and decoration in various areas.

Locations used:

  1. Forest

14. Post Blockade

Post Blockade

Description

The pillar is used as a structural element in various areas.

Locations used:

  1. Moorlands
  2. Forest
  3. Meadows

15. Pond

Pond

Description

The pond is used to add water bodies within various areas.

Locations used:

  1. Caves
  2. Forest
  3. Meadows

16. Pot

Pot

Description

The pot is used for cooking and boiling water.

Locations used:

  1. Campsite

17. Rock

Rock

Description

The rock is used to create natural obstacles and decorations.

Locations used:

  1. Caves
  2. Forest
  3. Meadows
  4. Moorlands

18. Signpost

Signpost

Description

The signpost is used to provide directions and information to the player.

Locations used:

  1. Campsite
  2. Caves
  3. Forest

19. Spike Trap

Spike Trap

This asset has not yet been created, and this image is an AI placeholder

Description

The spike trap is used as a dangerous obstacle to catch or harm players.

Locations used:

  1. Caves
  2. Dark Forest

20. Stalagmite

Stalagmite

Description

The stalagmite is used as a natural cave formation.

Locations used:

  1. Caves

21. Statue

Statue

This asset has not yet been created, and this image is an AI placeholder

Description

The statue is used as a decorative element/landmark in various areas and can vary in type.

Locations used:

  1. Caves
  2. Shadow Forest

22. Storage Container

Storage Container

Description

The storage container is used for storing various items. The Player can interact to get items out of it or place items inside.

Locations used:

  1. Campsite

23. Stream

Stream

This asset has not yet been created, and this image is an AI placeholder

Description

The stream is used to add flowing water bodies within various areas.

Locations used:

  1. Valleys

24. Tent

Tent

Description

The Tent is used for Adira to sleep, where she can enter to end the day.

Locations used:

  1. Moorlands
  2. Forest
  3. Falls Village

25. Tree

Tree

Description

The tree is used as a major decorative element in various areas and is animated. It makes a whooshing sound when the Player gets close to it.

Locations used:

  1. Forest
  2. Meadows
  3. Dark Forest

26. Tumbleweed

Tumbleweed

This asset has not yet been created, and this image is an AI placeholder

Description

The tumbleweed is used as a natural obstacle and decoration in desert areas. It can be moved around when touched but does not do anything.

Locations used:

  1. Canyons

27. Waterfall

Waterfall

This asset has not yet been created, and this image is an AI placeholder

Description

The waterfall is used as a decoration, it makes a crashing water sound when the player gets close to it.

Locations used:

  1. Valleys
  2. Falls Village

28. Sign Post

Sign Post

Description

The sign post is dug into the ground and varies based on the icon:

  1. Info - Gives the player a random or forced 'Tip', which brings up a tip screen.
  2. Tent - Go home (fast track or completion of level if reached a dead end)
  3. Hunt - Trigger for starting a new chapter or choosing a weapon (TBD)

Locations used:

  1. Moorlands
  2. Forest
  3. Meadows
  4. Caves
  5. Canyons
  6. Valleys

29. Workbench

Workbench

Description

The workbench is used to craft items and weapons. The Player can interact with the workbench to bring up the UI menu to craft items.

Locations used:

  1. Moorlands
  2. Forest
  3. Meadows
  4. Caves
  5. Canyons
  6. Valleys

GDD - Locations - Tilesets

Tilesets are used for the repeatable environment. This is the order of layers to form a location.

  1. Flooring
  2. Pits
  3. Platforms
  4. Borders

1. Flooring

Flooring

Flooring is the bottom layer of a room painted using a collection of tiles per location.

Examples:

  1. Grass
  2. Sand
  3. Hard Ground
  4. Snow

2. Pits

Pits

Pits are the second layer of a room painted using a collection of tiles per location. If the Player moves into a pit, they fall down, so the requirement is to avoid.

3. Platforms

Platforms are the third layer of a room painted using a collection of tiles per location. Platforms are raised from the floor and the Player can go up and down to these platforms via accessible steps.

Platforms

4. Borders

Borders

Borders are the fourth layer of a room painted using a collection of tiles per location. Borders are used to block the outer perimeter of a room and keep the player in the boundaries/confines of the world.

Examples:

  1. Rocks
  2. Boulders
  3. Pebbles
  4. Underbrush

GDD - Locations - Types

Tribe of the Accord supports 8 location types as part of the full game, with subset locations (Such as Ringpeak Camp) that use an existing location theme. Having different themed locations is important for enhancing the player's experience and engagement. Diverse environments provide a sense of exploration and discovery, keeping the gameplay fresh and exciting as players progress through various landscapes. This diversity allows for more creative level design and can help in building a more immersive and believable game world.

Location Overview

Format: LocationNameInGame (SimplifiedName)

1. Bouldermoor

Bouldermoor is a location characterized by rolling hills covered in heather and moss, with patches of wetland and scattered rocks.

Bouldermoor

1.0.1 - Theme

  • Rolling hills
  • Heather and moss
  • Wetlands
  • Scattered rocks

1.0.2 - Tile-sets

  • Heather-covered ground
  • Moss patches
  • Wetland areas
  • Rocky terrain

1.0.3 - Props

  • Primitive stone huts with thatched roofs
  • Campfires with stone-age tools and weapons
  • Animal tracks in the soft earth
  • Sparse, leafless trees

1.1. Ringpeak Camp

The Ringpeak Camp is a location used for A, B, C. It is designed to be D, E, F.

Ringpeak Camp

1.1.1 - Theme

  • Same as Moorlands

1.1.2 - Tile-sets

  • Same as Moorlands

1.1.3 - Props

  • Coned Tents
  • Storage Container
  • Workbench
  • Hearth
  • SignPost Home

2. Wisty Woodlands

Wisty Woodlands is a dense forest filled with oak trees, mossy rocks, hedges, and bushes.

Wisty Woodlands

2.0.1 - Theme

  • Dense forest
  • Oak trees
  • Mossy rocks
  • Thick underbrush

2.0.2 - Tile-sets

  • Forest floor with fallen leaves
  • Mossy patches
  • Dirt paths
  • Tree bases

2.0.3 - Props

  • Primitive wooden huts
  • Fallen logs
  • Thick vines hanging from trees
  • Various forest plants and fungi

2.1. Adira's Hideout

Adira's Hideout is a secluded area within the Wisty Woodlands, perfect for serenity and gathering one's thoughts during difficult times.

Adira's Hideout

2.1.1 - Theme

  • Secluded
  • Hidden treasures
  • Secretive

2.1.2 - Tile-sets

  • Dense underbrush
  • Hidden paths
  • Camouflaged ground

2.1.3 - Props

  • Secret caches
  • Concealed entrances
  • Camouflage materials
  • Traps and pitfalls

3. Meadowhenge

Meadowhenge is a serene meadow with rolling hills, wildflower meadows, and gentle streams.

Meadowhenge

3.0.1 - Theme

  • Lush meadows
  • Wildflowers
  • Rolling hills
  • Streams

3.0.2 - Tile-sets

  • Grass-covered ground
  • Flower patches
  • Stream beds
  • Meadow terrain

3.0.3 - Props

  • Wooden bridges
  • Berry bushes
  • Butterflies and insects
  • Small ponds

4. Stonecradle Caves

Stonecradle Caves is a mysterious and ancient cave system with dark, winding tunnels and underground water bodies.

Stonecradle Caves

4.0.1 - Theme

  • Dark caves
  • Winding tunnels
  • Underground lakes
  • Stalagmites and stalactites

4.0.2 - Tile-sets

  • Rocky cave floor
  • Wet, mossy patches
  • Underground water bodies
  • Cave walls

4.0.3 - Props

  • Stone-age carvings
  • Primitive tools
  • Hidden chambers
  • Bioluminescent plants

5. Ribble Valleys

Ribble Valleys is a lush, serene landscape with rolling hills, wildflower meadows, and flowing streams.

Ribble Valleys

5.0.1 - Theme

  • Rolling hills
  • Wildflower meadows
  • Flowing streams
  • Lush vegetation

5.0.2 - Tile-sets

  • Green grass
  • Wildflower patches
  • Smooth river stones
  • Dirt paths

5.0.3 - Props

  • Small wooden huts
  • Wooden benches
  • Vegetable gardens
  • Animal pens

5.1. Falls Tribe Village

Falls Tribe Village is a vibrant community set near waterfalls with lush greenery and wooden structures.

Falls Tribe Village

5.1.1 - Theme

  • Waterfalls
  • Lush greenery
  • Community village
  • Wooden structures

5.1.2 - Tile-sets

  • Grass and dirt flooring
  • Wooden walkways
  • Water bodies
  • Cliff edges

5.1.3 - Props

  • Wooden huts
  • Water wells
  • Market stalls
  • Community fire pits

6. Cavebear Canyons

Cavebear Canyons is a rugged, arid landscape characterized by towering sandstone cliffs and eroded rock formations.

Cavebear Canyons

6.0.1 - Theme

  • Rugged canyons
  • Sandstone cliffs
  • Eroded rocks
  • Sandy desert

6.0.2 - Tile-sets

  • Desert flooring
  • Sandstone cliffs
  • Rocky outcrops
  • Cracked earth

6.0.3 - Props

  • Cacti
  • Dry shrubs
  • Tumbleweeds
  • Ancient petroglyphs

7. Shadow Forest

Shadow Forest is a dark, mysterious woodland filled with gnarled, twisted trees and thick underbrush.

Shadow Forest

7.0.1 - Theme

  • Dark woodland
  • Twisted trees
  • Thick underbrush
  • Eerie fog patches

7.0.2 - Tile-sets

  • Dark, damp soil
  • Mossy ground
  • Fallen leaves
  • Tree bases

7.0.3 - Props

  • Poisonous mushrooms
  • Creepy stone statues
  • Thick vines
  • Large, dark boulders

8. Ibex Mountains

Ibex Mountains is a rugged, majestic terrain with towering pine trees, rocky cliffs, and snow patches.

Ibex Mountains

8.0.1 - Theme

  • Rugged terrain
  • Pine trees
  • Rocky cliffs
  • Snow patches

8.0.2 - Tile-sets

  • Rocky ground
  • Snow-covered areas
  • Pine tree bases
  • Cliff edges

8.0.3 - Props

  • Mountain huts
  • Small mountain streams
  • Alpine flowers
  • Caverns or caves

GDD - Items

Cover Image

SectionDescription
OverviewThis Game Design Document (GDD) provides a comprehensive blueprint of the items in the game Tribe of the Accord.
StatusReady
Version2.0

Description

Items play an important role in the game. They can be collected by the player by walking over them and are spread throughout the map, usually found by cutting down bushes, opening chests, or defeating enemies.

What will the items be used for?

Items allow players to restore health and/or provide temporary buffs or debuffs.


This section is not yet finalized in the design phase, but items could be divided into four categories:

  1. Consumables - Items that can be cooked and/or consumed for health restoration or buffs/debuffs.
  2. Equippables - Items that can be equipped to provide various bonuses.
  3. Exchangeables - Items that can be exchanged as currency to obtain other items.
  4. Key Items - Permanent items related to abilities or the storyline.

Consumables

Consumables (which also function as cookables since they are food items) will be classified into four types: health restoration, stamina regeneration, attack power, and specials.

  1. Health Restoration - These food items will allow Adira to restore health.
  2. Stamina Regeneration - These food items will increase Adira's stamina regeneration.
  3. Attack Power - These food items will enhance Adira's attack power.
  4. Specials - These will apply special effects to any food consumed.

Meat

All meat items will provide some variation of health restoration.

NameDescriptionEffect - RawEffect - Cooked
Small Meat Small Meat CookedSmall Meat: Meat from small animals like rabbits, snakes, or bats.5 HP Instant Increase15 HP Instant Increase
Medium Meat Medium Meat CookedMedium Meat: Meat from medium-sized animals like boars, wolves, or ibexes.10 HP Instant Increase30 HP Instant Increase
Large Meat Large Meat CookedLarge Meat: Meat from large animals like rhinos or bison.20 HP Instant Increase60 HP Instant Increase

Berries

All berries will provide some variation of stamina regeneration boost.

NameDescriptionEffect - RawEffect - Cooked
BlackberriesBlackberries: Obtained from certain shrubs or exchanged at shops.1% faster stamina regeneration for 10 seconds3% faster stamina regeneration for 30 seconds
RosehipberriesRosehipberries: Obtained from certain shrubs or exchanged at shops.3% faster stamina regeneration for 10 seconds9% faster stamina regeneration for 30 seconds
StrawberriesStrawberries: Obtained from certain shrubs or exchanged at shops.5% faster stamina regeneration for 15 seconds15% faster stamina regeneration for 45 seconds

Herbs

All herbs will provide some variation of attack power boost.

NameDescriptionEffect - RawEffect - Cooked
ChicoryChicory: Found in herb clusters along cave walls or tree trunks.2% higher attack power for 10 seconds6% higher attack power for 30 seconds
NettlesNettles: Found in herb clusters along cave walls or tree trunks.4% higher attack power for 10 seconds12% higher attack power for 30 seconds
HorseradishesHorseradishes: Found in herb clusters along cave walls or tree trunks.6% higher attack power for 15 seconds18% higher attack power for 45 seconds

Specials (T)

Specials provide buffs, debuffs, or a combination of both for the above items.

NameDescriptionEffect - RawEffect - Cooked
Ginger RootGinger Root: Obtained from ginger plants.+3% attack power, +3% faster stamina regeneration+9% attack power, +9% faster stamina regeneration
PearPear: Obtained from pear plants.+3% health increase, +3% faster stamina regeneration+9% health increase, +9% faster stamina regeneration
HazelnutHazelnut: Obtained from hazelnut plants.+3% health increase, +3% faster stamina regeneration+9% health increase, +9% faster stamina regeneration
Grey Oyster MushroomGrey Oyster Mushroom: Found in weedy mushroom growths.+20 HP, +1 HP/sec regen for 10 seconds, -5% attack power+60 HP, +1 HP/sec regen for 30 seconds, -15% attack power
Field MushroomField Mushroom: Found in marshy mushroom growths.+12.5% stamina regeneration, -5% attack power+37.5% stamina regeneration, -15% attack power
Truffle MushroomTruffle Mushroom: Found in dark mushroom growths.+12.5% attack power, -20 HP+37.5% attack power, -80 HP

Cooking System:

The cooking system is a combination of summing and multiplying the ingredients.

Assume [i] is a standard ingredient and [s] is a special ingredient:

Output = (Σ[i]) × (Σ[s])

GDD - Quests

Work in progress

GDD - Replayability

Work in progress

GDD - Music

Work in progress

GDD - SFX

Work in progress

GDD - UI/UX

Work in progress

GDD - VFX

Work in progress

GDD - Visuals

Work in progress

GDD - Weapons

Cover Image Weapons

SectionDescription
OverviewThis Game Design Document (GDD) aims to provide a comprehensive blueprint of all the supported weapons in the game Tribe of the Accord.
StatusReady for Adoption
Version1.0

Description

Weapons will be unlocked and upgraded throughout the game via narrative scenarios.

Supported Weapons in Game

These are the weapons that get unlocked and upgraded through progression:

  1. Unarmed (Default)
  2. Spear
  3. Axe

Example Unlock and Upgrade

  1. Player unlocks the Spear at the beginning of the game 'Spear' in the first scene.
  2. Player can unlock new abilities related to that weapon, such as the option to 'Throw' spears.

Weapon attributes

These attributes are configured at the Weapon and Variant level.

  • Weapon: Name of the Weapon
  • Attack Speed: How quick to execute an attack
  • Health Damage: How much health damage is dealt
  • Poise Damage: How much poise damage is dealt that can result in stagger
  • Range: The distance of the weapon's attack
  • Block Efficiency: How good is the weapon at blocking and taking damage
  • Stealth Multiplier: How multiplied damage can be dealt when sneaking up on a target
  • Special: What type of special attack is available

1. Unarmed

Unarmed

  • Player uses their hands and feet
  • Very limited range
  • Damage is very limited
  • 3 consecutive attacks
    • Right punch
    • Left punch
    • Roundhouse kick
  • Cooldown period after series of attacks executed

1.1. Abilities/Upgrades

  • N/A

2. Spear

Spear

  • Player taps attack button, and it does a basic lunge attack.
  • Alternatively, Player holds attack button and this charges a bar, then releases a spear lunge with both hands.
  • Enemies positioned at full extension of the spear, results in more damage.
  • Cooldown period after attack

2.1. Abilities/Upgrades

  1. Throw Spear
  2. Pole Vault
  3. Hookshot

2.1.1. Throw Spear

  • Throwing weapon with 360 degree aiming capabilities
  • Throw but then have to retrieve it scenarios:
    1. the player misses, and it sticks into the ground.
    2. the player hits an enemy, and it sticks into the enemy.
    3. the player hits a destructable item, it will break it.
    4. the player throws it and it falls down a pit, it appears back in inventory.
    5. the player throws it and lands in a unobtainable place, it appears back in inventory.

3. Axe

Axe

  • One handed swing of an axe.
  • 3 consecutive attacks
    • Right swing
    • Left swing
    • Top down swing
  • Cooldown period after series of attacks executed

3.1. Abilities/Upgrades

  1. Boomerang
  2. Heavy Attack 1
  3. Heavy Attack 1

Level Design

Level design is crucial for a top-down 2D action-adventure game as it directly influences gameplay, player engagement, and the overall experience. Here’s a summary of its importance:

  1. Guiding Player Progression: Effective level design shapes how players navigate through the game world. It balances exploration with directed paths, ensuring players can progress while also discovering secrets and rewards.

  2. Enhancing Gameplay Mechanics: The layout and structure of levels are designed to complement and challenge core gameplay mechanics, such as combat, puzzle-solving, and exploration. Well-designed levels create opportunities for players to utilize their skills in varied and engaging ways.

  3. Creating Immersive Environments: Even in 2D, level design plays a key role in building immersive and cohesive game worlds. The visual and thematic consistency across levels, along with dynamic elements like lighting and interactive objects, helps to draw players into the game’s narrative and atmosphere.

  4. Balancing Difficulty and Pacing: Proper level design ensures a smooth difficulty curve, introducing new challenges and enemies progressively. It also manages the pacing of the game, alternating between intense action sequences and quieter moments of exploration or story development to keep players engaged.

  5. Encouraging Exploration and Replayability: Good level design encourages players to explore every corner of the map, rewarding curiosity with hidden areas, collectibles, or narrative pieces. This not only enhances the player’s experience but also adds replay value as players return to discover missed content.

  6. Supporting Storytelling: In action-adventure games, the environment often tells a story. Level design integrates visual storytelling elements, such as environmental details, character placements, and scripted events, to convey the narrative without relying solely on dialogue or cutscenes.

Level Design Principles

Level design is the practice of planning and building spaces for video games

Flow & Navigation

Ensure that the player can move smoothly through levels without feeling lost. Use subtle visual cues like landmarks and lighting to guide the player.

Pacing

Balance combat, exploration, and puzzle-solving in a way that maintains player interest and challenge without overwhelming them.

Exploration & Secrets

Encourage exploration by including hidden areas, secret rooms, and unlockable shortcuts that reward the player for being curious.

Combat Zones

Design distinct areas where combat is likely to happen. Ensure there's enough space for movement and dodging, while obstacles or terrain can add complexity to combat.

Clear Objectives

Always make the player's goal clear, whether it’s defeating enemies, solving a puzzle, or finding an item. Use UI elements sparingly to avoid disrupting immersion.

Meaningful Backtracking

Allow players to revisit areas with new abilities or items, unlocking previously inaccessible zones. This adds depth to exploration.

Environmental Storytelling

Let the environment tell a story. Use level elements like ruins, clutter, and weather effects to hint at the world’s history and lore.

Visual Variety

Each area should have a unique look or theme (biomes/locations) to keep the player engaged. Different visuals also aid in navigation and memory.

Progressive Difficulty

Gradually introduce harder enemies, more complex puzzles, and trickier platforming. Each new area should build on the player's acquired skills.

Tight Enemy Placement

Position enemies in a way that makes combat interesting without overwhelming the player. Use environmental hazards and traps to create more dynamic encounters.

Dynamic Puzzle Design

Include puzzles that aren’t too abstract, but challenge the player to use logic or game mechanics creatively. These should integrate with the world seamlessly.

Player Agency

Allow the player to approach challenges in different ways, whether it’s choosing how to fight enemies or the order in which they explore.

Shortcuts & Fast Travel

Include shortcuts or teleport points that make it easier to traverse areas quickly after clearing them, reducing unnecessary backtracking.

Progression Feedback

Give clear feedback when the player progresses, such as unlocking a passage, obtaining a new item, or defeating a boss. These moments should feel rewarding.

Cohesive World Design

The world should feel interconnected, with logical transitions between different areas. Each zone should feel like it fits into a larger world.

Level Design - Getting Started

This is the typical order of designing a new Level.

  1. Pre-production: plan out the big ideas and overall experience design.
  2. Combat: Define how player(s) and enemy types interact.
  3. Layout: sketch a visual top-down 2D plan for a level.
  4. Blockout: build a basic in-game 2D rough draft and playtest it.
  5. Scripting: integrate events and behaviors (missions, quests, doors, buttons, AI)
  6. Environment Art: "art pass" the level with props and set dressing
  7. Release: document, play test, and publish the project/demo.

Level Design - Creating Levels

World Map

This shows the World map of Tribe of the Accord and the location of where the chapters take place.

World Map

Follow this guide to understand how to create levels.

Structure

1. Understand how the levels are structured

Generate

2. Now let's generate the boilerplate code to create the structure.

Build

3. With the changes in place, we can now design levels.

Level Design - Creating Levels

World Map

This shows the World map of Tribe of the Accord and the location of where the chapters take place.

World Map

Follow this guide to understand how to create levels.

Structure

1. Understand how the levels are structured

Generate

2. Now let's generate the boilerplate code to create the structure.

Build

3. With the changes in place, we can now design levels.

Level Design - Structure

When creating levels, there are 4 associated components to achieve a playable solution.

Structure

Version 2 (As of Sep 2024)

Changelog

  • Concepts of 'Rooms' has been removed.
  • MoveRoomTrigger has been renamed to MoveLevelTrigger.
  • There are 4 Components instead of 5.
  • Removed Tween nodes, we can use create_tween instead.
  • All Levels inherit from a Base Level Scene based on the below
  • Procedural Generation levels are being scrapped in favour of hand made/linear levels.

Version 1 (Deprecated) (Pre Sep 2024)

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.
  1. Room
  2. Level
  3. Level Chunk
  4. World
  5. Chapter

Level Design - Structure

When creating levels, there are 4 associated components to achieve a playable solution.

Structure

Version 2 (As of Sep 2024)

Changelog

  • Concepts of 'Rooms' has been removed.
  • MoveRoomTrigger has been renamed to MoveLevelTrigger.
  • There are 4 Components instead of 5.
  • Removed Tween nodes, we can use create_tween instead.
  • All Levels inherit from a Base Level Scene based on the below
  • Procedural Generation levels are being scrapped in favour of hand made/linear levels.

Version 1 (Deprecated) (Pre Sep 2024)

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.
  1. Room
  2. Level
  3. Level Chunk
  4. World
  5. Chapter

Level Design - Creating Levels

1 - Level

This is where we hold all background & foreground layers, tiles, props, enemies and the player instance.

Node Tree

Level // Root Node for Level
	MoveLevelTrigger // outer boxes that trigger a move to another level (Formerly MoveRoomTrigger)
	Background // Container for background assets (Node2D) e.g. Distant artwork/parallax views
	Flooring // Container for flooring tilesets to paint the floor (Node2D)
		Grass // Tileset for Grass/Sand/Snow
		Pits // Pit Tilesets
	Platforms // Used to add Platforms/Cliffs on top of the floor (Node2D)
		PlatformWalls // Used to paint the platform tileset
		PlatformFlooring // Used to paint higher level flooring
		PlatformCollisions // Smaller tiles to paint collisions
	Borders // Used to create border perimeters to keep Player in (Node2D)
		Closed // Tileset version of a fully closed level
		Open // Tileset version of a fully open level
	YSort // Where we place all props & enemies
		Enemies // Where we add all enemies (YSort)
		Items // Where we add all items(YSort)
		Props // Where we add all props (YSort)
		Player // This is where the Player is placed (KinematicBody2D)
	Foreground // Container for foreground assets (Node2D) e.g. Closer Bushes/Trees to add depth
	Navigation // Where we add Navigation Polygons

Layers of a Level

Background

A Background can be used to draw a background scenic view or can simply be the underlay of the flooring - in this case; Water.

Background

Or it could be used for a scenic view (Unofficial background asset used for illustrative purposes)

Scenic Background

Flooring

Flooring sits above the background and is typically used to paint the floor tileset - in this case; Grass.

Flooring

Pits usually sit on top of the flooring but sit inside the Flooring layer node.

Flooring Pits

Platforms

Platforms are in-land and are raised levels where a Player can climb/walk up or drop down from.

Platforms

Borders

Borders simply border the level to avoid the Player from escaping. It comes with collisions as standard.

Borders

Borders are only to be used on the outside perimeter of the world.

YSort

YSort

Foreground

We can add additional layers in the foreground to give the level more dimension, so it doesn't feel as flat.

Foreground

Code Location

The goal is to share levels across Chapters as much as possible, however we need the flexibility to scope to chapters and identify differences.

tribe-of-the-accord/
	src/
		Levels/
			Level(0_0).tscn // (if shared across Chapters)
			Level(0_0).gd // (some levels will need there own functionality)
			Level(0,0).test.gd
			Chapter_001/
				Level(12,0).tscn // (if scoped to a specific Chapter)
				Level(12,0).gd // (if scoped to a specific Chapter)
				Level(12,0).test.gd // test to check the scene

Template

These are the files used to generate the source code above 'Code Location'

tribe-of-the-accord/
	src/
		TemplatesLevels/ // None of these files are to be used directly, they should be created by the ChapterGenerator
			AbstractLevel.tscn // This is the scene that all other templates 'Inherit' from.
			TemplateLevelForest.tscn // This is the template scene for the Forest Biome
			TemplateLevelMoorlands.tscn // This is the template scene for the Moorlands Biome
			TemplateLevelMeadows.tscn // This is the template scene for the Meadows Biome
			TemplateLevelCaves.tscn // This is the template scene for the Caves Biome
			

Level Design - Creating Levels

2 - Level Chunk

This is a collection of Levels that form the entire available space allocated in memory. This allows us to limit the number of levels we load into memory and use a fading transition to move to a new chunk of levels.

Guidelines

When designing the levels, consider the following:

Balanced Chunks

Ensure that the level chunks you build have a well balanced number of levels inside.

  • Too small is wasteful as we have to sarcrifice seamless movement through the levels.
  • Too large feels seamless to the player, but performance suffers with every level we add.

Level Chunk

There's no strict number of levels per chunk, but we should consider how well the level performs.

1x1 Levels (Avoid)

Our original design was to use levels the same size of the screen with a fixed camera that would pan to the next level when reaching the edge of that level. We want to avoid this as it makes the world feel too clinical and less seamless.

Level Chunk

NxN Levels (Advised)

  • Our new design is to provide variety of level sizes to provide more room to breathe and fight more enemies, but still supporting single levels for more intimate moments.
  • You need to ensure that the coordinates are always correct. E.g. as shown in the image example below, if you design a level at grid coordinate (1, 0) - and it's a 4x4 sized room, this means it would take over the coordinates:
    • 1, 0
    • 2, 0
    • 1, 1
    • 2, 1
  • If a single sized level, the camera will be fixed.
  • If a NxN sized level, the camera will follow the player in the boundaries of that level.

Level Chunk

Node Tree

LevelChunk_001 // Root Node for LevelChunk LevelChunk_XXX (Based on Chapter)
	Levels // Container for all Levels
		Level(0_0) // Needs to map to the world grid coordinates (1 - Level)
		Level(1_0) // (Coord Vector2(1, 0))
		Level(2_0) // (Coord Vector2(2, 0))

Code Location

tribe-of-the-accord/
	src/
		LevelChunks/
			LevelChunk_001.tscn // Chapter 1 -   first loaded chunk
			LevelChunk_001_2.tscn // Chapter 1 - second loaded chunk
			LevelChunk_001_3.tscn // Chapter 1 - third loaded chunk
			LevelChunk_002.tscn // Chapter 2 - third loaded chunk

Template

These are the files used to generate the source code above 'Code Location'

tribe-of-the-accord/
	src/
		TemplatesLevelChunks/ // None of these files are to be used directly, they should be created by the ChapterGenerator
			AbstractLevelChunk.tscn // This is the scene that all other templates 'Inherit' from.
			TemplateLevelChunk.tscn // This is the template scene to create Level Chunk scenes

Level Design - Creating Levels

3 - World

This is the controller of many level chunks which coordinates the tear down and instantiation of a new Level Chunk.

Node Tree

World_001 // Root Node for World World_XXX (Based on Chapter)
	GameplayCamera // Used to follow the Player/Pan to a new Level
	DebugCamera // Used for debugging (Roaming around Map in Debug mode)
	LevelChunks // Container for adding/removing Level chunks and transitioning/fading between
		// You would only have 2 chunks at any one time that are freeing or creating then swapping
		LevelChunk_001 // Instantiated Chunk (2 - Level Chunk)
		LevelChunk_002 // Instantiated Chunk (2 - Level Chunk)
	LootGenerators // Used to generate random items from Bushes and Chests
	LevelChunkCoordinator // Used to coordinate the swap out of level chunks
	FadeEffect // Used to fade in or out to Black (LevelChunk swapping)
	DayNightCycle // Controls the visual time of day in the game

Code Location

tribe-of-the-accord/
	src/
		Worlds/
			World_001.tscn // Chapter 1 World
			World_002.tscn // Chapter 2 World
			World_003.tscn // Chapter 3 World
			World_004.tscn // Chapter 4 World
			// ...

Template

These are the files used to generate the source code above 'Code Location'

tribe-of-the-accord/
	src/
		TemplatesWorlds/ // None of these files are to be used directly, they should be created by the ChapterGenerator
			AbstractWorld.tscn // This is the scene that the World template 'Inherits' from.
			TemplateWorld.tscn // This is the template scene used to create World scenes

Level Design - Creating Levels

4 - Chapter

This manipulates the World node and controls the narrative/beats of the Game.

Node Tree

Chapter_001 // Root Node for Chaper Chapter_XXX (Based on Chapter)
	WorldContainer // Container for Worlds
		World // (3 - World)
	Audio // Container for Audio cues
		Ambience // Ambience of the environment
		MainMusic // Main Cue music for the chapter in question
	FadeEffect // Used to fade in or out to Black as part of the Narrative scene

Code Location

tribe-of-the-accord/
	src/
		Chapters/
			Chapter_001.tscn // Chapter 1 World
			Chapter_001.gd 
			Chapter_002.tscn // Chapter 2 World
			Chapter_002.gd
			Chapter_003.tscn // Chapter 3 World
			Chapter_003.gd
			Chapter_004.tscn // Chapter 4 World
			Chapter_004.gd
			// ...

Template

These are the files used to generate the source code above 'Code Location'

tribe-of-the-accord/
	src/
		TemplatesChapters/ // None of these files are to be used directly, they should be created by the ChapterGenerator
			AbstractChapter.tscn // This is the scene that the Chapter template 'Inherits' from.
			TemplateChapter.tscn // This is the template scene used to create Chapter scenes

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

1 - Room (Deprecated)

This is where we hold all tilemaps/props/enemies and the player

Node Tree

Room // Root Node for Level
	MoveRoomTrigger // outer boxes that trigger a move to another room
	Flooring // Tileset to paint the floor
	Overlay // Used to overlay shadows or pits
	Platforms // Used to add Platforms/Cliffs on top of the floor
	Borders // Used to create border perimeters to keep Player in
	YSort // Where we place all props & enemies
		Enemies // Where we add all enemies
		Player // This is where the Player is placed
	Navigation // Where we add Navigation Polygons
	Tween // Used to do Tweens

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

1 - Room (Deprecated)

This is where we hold all tilemaps/props/enemies and the player

Node Tree

Room // Root Node for Level
	MoveRoomTrigger // outer boxes that trigger a move to another room
	Flooring // Tileset to paint the floor
	Overlay // Used to overlay shadows or pits
	Platforms // Used to add Platforms/Cliffs on top of the floor
	Borders // Used to create border perimeters to keep Player in
	YSort // Where we place all props & enemies
		Enemies // Where we add all enemies
		Player // This is where the Player is placed
	Navigation // Where we add Navigation Polygons
	Tween // Used to do Tweens

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

2 - Level (Deprecated)

This is a wrapper of a Room.

Node Tree

Level // Root Node for Level
	Room // Node that contains all of the Props/Tiles (1 - Room)
	Tween // Used to do Tweens

Location

tribe-of-the-accord/
	src/
		Levels/

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

3 - Level Chunk (Deprecated)

This is a collection of Levels that form the entire available space allocated in memory.

Node Tree

LevelChunk_001 // Root Node for LevelChunk LevelChunk_XXX (Based on Chapter)
	Levels // Container for all Levels
		Level(0_0) // Needs to map to the world grid coordinates (2 - Level)
		Level(1_0) // Needs to map to the world grid coordinates (2 - Level)
		Level(2_0) // Needs to map to the world grid coordinates (2 - Level)
	Tween

Location

tribe-of-the-accord/
	src/
		LevelChunks/

Template

tribe-of-the-accord/
	src/
		TemplatesLevelChunks/

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

4 - World (Deprecated)

This is the controller of many level chunks which coordinates the tear down and instantiation of a new Level Chunk.

Node Tree

World_[Name] // Root Node for World World_XXX (Based on Chapter)
	GameplayCamera // Used to follow the Player/Pan to a new Level
	DebugCamera // Used for debugging (Roaming around Map in Debug mode)
	LevelChunks // Container for adding/removing Level chunks and transitioning/fading between
		LevelChunk_001 // Instanciated Chunk (3 - Level Chunk)
	LootGenerators // Used to generate items from Bushes and Chests
	Tween
	LevelChunkCoordinator
	FadeEffect
	DayNightCycle

Location

tribe-of-the-accord/
	src/
		[Name]World.tscn

Level Design - Creating Levels

This version is shown for reference only and is still in use, but the recommendation is to use Version 2 for all Level Design.

5 - Part (Deprecated)

This manipulates the World node and controls the narrative/beats of the Game.

Node Tree

Part_Name // Root Node for Part Part_[Name] (Based on Chapter)
	World // Container for Worlds
		World_Tutorial // (4 - World)
	Audio // Container for Audio cues
		Ambience // Ambience of the environment
		MainMusic // Main Cue music for the chapter in question
	FadeEffect

Generate Boilerplate

There is a directory in helpers called ChapterGenerator.

  1. Open the scene helpers/ChapterGenerator/ChapterGenerator.tscn and run it.

Generator Scene

  1. Choose the Chapter you want to build and the Location/Biome assets you want to use. This will generate the following if you choosed to create Chapter 001:
src/Levels/ // (x3) just to get you started
	Chapter_001
		Level(0_0).tscn // copied from one of the level templates in 'src/TemplatesLevels'
		Level(0_0).gd
		Level(1_0).tscn // copied from one of the level templates in 'src/TemplatesLevels'
		Level(1_0).gd
		Level(2_0).tscn // copied from one of the level templates in 'src/TemplatesLevels'
		Level(2_0).gd

src/LevelChunks
	LevelChunk_001.tscn // copied from 'src/TemplatesLevelChunks/TemplateLevelChunk.tscn'
	LevelChunk_001.gd
	LevelChunk_001.test.gd

src/Worlds
	World_001.tscn // copied from 'src/TemplatesWorlds/TemplateWorld.tscn'
	World_001.gd

src/Chapters
	Chapter_001.tscn // copied from 'src/TemplatesChapters/TemplateChapter.tscn'
	Chapter_001.gd
  1. You should now be able to open Chapter_001.tscn and it should work.

Building Levels

Work in progress

Level Design Documents

This is a collection of level design documents that explain the sequence of events per chapter but more oriented to the level design. This is more the low level implementation based on the reference of its respective narrative document - they should compliment each other.

For example:

LDD - Chapter 1

Chapter 1

  • Title: A New Dawn
  • Description: Adira chases a deer
  • Duration: 7m
  • Reference: src/LevelDesign/Chapter1Level.tscn

1. Description

1.1. Restrictions

  1. Level must be located by the Campsite and Moorlands
  2. Quest/day must start with Adira's introduction
  3. Player must be introduced to:
    • Basic Commands (Movement, Attack, Roll)
    • Charge Attack
    • Basic enemies (Ant, Ant2)
    • Platforming
  4. Player must chase the Deer
  5. Player must fail the hunt.
  6. Torion must be introduced.
  7. Existence of other tribesmen must be presented.

1.2. Goals

  1. Introduction of basic commands
  2. Include many optional rewards (hidden in bushes)
  3. Introduce Leaf Carpet mechanic
  4. Help the player become more familiar with overall controls and roll ranges.
  5. Make an engaging chase scene.
  6. Teach the player that Adira's moveset will be unlocked and improved throughout the game.

1.3. List of Scenes

  1. Chapter start
  2. Deer reappears, then jumps through a big hole.
  3. Tribesmen introduction. [suggestion] Hunting other animals by using Charge Attack.
  4. [optional] Second tribesmen scene where Adira observes and learns how to use the Charge Attack.
  5. Deer platform chase start
  6. End of chase scene. [Suggestion] Adira fails to capture the deer, and Torion shows up.

2. Setting

2.1. Locations - World Areas

  1. Campsite
  2. Moorlands

2.2. Time of Day

  1. Chapter start: Morning
  2. After deer chase ends: Afternoon

3. Resources

3.1. Enemy List

  1. meleeBasic
  2. meleeBasic2

3.2. Hazard List

  1. Leaf Carpet
  2. Pitfalls
  3. Regular bushes
  4. Treasure bushes (can be replaced by chests)

3.3. Collectibles

  1. None

4. Walkthrough

layout

4.1. Deer Scene 1 - Adira Introduction

campsite
Goal: Introduce Adira to the player and establish the starting point of her journey.

Cutscene

The chapter begins with a cinematic introduction showcasing a camera pan through the moorlands from the right to left, then focusing on a deer grazing the soil. Suddenly, Adira charges at the Deer with her spear raised from inside a bush (Bush particles disperse as does sound of rustling), spooking the deer away. Once the deer is no longer in sight, the player is free to roam the area.

Gameplay Mechanics Unlocked:

  • Basic Attack
  • Rolling
  • Toggle Menu

Dialogue/Internal Monologue

After the deer has fled:

  • Adira (internal monologue): “A buck this size... it’s rare to see one here.”
  • Adira (internal monologue): “Torion’s traps may catch birds and hares, but a deer like this will keep us fed for days.”

4.2. Attack Tutorial

moorlands

Goal: Teach the player how to use the Basic Attack in a safe environment.

Room Description:
The player is introduced to an enemy standing behind a bush that blocks their path. To progress, the player must use their Basic Attack to clear the bush.

HUD Prompts

  • “Press [Key] to attack.”

Cutscene

N/A

Dialogue/Internal Monologue

N/A

4.3. Room 3

moorlands

Goal: Encourage exploration and present opportunities for players to discover "roll over pits" as a mechanic before the tutorial.

Room Description:
This larger room provides a linear path, filled with possible shortcuts for players who experiment with the roll mechanic over pitfalls. Hidden rewards incentivize exploration, while a stronger enemy is introduced to raise the stakes.

Key Features:

  • Optional exploration paths
  • Rewards for exploring the roll action
  • A tougher enemy that takes more hits to be defeated (Rabbit)

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

  • “Press [Key] to roll.”

4.4. Deer Scene 2 - Jumps Through Hole

moorlands
Goal: Advance the narrative by presenting the deer as the player's target and presenting a pitfall that is too large to roll across.

Cutscene

A cinematic plays where Adira spots the deer and sets her sights on it. Adira sprints towards the Deer again but the deer escapes by jumping across a wide gap, forcing Adira to find an alternate route. This event highlights Adira's determination and resourcefulness despite her lack of experience as a hunter.

Dialogue/Internal Monologue

  • Adira (internal monologue): “There it is!"

Once the Deer has cleared the long gap.

  • Adira (internal monologue): "(Sigh) Too far to jump. I need to find another way.”

4.5. Rolling Over Pits Tutorial

moorlands

Goal: Teach the roll over pitfalls mechanic in a controlled and visually clear setting.

Room Description:
This room features a straightforward design where rolling over a pit is required to progress. There will be 2 Ant enemies.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A

4.6. Room 5

moorlands

Goal: Introduce a combination of combat and rolling mechanics. Players must be encouraged to plan ahead while getting more comfortable with multiple inputs in a short period of time.

Room Description:
Enemies are strategically placed to activate only when the player moves closer, requiring them to roll over pits to engage.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A

4.7. Room 7 - Leaf Carpet Introduction

moorlands
Goal: Introduce the Leaf Carpet mechanic in an easy-to-read environment.

Room Description:
This room focuses on teaching the player how Leaf Carpets work, with clear visual indicators and no external threats.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A - It's very obvious and would be otherwise spoonfeeding the player.

4.8. Room 8 - Leaf Carpet 2

moorlands
Goal: Reinforce Leaf Carpet mechanics by slightly increasing the challenge.

Room Description:
The room requires players to use multiple Leaf Carpets in a short period of time. This helps them better understand the timing and reinforces the visual differences between the tiles.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A

4.9. Room 9 - Tribesmen Scene - Introduction

moorlands

Goal: Introduce the tribesmen and foreshadow the Charge Attack mechanic.

  • Leaf Carpet + Rolling
  • Leaf Carpet + Combat
  • Rolling + Leaf Carpet

Cutscene

A cinematic shows Adira observing tribesmen from afar. Two men are looking after an injured boy. Once they leave, Adira must traverse platforms, by the time she gets to their location, they have gone.

Dialogue/Internal Monologue

Camera pans to the tribespeople (2 males & a boy) in the top right who are nursing their injured son.

  • Adira (internal monologue): "A tribe... why are they here?"
  • Adira (internal monologue): "And what's happened to that boy?"

Pans back to Adira

  • Adira (internal monologue): "I can’t let the deer get away.”
  • Adira (internal monologue): "Torion will be so mad.”

HUD Prompts

N/A

4.10. Room 10 - Breakable Object Scene - Charge Attack Intro

moorlands

Goal: Introduce the Charge Attack through a breakable obstacle.

Room Description:

Adira comes into a room that has an obstacle in the way. A simple Spear tap attack won't be enough to break through it, so the Player has to work out that the charge and release attack is the only way to break it down. When using the simple tap attack, the obstacle simply shudders and remains in tact.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A

4.11. Room 11 - Charge Attack Tutorial

moorlands

Goal: Teach the player how to use the Charge Attack in an isolated, focused setting.

Room Description:
The player practices using the Charge Attack to defeat rabbits who are weak to this mechanic.

Cutscene

N/A

Dialogue/Internal Monologue

N/A

HUD Prompts

N/A

4.12. Room 12 - Leaf Carpet Arena

moorlands

Goal: Combine combat and mechanics in a controlled arena environment.

Room Description:
A combat arena locks the player inside a specific area until they defeat multiple waves of enemies. This will be the first main arena of the game and combat will be carried out by the player as part of 3 waves. Enemies will drop from above, and the Player will need to balance fighting with pit avoidance.

Original Notes (Not applicable): If this is the very first arena of the game and combat against basic enemies is still challenging for the player, the arena's layout must be very simple (square layout with no hazards) with three waves of enemies.
Otherwise, this arena shall utilize the Leaf Carpet as a way to increase the challenge and bring together all the elements taught to the player so far.

4.13. Room 13 - Deer Scene 3 - Chase Start

moorlands

Goal: Transition into an active chase sequence.

Scene Description:
Adira catches up to the deer, triggering a chase. This time, the gap between platforms is small enough for Adira to jump and follow. The deer is always in arms distance and will adapt to the pace of the Player - this could be slow to fast.

4.14. Room 14 - Chase Platform Challenge

moorlands

Goal: Challenge the player with platforming sequences during the chase.

Room Description:
The deer pauses at three designated spots, guiding the player to their next objective. Players must combine rolling and precise timing on Leaf Carpets to progress. No enemies are present to maintain the fast pace and focus on platforming.

4.15. Room 15 - Deer Scene 4 - End

moorlands

Goal: Conclude the deer chase arc and advance the story.

Cutscene

Adira fails to capture the deer, and it flies off. Torion's voice bellows out to the fear of Adira where he arrives to tell her off before they head back to Camp.

Dialogue/Internal Monologue

Before the deer has fled:

  • Adira (internal monologue): “I've got you now!”

After the deer has fled:

  • Adira (internal monologue): “Noo! Gone... I lost it.” (sighs) “Torion’s going to-”
  • Torion: “ADIRA!!!”
  • Adira (internal monologue): “...”

Torion walks over to Adira.

  • Torion: “You walk away from me. I tell you to stay, yet you do not listen.”
  • Adira: “I saw a deer. A big one. It could have fed us for days.”
  • Torion: “And now it feeds nothing. You think hunting is about chasing? Hunting is about waiting. Patience.”
  • Adira: “I know how to hunt.”
  • Torion: “You know how to chase. Not hunt. It is not the same. One day, when I am gone, you will need to know the difference.”
  • Adira: “I’m sorry.”
  • Torion: “... Come. The day grows dark.”

4.16. Room 16 - Camp Scene - Chapter End

moorlands

Goal: Provide exposition and character development.

Scene Description:
At the camp, Adira and Torion discuss:

  • Strange events in the moorlands
  • Torion’s discomfort with living in a tribal setting
  • Torion's relationship with Adira and its complexities
  • Better showcasing Adira's and Torion's personalities

Dialogue/Internal Monologue

  • Torion: “You do not understand how it works. Hunting is waiting, not chasing.”
  • *Adira *: “I know!”
  • Torion: “You do not. If it were not for me, our bellies would be empty tonight.”
  • Adira: “...”
  • Torion: “The deer should not have been here. Something chased it into the moorlands.”
  • Adira: “By what?”
  • Torion: “I hope we will not find out.”
  • Adira: “...”
  • Torion: “It is late, make sure you are up bright and early.”
  • Torion: “I have many things to teach you about the wild.”
  • Torion: “If you are late, I will be gone.”

LDD - Chapter 2

Cover Image

  • Title: Clash and Flight
  • Description: Adira arguing with Torion and running away
  • Duration: 10m
  • Reference: src/LevelDesign/Chapter2Level.tscn

1. Description

1.1. Restrictions

  1. Level must be located by the Campsite and Moorlands
  2. Quest/day must start with Torion npc Cutscene
  3. Player must be introduced to the Rabbit enemy/object
  4. Player must follow Tracks made by the Rabbit
  5. Player must Hunt Rabbit
  6. After beating the rabbit, Player must find Torion.
  7. Torion and Adira must fight
  8. Adira runs away from Torion cutscene

1.2. Goals

  1. First Puzzle room using puzzleMechanic_1
  2. Include alternative Paths
  3. Include Optional Rooms that leads to collectable / secret
  4. This is the second Main Quest of the game, so both the player and Adira must feel like there is still a long way ahead in order to master the path of the hunter
  5. Introduction of first ranged enemy ( TBA )
  6. Introduction to first Boss Battle ( Torion )
  7. Introduction to Door/Key mechanic ( probably a branch that breaks when you hit in a specific spot )

1.3. List of Scenes

  1. Chapter Start
  2. Campsite Torion scene
  3. Moorlands Torion Rabbit scene
  4. [optional] Moorlands Rabbit blockage scene
  5. Moorlands Rabbit Found
  6. Moorlands Rabbit Beaten
  7. Moorlands Torion Reappears
  8. Moorlands Torion after battle
    1. battleDefeat
    2. battleVictory
  9. Campsite Adira runs away

2. Setting

2.1. Locations - World Areas

  1. Campsite
  2. Moorlands

2.2. Time of Day

  1. Chapter start: Morning
  2. After Rabbit Battle: Afternoon
  3. After Torion Fight: Night

3. Resources

3.1 Enemy list

  1. meleeBasic
  2. rangedBasic
  3. torionBoss

3.2 Hazard list

  1. breakable floor
  2. Pitfalls
  3. Cliffs

3.3. Collectables

  1. Hidden treasure

4. Walkthrough

layout

layout

Disclaimer: This initial draft was developed using an exterior engine and therefore cannot be used as a reliable measurement for distances or area sizes and visual configuration.
Use it as a guide that displays the main intentions of a preliminary layout.

If these layouts are used in order to create new areas, please take into account the current abilities of Adira in chapter 2.
I strongly advise against recreating it except as an iterative and easy to change/update manner.

4.1 Campsite

campsite
Chapter starts, Adira is free to roam inside the campsite.
A hidden trigger will block the player from leaving the camp before talking to Torion.
Upon talking to Torion, the player leaves

4.2 The prey

moorlands
Adira follows Torion and spots her first Rabbit.
The rabbit runs away but leave easy to follow Tracks. ( Green ground tiles )

Torion leaves Adira and the player is free to roam.
The player can move to the left, but a hidden trigger makes her go to the correct position.

Suggestion: if the game takes a level by level approach ( not an integrated world that the player can return at some point ) remove the trigger and replace it with a hidden room with a collectable or reward.

4.3 Room 3

moorlands
Following the tracks, the Player can choose between the north or south path.
Both will end up in the same place but the player is free to pick either path.

4.4a. Room 4 - North Path

moorlands
This path is mostly focused on combat, but also must introduce the player for basic plataform challenges ( jumping over pitfalls ) and the new hazard of Breakable/temporary Floors.

4.4b. Room 5 - South Path

moorlands
This path is mostly focused on Platforms, dedicated to introduce the player to plataform challenges combined with the new hazard of Breakable/temporary Floors.

4.5 Room 6 - Hub

moorlands
While both paths can be extended in order to better accomodate gameplay flow and better breakdown challenges, both must land in this room.
It's important that the player do not feel compelled to return / explore the previous path. Instead, he must be draw to the rabbit tracks and feel a strong urge to progress to the rightmost side of the room.
The rightmost room is a good place to combine precise platforming with combat, unifying both paths but still being a little challenging.

4.6 Room 7 - Cliff room / Torion Arena

moorlands
Player must learn the Cliff mechanic and Access this new area.
In later stages of the level, the player will fight torion in the southmost part of the room.

4.7 Room 8 - Ranged enemy introduction

moorlands
The very first room of the cliff area is and controled environment created for the introduction of a new enemy.
This new enemy will then be the focus of this whole area and slowly combined with other aspects that the player is already familiar

  1. combat solo
  2. multiple instances
  3. platforming
  4. breakable floor
  5. combined with melee enemies
  6. Bigger rooms, will attack outside of camera view
  7. all of the above

4.8 Room 9 - Blocked pathway, rabbit tracks

moorlands
Upon reaching this room, the player must realise that the path to the rabbit is now blocked and he must find a way to open it.

One of the barrier must have the solution close, but out of reach in order to create this connection and give the player a goal/next step.

He can then either choose between the north path or south path.

4.9 Room 10 - North branch - Puzzle room

moorlands

Game design: Discuss if High ground mechanics will be implemented. If yes, this is a good opportunity to show that ranged enemy can attack from higher positions above the walls.

Room1: Basic introduction to Puzzle Mechanic.
Ex: Push block over the switch and open door.

Room2: Actual first puzzle of the game. Create a basic and simple logic puzzle using the same mechanics presented in room1.

After beating the puzzle, the player is now free to collect the key item / unblock the main path.

4.10 Room 11 - South branch - Arenas / combat

moorlands
Upon reaching the first room, the objective must be clear ( he can see the way to clear the blocked path in this very first room, but it's impossible to access.)

Big Room: Multiples ranged enemies combined with platforming. Make use of camera restrictions to increase the intensity of the challenge.

Secret room: The player can reach this room if he pays close attention to a small / secluded entrance in the Big Room.

Safe room: Adira can heal here after the big room.

Arena: First instance where Ranged enemy will be paired with previous enemies.
Usage must be divided into multiple waves and while keep the challenge interesting and somewhat tactical. ( ex: multiples ranged accross the room / followed by melees in front of ranged. / etc. )

After defeating the arena, the player is now free to collect the key item / unblock the main path.

4.11 Room 12 - Rabbit Battle

moorlands

The player finally catches up to the Rabbit.

Once the fight is over, a cutscene occour in which there is a fade out effect and upon returning with a fade In, its already afternoon.

The player now must return to the campsite.

4.12 Room 12 - The way back

moorlands

The player now must return through the same way that he arrived. However, the way is now filled with enemies. ( mostly combination of melee + ranged used in trickier scenarios )

4.13 Room 12 - Torion Battle

moorlands

Adira realizes that she cannot return to the campsite due to the Cliff.

Torion shows up and a scene happen in which they start to fight.

Adira can win or be defeated, both will lead to the conclusion of the chapter in which they both return to campsite, have an argument that ends up with Adira running away.

Chapter 3

Work in Progress

Chapter 4

Work in Progress

Chapter [Chapter Number]: [Chapter Title]

Narrative for Chapter N

1. Overview

Main Objective

  • Define the primary goal for the player in this chapter. Is it combat-focused, exploration-driven, or a blend of both?

Tone and Atmosphere

  • Describe the mood and atmosphere, focusing on the intensity and excitement typical of action-adventure games. Consider how these elements evolve throughout the chapter.

Action Set-Pieces

  • Outline any major action sequences or set-pieces that are central to this chapter.

2. Environment Design

Setting

  • Describe the dynamic locations where the action unfolds. Include details like terrain (e.g., rugged mountains, dense urban environments), architecture (e.g., ancient ruins), and overall aesthetic (e.g., gritty realism, stylized fantasy).

Key Areas

  • List and describe critical locations within the level (e.g., combat arenas, hidden caves, chase sequences). Consider how each area supports the genre's gameplay.

Lighting and Color Scheme

  • Describe how lighting and color schemes are used to heighten tension, guide the player, and create contrast between exploration and action scenes.

3. Gameplay Mechanics

Core Mechanics

  • List and describe the core gameplay mechanics, such as combat systems (melee, ranged, combo systems), traversal (climbing, jumping, swinging), and interaction with the environment.

Puzzles and Challenges

  • Outline puzzles or environmental challenges, focusing on how they are integrated into action sequences (e.g., time-sensitive puzzles during combat, moveable blocks, keys for blocked passages).

Combat and Stealth Elements

  • Detail the combat mechanics, including types of enemies, AI behavior, and any stealth options. Describe how these elements contribute to the chapter's pacing and excitement.

4. Narrative Integration

Dialogue and Interactions

  • Describe significant character interactions or dialogue that shape the narrative and influence gameplay. Consider how these moments build tension or provide context for action sequences.

Cinematic Sequences

  • List any cutscenes or quick-time events (QTEs) that are crucial for storytelling and immersion. Explain their role in connecting narrative and gameplay.

5. Level Flow

Player Path

  • Describe the intended player path, focusing on how the level design encourages exploration while guiding players toward key action points. Mention any opportunities for non-linear exploration.

Pacing

  • Discuss how the chapter balances high-intensity action with moments of exploration or story development. Consider how pacing influences player engagement.

Scripted Events

  • Detail any scripted sequences (e.g., ambushes, chases) that are designed to surprise the player or escalate the action.

6. Visual and Audio Elements

Visual Cues

  • Highlight any visual cues (e.g., fires, ambush, environmental hazards) that help guide the player or enhance the storytelling.

Sound Design

  • Describe the soundscape, including how music, sound effects, and ambient sounds are used to heighten the tension, signal danger, or provide relief during quieter moments.

Key Assets

  • List unique assets (e.g., destructible environments, iconic weapons) that are essential to this chapter's identity.

7. Challenges and Rewards

Obstacles

  • Identify major obstacles (e.g., enemy waves, environmental hazards) that the player must overcome. Discuss how these challenges are designed to test the player’s skills.

Rewards

  • Describe the rewards (e.g., weapon upgrades, narrative reveals) that players can earn by completing challenges or exploring hidden areas.

Secret Areas/Collectibles

  • Note any hidden areas or collectibles that encourage exploration and add depth to the gameplay.

8. Additional Notes

Inspiration and References

  • Mention any inspiration sources (e.g., movies, other games) or references that influenced the design of this chapter. Discuss how these inspirations are reflected in the level design.

Art Style References

  • Include specific art style or thematic references that guided the visual design, focusing on how they support the action-adventure genre.

Miscellaneous

  • Any other relevant information not covered above that contributes to the chapter’s design.

Architecture

Work in progress

Architecture

Work in progress

Technical Choices

Engine

This game currently use Godot LTS version: 3.5.3 for the following reasons:

  • It has a lot of work implemented in the old tile system for the entire Game World.
  • Godot Wwise integration isn't fully supported in Godot 4.X.
  • My current observation is that Godot 4.X is stable but not commercial-proof (This will obviously come with time), but it feels premature to make the move yet.
  • This project will continue to adapt to the new standards.
  • The Tilemap/tileset has gone through quite a overhaul and when trying to upgrade recently as a test it broke a lot of the World/Levels/Rooms. This is simply too much work to carry out for now.

Coding Conventions

Godot Coding Standards

File Naming Conventions

General Guidelines

  • All Godot script files should use the .gd extension.
  • Use PascalCase for all filenames in src/.
    • Scripts
    • Resources
    • Scenes
  • Use camel-case.md for documentation files.

Examples

  • Script file: Player.gd
  • Scene file: Player.tscn
  • Resource file: ItemResource.gd
  • Documentation file: docs/markdown/dev_process/1-create-branch.md

Code Structure

Classes and Nodes

  • Class names should be written in PascalCase.
  • Node names should be written in PascalCase and should be descriptive.
# Good Example
class_name Player extends KinematicBody2D

# Bad Example
class_name player extends KinematicBody2D

Variables

  • Use snake_case for variable names.
  • Variables should be descriptive and clear in their purpose.
# Good Example
var player_speed = 10
var health_points = 100

# Bad Example
var PlayerSpeed = 10
var hp = 100

Constants

  • Use ALL_CAPS with underscores for constants.
# Good Example
const MAX_HEALTH = 100

# Bad Example
const maxHealth = 100

Functions

  • Use snake_case for function names.
  • Function names should clearly describe their purpose.
# Good Example
func calculate_damage(amount):
    return amount * 2

# Bad Example
func CalculateDamage(amount):
    return amount * 2

Signals

  • Use snake_case for signal names.
  • Signals should be named to clearly indicate the event they represent.
# Good Example
signal health_changed(new_health)

# Bad Example
signal HealthChanged(new_health)

Commenting and Documentation

Inline Comments

  • Use comments to explain the purpose of complex logic.
  • Inline comments should be concise and relevant.
# Good Example
# Calculate the damage dealt to the player
func calculate_damage(amount):
    return amount * 2

# Bad Example
func calculate_damage(amount):
    # this function calculates damage
    return amount * 2

Documentation Comments

  • Use multiline comments for documentation purposes at the beginning of scripts and functions.
  • Documentation comments should provide an overview of the script or function's purpose and usage.
"""
Player.gd
This script handles the player's character behavior including movement and health.
"""

"""
calculate_damage(amount)
Calculates the damage dealt based on the input amount.
Parameters:
- amount (int): The base damage amount.

Returns:
- int: The calculated damage.
"""
func calculate_damage(amount):
    return amount * 2

Project Structure

Folders and Organization

  • Organize scripts into folders based on their functionality.
  • Use PascalCase for folder names.

Best Practices

Consistency

  • Ensure consistent naming conventions and code structure throughout the project.
  • Regularly review code to maintain adherence to these standards.

Readability

  • Prioritize code readability and clarity over brevity.
  • Use descriptive names and avoid overly complex logic within single functions.

Performance

  • Be mindful of performance implications, especially in critical sections of the code.
  • Optimize code where necessary without sacrificing readability.

Reusability

  • Write modular and reusable code where possible.
  • Avoid duplication by abstracting common functionality into reusable functions or scripts.

Conclusion

Following these coding standards will help maintain a clean, readable, and maintainable codebase for your Godot projects. Consistency in naming conventions, structure, and documentation will facilitate collaboration and improve the overall quality of the project.

Setup

Getting developers set up with the game locally and quickly is crucial as it directly impacts productivity and the development cycle's efficiency. A fast setup process reduces the time it takes for new team members to become productive, allowing them to start contributing to the project sooner.

It also minimizes potential frustrations that can arise from lengthy or complicated setup procedures, which can lead to delays and reduced motivation. Furthermore, having a local development environment enables developers to test changes, debug issues, and iterate on features in real-time, leading to faster development and quicker identification and resolution of bugs.

This guide has been put together to reduce the feedback loop and allow you to get up and running faster. If you notice any steps/pain points are missing, please update this documentation.

Starting point

1 - Github Access:

Please send me your Github Username so I can add you to the following repositories:

  • https://github.com/smks/tribe-of-the-accord (Main Project)
  • https://github.com/smks/tribe-of-the-accord-soundbanks (Where Wwise/Audio files live)

To get the game running you will need to first download the Wwise Binary and the Soundbank to play the audio otherwise the game will fail to run:

Follow the steps below where we download the files into the Main Project: https://github.com/smks/tribe-of-the-accord

2 - Download the Wwise binaries

These are the binaries that generate the necessary singletons when the Game runs. E.g. Wwise, AkEvent etc.

You will be able to download the binaries by:

  1. Navigating to the releases here https://github.com/smks/tribe-of-the-accord-soundbanks/releases
  2. Download bin.zip from the latest binaries version e.g. WwiseBinaries_3.5.2_v2. (v1 has issues with Windows)
  3. Inside this Zip you will have 3 platform binaries, but you only need one platform.

Files inside the zip needs to be copied to:

  • If on Mac: move osx to addons/wwise/bin/osx
  • If on Linux: move linux to addons/wwise/bin/linux
  • If on Windows: move win64 to addons/wwise/bin/win64
  • All other files can be placed in addons/wwise/bin

3 - Download the SoundBank

This is an export provided by our Audio team that has a collection of audio events we need in the game.

Steps:

  1. Navigating to the releases here https://github.com/smks/tribe-of-the-accord-soundbanks/releases
  2. Download GeneratedSoundbanks.zip from the latest version e.g. v1.1.0-light-demo.
  3. Inside this Zip you will have 3 platform binaries, but you only need 1 platform.
  • Mac + Mac/ directory.
  • Linux + Linux/ directory
  • Windows + windows/ directory
  • Wwise_IDs.h (Needed regardless of platform)

This needs to be copied to:

  • Mac: wwise/GeneratedSoundBanks/Mac
  • Linux: wwise/GeneratedSoundBanks/Linux
  • Windows: wwise/GeneratedSoundBanks/Windows
  • wwise/GeneratedSoundBanks/wwise_ids.gd (Needed for all platforms)
  • wwise/GeneratedSoundBanks/Wwise_IDs.h (Needed for all platforms)

Directories

assets/ Contains all imagery, animations, videos and JSON files needed for the game to function.

By default, you will be given dev 'watermarked' assets to protect copyright and publishing of the game.

Development assets are deployed to itch.io.

To get production commercial assets you will need access permissions to the production repository and use the prod assets. It should be assumed by developers and game designers working on the project that watermarked assets will be used. Either a release manager or the creator will need these assets to release the official game.

Ensure you close the Godot project first before running this so it can reimport images!

sh tools/bin/fetch-prod-assets.sh 

Directory List

addons/ Contains all third party code, by default this is added to source control (not ideal).

devlog/ Contains snapshots of the game used for Marketing and other promotional purposes.

docs/ Contains all of the documentation that is hosted on a unique URL per branch + the main URL hosted on Netlify.

helpers/ Source code we ideally don't want in the production release, and is used for aiding debugging development + taking snapshots.

sandbox/ is used to trial out certain features in scenes that are not part of the official codebase.

script_templates/ Scripts to generate end to end tests.

src/ Contains all of the production code.

test/ Stores the main test.tscn scene to run tests in src/**.test.gd.

tools/ contains Bash scripts and JavaScript scripts to help speed up development and be more efficient.

wwise/ contains all SoundBanks for the game to work with sophisticated audio. Check out wwise/README.md for more information.

Tools to Install

Running these scripts are completely optional, you do NOT need to run them to get up and running as they can increase the size of your PR.

We use Godot Toolkit to run linting and check code complexity. You'll need Python and gdtoolkit installed before running any shell scripts below.

pip3 install 'gdtoolkit==3.*'

Run linting and apply it on project

sh tools/bin/lint-scripts-apply.sh

Run code complexity

sh tools/bin/lint-scripts-apply.sh

Create Scene test files

sh tools/bin/create-scene-test-files.sh

Create Script test files

sh tools/bin/create-script-test-files.sh

Testing

We use GUT to run tests.

Development process

Banner

Welcome to the Tribe of the Accord video game GitHub project! Your contributions are crucial to the growth and improvement of the game. This guide will walk you through the process of raising a Pull Request (PR) for submitting your contributions to the project.

Development process

Step 1: Create a Branch

Before you make any changes, ensure you're working on a new branch off the latest main branch of the project. This keeps the main branch clean and your changes organized. This branch should follow the following convention:

Branch convention:

  1. Should use the Ticket ID (as a prefix) from the Notion ticket you are working on. This allows us to track it back to the project tracking tool.
  2. Use a small description to give an idea on what the branch is doing.
  3. Use a suffix to indicate if its a defect, feature or documentation.

All the above to be separated by a -. Example of it all together below.

git checkout -b [TOTA-XXX]-[small-description]-[feature/docs/defect]

Branch examples:

git checkout -b TOTA-349-demo-experience-feature
git checkout -b TOTA-364-gut-testing-docs
git checkout -b TOTA-363-new-day-defect

Development process

Step 2: Make Your Changes

With your branch created, you're ready to make the changes you wish to contribute. This could involve fixing bugs, adding new features, or updating documentation. Ensure your changes are concise and focused on a single area of improvement. Adding multiple changes increases the complexity of the work that has to be later reviewed. Keeping changes very focused on one thing makes it a lot easier for your reviewers.

Making Changes

  1. Understand the scope: Before starting, clearly understand what needs to be changed or fixed. When you're addressing an issue from Notion, review the description and any related discussions to fully understand the problem or requirement. If you have any concerns or questions, please reach out to the project owner or the team to avoid delays. This will help avoid divergence or getting to deep into a solution that may not be the right one.

  2. Work Incrementally: Make small, incremental changes. This not only makes your changes easier to review but also reduces the risk of introducing bugs. Test your changes locally as you go to ensure they work as expected.

  3. Write Clear Code: Write code that is clean and easy to understand. Use meaningful variable and function names, and include comments where necessary to explain the purpose of complex or non-obvious code blocks.

  4. Write Tests: You should write tests to cover the code you've written. See testing. These newly created tests should all pass when the feature/defect is ready for review.

Committing Your Changes

  1. Commit Often: Commit your changes often with clear, concise commit messages. Each commit should represent a logical unit of work. This makes the history easier to understand and debug if something goes wrong.

    git add .
    git commit -m "A descriptive message explaining the change"
    
  2. Write Good Commit Messages: A good commit message should summarize the change in the first line (50 characters or less), followed by a blank line and a more detailed explanation if necessary. Describe why the change is being made and how it addresses the issue.

  3. Keep Commits Focused: Each commit should be focused on a single change. Avoid including unrelated changes in the same commit, as this makes it harder to understand the purpose of the commit and can complicate the review process.

  4. Review Your Changes Before Pushing: Use git diff or a graphical Git tool to review your changes before pushing them. This is a good opportunity to catch any mistakes and ensure that only the intended changes are included in the commit.

    git diff <file-name>
    
  5. Push Your Changes: Once you are satisfied with your changes and commits, push them to your branch on the remote repository.

    git push origin <your-branch-name>
    

By following these guidelines, you ensure that your contributions are well-organized, easy to review, and free of unnecessary errors, making the development process smoother for everyone involved.

Development process

Step 3: Create the Pull Request

Navigate to the GitHub repository page for Tribe of the Accord, and you'll see an option to "Compare & pull request" for your branch. Click on it to begin creating your pull request.

Pull Request Template

The project provides a PR template to guide you through providing all necessary information about your changes. Here's how to use it:

  • Description: Provide a brief overview of the changes or features introduced. Include specific file paths or components affected if possible.
  • Related Issue(s): Link the Notion ticket this maps to. Every PR should have an associated Notion ticket from the Tribe of the Accord Kanban board. This helps with project tracking and makes sure that we are prioritising the right work.
  • Type of Change: Indicate whether this is a bug fix, new feature, enhancement, documentation update, etc. using the labels.
  • Testing Done: Describe any testing you performed to ensure the changes work as expected. This includes manual Smoke testing and GUT automated testing. You should ensure no regressions are introduced with your changes, and if so, create tests to cover it not happening again.
  • Checklist: Sanity check of all the steps required, and acknowledgement that once the PR is merged to main it will get automatically tagged with a semantic version.
  • Screenshots/GIFs/Videos: If applicable, add visuals to help showcase the changes.
  • Additional Notes: Add any other details or notes helpful for reviewers.
  • Reviewer(s): Tag specific individuals or teams for reviewing your PR if they should be aware of changes you are doing (e.g. crossover).
  • Merge Readiness: Indicate if the PR is ready for merging or if any work remains to be done.

Ideally I'd use Draft Pull Requests, but this is an Enterprise feature and the cost isn't justified. What you can do instead if prefix your PR with 'WIP -' and remove once it is ready.

Development process

Step 4: Review process

Once your PR is submitted, the project's maintainers and other contributors may provide feedback. Be open to discussions and ready to make further adjustments based on their suggestions. To facilitate a smooth path to merging your PR, consider the following steps:

Responding to Feedback

  1. Review Feedback Promptly: Regularly check the PR for feedback from the project maintainers and other contributors. Timely responses show that you are committed to contributing and help keep the project moving forward.

  2. Engage in Discussions: If there are comments or questions about your changes, engage in the discussion. Provide clear, respectful responses to feedback and questions. If a comment requires a detailed explanation or a significant change, consider updating your PR with new commits that reflect these discussions.

  3. Make Necessary Changes: If the feedback involves making changes to your submitted code, update your branch with these changes. This may involve fixing bugs, refactoring code, or adding additional tests. After making the changes, push them to the same branch to automatically update the PR.

Ensuring PR Readiness

  1. PR Checklist: Many projects have a PR checklist in the description template. Ensure all items on this checklist are ticked off, indicating you have met all the necessary requirements, such as adding unit tests, documentation, or meeting coding standards.

  2. Continuous Integration (CI) Checks: Ensure that all automated CI checks, such as build, tests, and code quality checks, pass successfully. A 'Green' status indicates that your changes meet the project's automated validation standards and are less likely to introduce bugs or regressions.

  3. Approval Process: A PR should be approved by at least one other project member before it can be merged. This approval signifies that the code has been thoroughly reviewed and is considered good quality and in line with the project's goals.

  4. Resolve Conversations: Make sure all discussion threads in the PR comments are resolved. This could mean addressing any remaining issues pointed out by reviewers or coming to a consensus on any discussion points. Marking comments as 'Resolved' indicates that you have addressed the feedback or that a discussion has reached a satisfactory conclusion.

Final Steps Before Merging

  1. Update branch: Ensure your branch is up to date with the main branch. Only use git rebase if you know what is happening as it can cause bad side effects if done incorrectly. The safer approach is to Update the branch via the Github PR view.

  2. Final Review and Merge: Once all the above steps are completed, the maintainers will do a final review. If everything is in order, they will merge your PR into the main branch. Some projects may use automated tools to merge PRs once all criteria are met.

By actively engaging with the feedback process, fulfilling the checklist requirements, ensuring your PR is 'Green', and obtaining the necessary approvals, you significantly increase the chances of your contributions being seamlessly integrated into the project.

Development process

Step 5: Release!

After your PR has been reviewed and approved, one of the project maintainers will merge it into the main project. Congratulations! Merging does not need to happen by the Game creator and can happen from a fellow colleague. You've successfully contributed to the Tribe of the Accord video game.

Why are there so many steps?

Having many checklist items ticked before marking a PR as ready is important for several reasons:

  • Ensures Quality: It verifies that the submission meets the project's quality standards, reducing the likelihood of introducing bugs or regressions.
  • Facilitates Review: A PR that adheres to guidelines and passes all checks can be reviewed more efficiently, speeding up the integration process.
  • Reduces Revisions: Completing the checklist minimizes the need for back-and-forth revisions, leading to a smoother development workflow.
  • Maintains Stability: Ensuring tests pass and conflicts are resolved maintains the stability of the main branch, preventing disruptions for other contributors.
  • Improves Documentation: Updated documentation helps maintain clarity about features and changes, aiding future development efforts.
  • Enhances Collaboration: A thorough checklist encourages best practices, enhancing collaboration and knowledge sharing within the team.

For more detailed instructions on using Git and GitHub, refer to the GitHub documentation.

Thank you for contributing to the Tribe of the Accord project! Your efforts help make the game better for everyone.

Tribe of the Accord Game CI - GitHub Actions Workflow

This document provides an overview of the GitHub Actions workflow for the "Tribe of the Accord" game, explaining the purpose and steps of each job within the workflow. This workflow automates the process of testing, tagging, and publishing the game to Itch.io.

Workflow Overview

The workflow is triggered on:

  • Merges to the main branch.
  • Pull requests targeting the main branch (But only runs tests)

The workflow includes three main jobs:

  1. test - Using GUT tests to ensure our project has stability (This is run in PR branches)
  2. tag - To get a snapshot of the game, increment the game version and push a tag (Only done for merges to main)
  3. publish - We publish our game for each supported platform (windows, mac, linux) (Only done for merges to main)

Permissions

The workflow has write permissions for repository contents.

Environment Variables

The workflow sets several environment variables:

  • GODOT_VERSION: The version of Godot to use.
  • EXPORT_NAME: The name of the exported game.
  • SOUNDBANK_REPO_ASSET_URL: URL to fetch assets for Wwise-related assets
  • SOUNDBANK_ASSET: Soundbanks for all platforms
  • WWISE_BINARIES_ASSET: Binaries for all platforms
  • GAME_RELEASE_VERSION: Template version - 'latest'

Jobs

1. Test Job

Purpose: Run tests to ensure code quality before proceeding with tagging and publishing.

Runs on: ubuntu-latest

Container: Uses barichello/smks-ci:3.6 Docker image.

Steps:

  1. Checkout Repository: Checks out the repository using actions/checkout@v2.
  2. Print Directory Structure: Prints the directory structure for debugging purposes.
  3. Check Test Files: Runs a script to check for missing test files (tools/bin/check-missing-tests.sh). (For visibility and not blocking)
  4. Run Tests: Executes the tests using the Godot command line.

2. Tag Job

Purpose: Update the game version and tag the new version.

Dependencies: Requires the test job to succeed.

Runs on: ubuntu-latest

Conditions: Runs only on the main branch (github.ref == 'refs/heads/main').

Steps:

  1. Checkout Repository: Checks out the repository at the main branch with a personal access token for authentication.
  2. Update Version: Increments the patch version number in the project.godot file.
  3. Commit and Tag: Commits the updated project.godot file and tags the new version. Pushes the changes and the new tag to the repository.

3. Publish Job

Purpose: Build the game for different platforms and publish the builds to itch.io.

Dependencies: Requires the tag job to succeed.

Runs on: ubuntu-latest

Container: Uses barichello/smks-ci:6 Docker image.

Steps:

  1. Checkout Repository: Checks out the repository using actions/checkout@v2.
  2. Install curl: Installs curl for downloading dependencies.
  3. Install Butler: Installs butler, a tool for uploading builds to itch.io. (Moved up because if itch goes down, we don't build all the platform games or download big files).
  4. Download Wwise Binaries: Downloads and unzips Wwise binaries.
  5. Download Soundbanks: Downloads and unzips soundbanks for each platform (debug and release versions).
  6. Setup Godot Templates: Sets up Godot export templates. (These are used to generate the games)
  7. Mac Build: Builds the game for macOS.
  8. Windows Build: Builds the game for Windows.
  9. Linux Build: Builds the game for Linux.
  10. Deploy Mac to itch.io: Deploys the macOS build to itch.io using the butler tool.
  11. Deploy Windows to itch.io: Deploys the Windows build to itch.io using the butler tool.
  12. Deploy Linux to itch.io: Deploys the Linux build to itch.io using the butler tool.
  13. Get Release Commit: Grab the latest commit message (excluding the last commit that upgrades the project.godot version)
  14. Post Discord Game Release: We want to notify the teams that a new game version has been released

Secrets

The workflow uses the following secrets for authentication:

  • PAT_TOKEN: Personal Access Token for pushing commits and tags.
  • BUTLER_API_KEY: API key for uploading builds to itch.io.
  • ITCHIO_USERNAME: itch.io username.
  • ITCHIO_GAME: itch.io game identifier.
  • ITCHIO_PASSWORD: itch.io game password. Needed to access restricted itch page and enter password.

Conclusion

This GitHub Actions workflow automates the process of testing, tagging, and publishing the "Tribe of the Accord" game. By following the steps outlined in each job, the workflow ensures that the game is thoroughly tested, versioned correctly, and published to itch.io with minimal manual intervention.

Testing

Properly structured and thorough testing is a cornerstone of stable software development. By following this guide, you can ensure that Tribe of the Accord remains robust and maintainable as it grows in complexity.

Why do we do write tests?

  • Error Detection: Quickly identifies bugs and issues in our code, ensuring they are fixed early in the development cycle.
  • Code Quality: Encourages better coding practices, leading to cleaner, more maintainable code.
  • Refactoring Confidence: Allows us to refactor and improve our code without fear of breaking existing functionality.
  • Regression Prevention: Helps prevent regressions by ensuring that new changes don't adversely affect existing functionality.
  • Documentation: Acts as a form of documentation, demonstrating how the system is supposed to work.
  • Development Efficiency: Speeds up the development process by reducing the time spent on manual testing.
  • Team Collaboration: Facilitates better collaboration in team environments by ensuring code changes are tested and functional.
  • Integration Testing: Supports testing the integration of different game components and systems.
  • Continuous Integration: Integrates easily with CI/CD pipelines, ensuring tests are run automatically for every code change. If you break something, we capture it before merging and impacting others.
  • Feedback Loop: Provides a fast feedback loop to developers about the impact of their changes.

Running Tests

Overview

Testing in Godot using the GUT (Godot Unit Testing) framework can be done in multiple ways: through the Godot editor using the tests.tscn scene or the GUT tab, and via command line locally and through Github Action/CI. Ensuring that tests pass is mandatory before merging changes into the main branch.

Running Tests in the Godot Editor

Using tests.tscn

  1. Open the Test Scene: Navigate to and open the tests.tscn file in your Godot project. This scene is specifically set up to run your GUT tests.

  2. Run the Scene: Press the "Play Scene" button (F6 by default) to execute the tests. GUT will run all the tests in your project and display the results in the output console.

tests.tscn file

Using the GUT Tab

  1. Open the GUT Tab: In the Godot editor, find the GUT tab, usually located at the bottom panel alongside the "Output" and "Debugger" tabs.

  2. Run the Tests: Click on the "Run" button in the GUT tab. This will execute all your tests and show the results directly in the GUT panel.

GUT Tab

Running Tests via Command Line for CI

For continuous integration, tests are run automatically whenever a pull request (PR) is made against the main branch. The tests need to pass for the PR to be eligible for merging. The command used in the CI environment is as follows in the root of the project, you can run it too on unix-like terminals:

godot --path $PWD -s addons/gut/gut_cmdln.gd -glog=1

This same script is run as part of the CI build step, as shown below.

CI Build

Defined in this main.yml file if you're wondering where:

.github/workflows/main.yml

Conclusion

Running GUT tests regularly, both locally in the Godot editor and through CI in the development workflow, is crucial for maintaining high-quality, stable code. Ensure that your tests cover the necessary aspects of your game to leverage the full benefits of automated testing.

Writing Tests

Introduction

This guide provides instructions on how to write tests using the GUT (Godot Unit Testing) library for Tribe of the Accord. Tests are crucial for ensuring that the game's functionality works as expected and remains stable throughout development. Especially when it becomes a commercially maintained project and capturing regressions is done before an official release.

  • Library used - https://github.com/bitwes/Gut (Version 7+) Version 9 is for Godot 4+
  • Documentation - https://gut.readthedocs.io/en/godot_3x

Test File Structure

To maintain consistency and ensure every source file is tested, our project should have a test file for each source file. Test files are named similarly to their corresponding source files but with a .test.gd extension.

  • Source file: src/Player.gd
  • Test file: src/Player.test.gd

Test files in our project are created based on the type of asset you are testing: Scripts or Scenes. Here's how you should structure your test files for each type:

Manual Approach

  1. Create a new test file for your source file. E.g. src/Player.test.gd.
  2. Copy the snippet below (Script or Scene templates below).
  3. Replace _FullID.gd to the full path e.g. src/Player.gd
  4. Replace _ID.gd to the full path e.g. Player.gd

For a Script/Reference/Resource file

extends "res://addons/gut/test.gd"

var _Script = load("res://_FullID.gd")
var obj

func before_each():
    obj = _Script.new()

func after_each():
    obj.free()
    obj = null

func after_all() -> void:
    _Script = null

func test_main():
    pending('Need to write test for "_ID"')

For a Scene file

extends "res://addons/gut/test.gd"

const SCENE_PATH = "res://_FullID.tscn"
var scene
var obj = null
var expected_methods = ["_ready"]

func before_each():
    scene = load(SCENE_PATH).instance()
    add_child(scene)

func after_each():
    remove_child(scene)
    scene.free()

func test_main():
    pending('Need to write a test for "_ID"')

We default to a pending function, in the test run it will simply skip the test until you are ready to write some tests.

Generating Test Files

Use the following bash scripts to automatically generate test files for missing tests using Bash scripts found in tools/bin:

  • For Scene files:

    sh tools/bin/create-scene-test-files.sh
    
  • For Script and Resource files:

    sh tools/bin/create-script-test-files.sh
    

The downside to this is it will create all test files that are missing in the entire project, but its fine as they are all set as pending tests so it won't impact you unless you add tests to a specific file and they fail.

Writing Your Tests

When you test file has been either manually created or you used the script to generate it for you (which is a lot easier), you are ready to write some tests.

Use assertions to validate the behavior of the object or scene under test. For example:

func test_player_movement():
    obj.move(10, 0)  # Assuming `move` is a method in the Player script
    assert_eq(obj.position.x, 10, "Player should move 10 units along the x-axis")

For some examples of what sort of tests to write, visit this page.

Testing Examples

Here are some arbitrary examples of GUT tests in a Godot project that illustrate the benefits of using automated testing:

Unit Testing

1. Testing Player Movement

This test ensures that the player moves correctly when a move function is called, showcasing error detection and regression prevention.

func test_player_moves_right():
    var player = Player.new()
    var initial_position = player.position
    player.move_right()
    assert_eq(player.position.x, initial_position.x + 1, "Player should move 1 unit to the right")

2. Testing Scene Loading

This test verifies that a scene is loaded properly, demonstrating the benefit of integration testing.

func test_main_menu_loads():
    var main_menu_scene = load("res://scenes/MainMenu.tscn").instance()
    add_child(main_menu_scene)
    assert_not_null(main_menu_scene, "Main Menu scene should be loaded and not null")

3. Testing Health System

This test checks the player’s health decrement function, illustrating code quality and documentation benefits.

func test_health_decrements_correctly():
    var player = Player.new()
    var initial_health = player.health
    player.take_damage(10)
    assert_eq(player.health, initial_health - 10, "Health should decrement by 10")

4. Testing Game Over Condition

This test asserts that the game over condition triggers correctly, aiding in development efficiency.

func test_game_over_triggered_on_zero_health():
    var player = Player.new()
    player.health = 1
    player.take_damage(1)
    assert_true(player.is_game_over(), "Game over should be triggered when health reaches zero")

5. Testing Inventory Management

This test ensures that inventory management works as expected, which is crucial for team collaboration and maintaining code quality.

func test_add_item_to_inventory():
    var inventory = Inventory.new()
    var item = Item.new("Potion")
    inventory.add_item(item)
    assert_true(inventory.has_item("Potion"), "Inventory should contain the added item")

These examples demonstrate how GUT tests in Godot can help detect errors, improve code quality, support refactoring, prevent regressions, serve as documentation, enhance development efficiency, facilitate team collaboration, enable integration testing, integrate with CI/CD, and provide a fast feedback loop.

E2e (End to end) Testing

For Godot, E2E tests typically run within the Godot environment, executing scenarios that a player or user might experience when using the game or application. This includes navigating through menus, interacting with game objects, triggering events, and verifying the outcomes of these actions. The goal is to ensure that all parts of the application work together as expected in a real-world scenario.

In E2E testing with GUT, the test cases would automate actions like clicking buttons, moving characters, entering text, and then validate the responses of the application, such as changing scenes, updating the game state, or saving data. These tests can catch issues that might not be evident in unit or integration tests, such as problems with user flows, graphical rendering, input handling, and overall behavior of the game or application.

Some examples of e2e tests:

  1. Running through the entire Quest 1 and validating all steps between - Example: src/Quests/Resources/Torion/001_quench_the_thirst.test.off.gd
  2. Starting the game and ensuring you can get to the main menu to play a new game.
  3. Going through a cutscene and can continue to the next part of the game.

Game Builds

Here's how we manage our game builds:

Development Builds

Development builds of our games are published on itch.io. These builds are updated frequently and allow us to gather feedback and make improvements based on community input. By accessing our dev builds on itch.io, you can get an early look at new features and changes before they are finalized.

Development Builds

Production Builds

Production builds, which are stable and polished versions of our games, are published on Steam. These builds are meant for a wider audience and provide a more refined gaming experience.

Production Builds

In the future, we plan to expand our production builds to other platforms, ensuring that our games reach as many players as possible.

Thank you for supporting our development journey. Your feedback is invaluable as we strive to create the best gaming experience possible.

Development Builds

Welcome to the development/demo preview guide for Tribe of the Accord!

Follow the steps below to access and download the demo build from itch.io.

Step 1: Visit the Itch.io Page

Go to the Tribe of the Accord itch.io page.

Step 2: Obtain the Password

To access the demo builds, you will need a password. This password can be found in the #game-releases channel on our Discord server.

  1. Join our Discord server.
  2. Navigate to the #game-releases channel.
  3. Note down the password provided in the channel.

Step 3: Access the Downloads Page

On the itch.io page, you will be prompted to enter the password to access the downloads section. Enter the password obtained from the Discord channel.

Step 4: Choose Your Build

We have three builds available for different operating systems:

  • Linux
  • Mac
  • Windows

Select and download the appropriate build for your operating system. There is currently 2 Mac builds, choose the latest published version as the other one I cannot remove.

Enjoy the Demo!

Once you have downloaded the build, you can install and start playing Tribe of the Accord. We hope you enjoy the demo and look forward to your feedback!

For any issues or support, please reach out on our Discord server. Links can be found here

Happy gaming!

Production Builds

Process on Steam TBC.

Building the reference

Build Godot Resources

To make the player's animated_sprite, I needed to convert a large spritesheet into an animated sprite, with each animation split up.

It was much harder than I expected. Below is the code I did to create godot resources by code.

Getting the frames of each animation to create a separate spritesheet

extends AnimationPlayer


const PATH = "res://assets/Player/Sheets/"

# The sprite that contains the spritesheet
onready var chara := $"../Viewport/Character" as Sprite

var anim_names = get_animation_list()

for anim_name in anim_names:
	var anim = get_animation(anim_name)
	var idx = anim.find_track("Viewport/Character:frame")
	var num = anim.track_get_key_count(idx)
	var images: Array = []
	
	for i in range(0, num):
		var value = anim.track_get_key_value(idx, i)
		var pos = Vector2((value % chara.hframes) * 64, (value / chara.hframes) * 64)
		var size = Vector2.ONE * 64
		var rec2 = Rect2(pos, size)
		var new_image = chara.texture.get_data().get_rect(rec2)
		
		images.append(new_image)
		
	
	var final_image := Image.new()
	final_image.crop(images.size() * 64, 64)
	final_image.convert(Image.FORMAT_RGBA8)
	final_image.fill(Color.transparent)
	
	for i in images.size():
		var image = images[i]
		var rec2 = Rect2(Vector2.ZERO, Vector2.ONE * 64)
		var dest = Vector2(i * 64, 0)
		
		final_image.blit_rect(image, rec2, dest)
	
	var _err = final_image.save_png(PATH + anim_name + ".png")

Adding the spritesheets to a animated sprite

func _create_player_sprite_frames():
	for file_name in dir_contents(PATH):
		file_name = file_name.get_basename()
		frames.add_animation(file_name)
		
		var image := Image.new()
		image.convert(Image.FORMAT_RGBA8)
		var _err := image.load(PATH + file_name + ".png")
		
		var image_texture := ImageTexture.new()
		image_texture.create_from_image(image, 0)
		
		var size = image.get_size().x / 64
		
		for i in size:
			var atlas_texture := AtlasTexture.new()
			atlas_texture.atlas = image_texture
			atlas_texture.region = Rect2(i * 64, 0, 64, 64)
			
			frames.add_frame(file_name, atlas_texture, i)
	
	# The images are saved in raw in the file. it is BAD!
	ResourceSaver.save("res://assets/Player/PlayerSpriteFrames.tres", frames)
		


func dir_contents(path) -> Array:
	# Code is in the Godot docs of the File class

Convert the ressources images into a external resources

extends AnimatedSprite

const PATH := "res://assets/Player/Sheets/"
const PATH_RESOURCE := "res://assets/Player/PlayerSpriteFrames.tres"

var names = # Array of the names of every animation

func _remove_sub_ressource():
	var file := File.new()
	var _e := file.open(PATH_RESOURCE, File.READ)
	var txt := file.get_as_text(true)
	var txts := txt.split("\n")
	var size := txts.size()
	
	for i in range(size - 1, -1, -1):
		if txts[i].find("[sub_resource type=\"Image\" id=") != -1:
			for y in 8:
				txts.remove(i)
	
	file.close()
	_e = file.open(PATH3, File.WRITE)
	file.store_string(txts.join("\n"))
	
func _add_ext_resource():
	var file := File.new()
	var _e := file.open(PATH3, File.READ)
	var txt := file.get_as_text(true)
	var txts := txt.split("\n")
	var size := txts.size()
	var a = 0
	
	for i in range(size - 1, -1, -1):
		if txts[i].find("[sub_resource type=\"ImageTexture\" id=") != -1:
			var value = int(txts[i].get_slice("=", 2).get_slice("]", 0))
			
			for y in 4:
				txts.remove(i)
			
			txts[i] = "[ext_resource path=\"res://assets/Player/Sheets/%s.png\" type=\"Texture\" id=%s]" % [names[a], value]
			a += 1
	
	file.close()
	_e = file.open(PATH4, File.WRITE)
	file.store_string(txts.join("\n"))

Add a track in the animation player

for anim_name in anim_names:
	var anim := get_animation(anim_name)
	var idx := anim.add_track(TRACK_METHOD)
	
	anim.track_insert_key(idx, 0, {
			"args": [ anim_name ],
			"method": "change_spritesheet"
		})
	anim.track_set_path(idx, NodePath("Viewport/AnimatedSprite"))

Reference Template

(This will be done by code, use the same specifications as Godot 4 documentation in comments)

Reference

Explains how a script's functions work and how they should be used.

Inheritance

If the script extends from another (and why)

Function

Fields

Changelog

Meant to show changes made to the technical document, not the game.
> The date is written in YYYY/MM/DD.
The version follows semantic versioning:.
MAJOR version if you are making major overhaul.
MINOR version if you add a new page.
PATCH version if you are modifying an existing page.

AuthorDateVersionModifications
Smks2025/05/110.42.0Added narrative section
Smks2025/03/010.41.0Added story segment in introduction
Smks2025/01/110.40.0Updated chapter 1 level design.
Phnix2024/11/140.39.0Added a page: development\features\levels\stairs.md
Phnix2024/11/110.38.0Added a page: development\features\levels\walls.md
Phnix2024/11/110.37.0Added a page: development\features\levels\pits.md
Smks2024/10/240.36.0Wwise Refactor and Audio documentation
Ace2024/10/240.35.0Enemy Refactor (Rabbit, Snake, Bee Swarm) GDD
Ace2024/10/170.34.0Items V2 GDD
Smks2024/10/030.33.0Level design - getting started/guide
Smks2024/09/200.32.0Started level design docs
Smks2024/09/180.32.0Narrative updates Chapter 1 + 2
Acetrologer2024/09/170.31.0Introduction to the game
Smks2024/09/170.30.0UX/UI principles and colour theme
eh_jogos2024/09/070.29.0Adds "Aim Guide and Aim Assist" page
Smks2024/09/070.28.0Updated controls.md so its ready for implementation 2.0
Smks2024/09/010.27.0Documentation overhaul, based on different specialist areas
eh_jogos2024/08/070.26.3Added instructions for placing ponds in NxN levels in "Multi Screen Levels" page.
Shoyguer2024/08/070.26.2Fixed Controls GDD and Gameplay > Controls, according to feedback.
Smks2024/08/040.26.1Fixed MDBook plugins + new Flowchart Page using Mermaid.js.
Smks2024/08/040.26.0Added MDBook plugins + new Preview Page in the intros.
Smks2024/08/030.25.0Added Narrative GDD Updates #2
Shoyguer2024/08/020.24.0Added GDD Controls & updated the Control Remap.
eh_jogos2024/07/290.23.0Added Multi Screen levels page, updated GameplayCamera page, moved testing_caves.md and levels.md and related images to a levels folder outside of features to reflect the new summary structure
Smks2024/07/270.22.1Added GDD Weapon documentation v2
Smks2024/07/260.22.0Added GDD Weapon documentation
Smks2024/07/200.21.0Added GDD documents and general cleanup of documentation to be better structured.
Smks2024/07/190.20.0Updated README to avoid confusion on mdBook.
Shoyguer2024/07/120.19.0Enemy documentation changed, and everything related to enemy data and LoadDB was moved to other pages inside "database".
eh_jogos2024/07/050.18.0Added Scripted Scenes, SpawnPosition and Notifications pages
Smks2024/06/300.17.3Updated binary asset reference
Shoyguer2024/06/260.17.2Added documentation on Enemy Attributes and Balance. Also added Shoyguer name to team.md file
Smks2024/05/270.17.1Patched documentation on how the new CI works
Smks2024/05/260.17.0Added documentation on how the new CI works
eh_jogos2024/05/010.16.0Added the pages: demo featyre tag, version label
Smks2024/04/210.15.1Added documentation on how to write GUT tests, and updated development process
Phnix2024/03/280.15.0Added a page: reference/build_godot_resources.md
Phnix2024/03/280.14.0Added a page explaining how the player's animated sprite works.
Smks2024/03/250.13.1Patched the how to raise a PR to include checklist steps and mention of incremental version rollout
eh_jogos2024/03/250.13.0Added the pages: Position and Sit Markers, CutsceneVignette, Changed GameplayCamera to be inside Entities in the SUMMARY
Smks2024/03/240.12.1Added Getting started - Raising a PR documentation
eh_jogos2024/03/060.12.0Added the pages: Part_Gameloop, CaveWarps and Testing Caves
Phnix2024/02/260.11.0Added the addon "Helper Panel" in the feature list
Smks2024/02/100.10.0Added new enemies in (Bison, Boar, Rabbit, Mosquito, Hornet)
Phnix2024/02/050.9.0Added Emote page in features
eh_jogos2024/01/270.7.1Added a paragraph for how to load save slots in save_game page
eh_jogos2024/01/240.7.0Added info on making huds transparent when player is under them
eh_jogos2024/01/240.6.1Updates to DebugMenu page
eh_jogos2024/01/240.6.0Added Gameplay Camera page in features
eh_jogos2024/01/230.5.0Added Debug Menu page in features/ui
Phnix2024/01/210.4.2Updated the meaning block of the page to blockquotes
Phnix2024/01/210.4.1Updated the changelog versions
Phnix2024/01/210.4.0Added the plans page
eh_jogos2024/01/210.3.1Improved Save Game page
Phnix2023/12/190.3.0Added the NPC feature
Smks2023/12/020.2.0Added Game Save feature
Phnix2023/11/070.1.0Created the mdBook structure

Template

Meant to explain how a script/feature works

Goals

What is the goal of the feature

How it works

Macro overview

With what script it communicates

With what script it communicates, (and why) (Is it using a Autoload, sending events, ...)

Helper Panel

Goals

This add-on is a multi-purpose dock that is designed to help you with all sorts of things.
It adds a small dock to the bottom right of the screen. (Not enabled by default)

Add new categories

You can add new categories to the dock by modifying these two files:

Quest Helper

This category helps making quests, by focusing the file system dock on the appropriate quest folders.

Battle Manager Class Overview

The Battle Manager is a global class responsible for controlling the enemies' turns when engaged in battles against the player.

Functions:

get_scene_enemies()

Populates the scene_enemies array with enemies from the current level room and connects their signals to the BattleManager.

_process(delta)

Updates the paused status based on the timer.

trigger_enemy_battle(enemy:Enemy)

Adds an enemy to the turn_order and changes its behavior to "Battle".

enemy_was_attacked(enemy:Enemy)

Handles an enemy being attacked during its turn or triggers battle mode if not already in battle.

on_enemy_died(enemy:Enemy)

Removes a dead enemy from the turn_order and manages turn passing if it was the current turn.

enemy_attacked(enemy:Enemy)

Handles the event when an enemy attacks, passing the turn or triggering battle mode.

pass_turn()

Advances to the next turn in the turn_order and manages turn and round rest times.

is_enemy_turn(enemy)

Checks if it is the specified enemy's turn and if the battle is not paused.

Battle Manager Class Overview

The Battle Manager is a global class responsible for controlling the enemies' turns when engaged in battles against the player.

Functions:

get_scene_enemies()

Populates the scene_enemies array with enemies from the current level room and connects their signals to the BattleManager.

_process(delta)

Updates the paused status based on the timer.

trigger_enemy_battle(enemy:Enemy)

Adds an enemy to the turn_order and changes its behavior to "Battle".

enemy_was_attacked(enemy:Enemy)

Handles an enemy being attacked during its turn or triggers battle mode if not already in battle.

on_enemy_died(enemy:Enemy)

Removes a dead enemy from the turn_order and manages turn passing if it was the current turn.

enemy_attacked(enemy:Enemy)

Handles the event when an enemy attacks, passing the turn or triggering battle mode.

pass_turn()

Advances to the next turn in the turn_order and manages turn and round rest times.

is_enemy_turn(enemy)

Checks if it is the specified enemy's turn and if the battle is not paused.

Behavior

Behaviors helps NPCs and Enemies to work with a limited set of states, this gives flexibility on controlling how they act in the world. It is basically a state machine within a state machine.

How behaviors work:

Behaviors are managed by the class BehaviorManager. Each behavior contains a StateManager with a unique set of states for the current behavior. It can be used to control state flow for NPCs and Enemies.

BehaviorManager

The BehaviorManager is initialized by the owner, then it initializes the StateMachine which then initializes all the states passing the reference of the owner responsible for all the states and behaviors.

init

It is called by the owner, initializing all the behaviors and states within each behavior. It then passes the reference of the owner & change to the initial state for all the behaviors.

change_behavior

It changes the current behavior, runs the exit() function from the previous behavior and then enter() function from the current behavior, acting as some sort of _ready() and exit_tree() for the states.

physics_process & process

It is fueled by the _physics_process & _process from the owner. It won't run, unless the behavior & state is active.

StateManager

The StateManager works similarly to the BehaviorManager, however it controls only states, instead of states & behaviors.

BaseBehavior

BaseBehavior is the base class that any other base behavior can inherit.

Example: The BaseBehavior contains all the variables and functions necessary to work within the BehaviorManager. BaseBehavior > EnemyBaseBehavior > PouncerBehavior

BaseState

BaseState is the base class that any other base state can inherit.

Example: The BaseState contains all the variables and functions necessary to work within the StateManager. BaseState > EnemyBaseState > IdleState

Flow

Image

Adding a new base behavior:

To add a new base behavior you need to go through two steps.

1) Add a base behavior script extending BaseBehavior in res://src/AI/BehaviorManager/BaseBehaviors/ and name it NameBaseBehavior.gd, change the "Name" to whatever name your behavior has.

2) Each base behavior must have a new init function to pass the reference of the context. Behaviors must never extend the BaseBehavior directly.

class_name EnemyBaseBehavior
extends BaseBehavior

var enemy

func init(_context) -> void:
	enemy = _context
	state_manager.init(enemy)

func enter() -> void:
	.enter()

func exit() -> void:
	.exit()

func process(_delta: float) -> void:
	pass

func physics_process(_delta: float) -> void:
	pass

Adding a new behavior:

To add a new behavior you need to go through six steps.

1) Add a behavior script extending the base behavior you want in res://src/AI/BehaviorManager/Behaviors/ and name it NameBehavior.gd, change the "Name" to whatever name your behavior has.

2) Add a new Node scene with the behavior script just created in res://src/AI/BehaviorManager/Behaviors/.

3) To the recently created behavior scene, create a new StateManager Node as a child and attach the StateManager.gd to it.

4) Add all the necessary states as children of the StateManager node & attach the state script to each.

5) Set the Starting State NodePath parameter of the StateManager to the desired starting state you want for the behavior.

6) Don't forget to initialize the BehaviorManager from the entity you will be using in the _ready function.

class_name PouncerBehavior
extends EnemyBaseBehavior

export var proximity_distance:int = 80

func enter() -> void:
	.enter()

func exit() -> void:
	.exit()

func process(_delta: float) -> void:
	var state = state_manager.current_state.name
	if state != "Telegraph" and state != "Attack":
		if context.sight_target:
			var distance = context.global_position.distance_to(context.sight_target.global_position)
			if  distance <= proximity_distance:
				context.change_state("Telegraph")
	

func physics_process(_delta: float) -> void:
	pass

Adding a new base state:

To add a new state you need to go through two steps.

1) Add a base state script extending BaseState in res://src/AI/BehaviorManager/BaseStates/ and name it NameBaseState.gd, change the "Name" to whatever name your base state has.

2) Each base state must have a new init function to pass the reference of the context. States must never extend the BaseState directly.

class_name EnemyBaseState
extends BaseState

var enemy:Enemy
export var animation_name:String

func init(_context):
	enemy = _context

func enter() -> void:
	enemy.animation_player.play(animation_name)
	.enter()

func physics_process(_delta: float) -> void:
	pass

func process(_delta: float) -> void:
	pass

func exit() -> void:
	.exit()

Adding a new state:

To add a new state you need to go through six steps.

1) Add a state script extending the base state you want in res://src/AI/BehaviorManager/States/ and name it NameState.gd, change the "Name" to whatever name your state has.

2) Add a new Node scene with the state script just created in res://src/AI/BehaviorManager/States/.

#Idle State Example
extends EnemyBaseState

func enter() -> void:
	.enter()

func exit() -> void:
	.exit()

func process(_delta: float) -> void:
	.process(_delta)

func physics_process(_delta: float) -> void:
	.physics_process(_delta)

Attack Node Class Overview

The AttackNode is a base class responsible for managing attack actions for any entity that can execute attacks, typically through an attack state. This class can be instantiated by any enemy or entity that performs attacks and provides core functionality for handling damage, knockback, and attack range.

Functions:

init(_enemy, _attack_state)

  • Parameters:
    • _enemy: The entity (enemy, boss or character) executing the attack.
    • _attack_state: The current state of the attack execution.
  • Description: Initializes the AttackNode with the entity and attack state, configuring the base damage and knockback based on the entity’s hitbox.

enter()

  • Description: Called when the attack begins. This function temporarily updates the entity’s hitbox damage and knockback strength based on the attack’s multipliers. It also sets these values in the entity's attack hitbox, making it active.

exit()

  • Description: Called when the attack ends. It restores the entity's hitbox damage and knockback strength to their base values, deactivating the attack hitbox.

Class Properties:

  • attack_state: The current state of the attack (e.g., charging, executing, finishing).
  • attack_name: The name of the attack being performed (empty by default).
  • base_damage: The base damage that the entity can inflict with its attack.
  • base_knockback: The base knockback strength of the attack.
  • damage_mp: A damage multiplier applied to the attack (default is 1.0).
  • enemy: The entity performing the attack.
  • attack_range: The range of the attack, which determines how far the attack can reach.
  • telegraph_anim_name: The name of the animation that plays before the attack executes.

Wwise - Centralized Audio System

Wwise is used to manage and control all audio elements across enemies, the player, and NPCs in the project, providing a dynamic and adaptable soundscape.

Goals

The goal of this feature is to centralize audio functionality for all entities within the game, ensuring consistent and efficient management of sound effects (e.g., idle, charge, attack, death) through a unified audio system. By extending from BaseAudio.gd, each entity (Player, Enemy, NPC) has customizable audio behaviors aligned with its unique actions, reducing redundancy and enhancing maintainability.

How it works

The BaseAudio.gd script serves as the foundational audio manager, handling sound playback, stop functions, and real-time parameter controls (RTPC). Each specific entity (e.g., player, NPC, or enemy) inherits from BaseAudio and further defines its unique sounds, such as attack, hurt, or alert. The centralized BaseAudio manages audio events via Wwise, allowing smooth communication with Wwise functions such as post_event for sound playback and set_rtpc for real-time parameter changes.

Each entity-specific script (e.g., EnemyAudio.gd, PlayerAudio.gd, NPCAudio.gd) extends BaseAudio and customizes sounds based on the entity's actions. For example:

  • Enemies: The EnemyAudio.gd script defines sounds for various enemy actions (e.g., charge, hurt, death).
  • Player: The PlayerAudio.gd script manages unique player sounds, such as footstep sounds affected by terrain, weapon attack sounds, and environmental interactions.
  • NPCs: The NPCAudio.gd script has a basic setup to control general sounds for NPCs, such as idle or footstep sounds based on terrain.

Wwise ensures 2D positional tracking of sounds for spatial coherence and manages object-specific registration for each instance.

With what script it communicates

  • Scripts: The BaseAudio.gd script communicates with each entity-specific audio script (EnemyAudio.gd, PlayerAudio.gd, NPCAudio.gd).
  • Autoload: Utilizes Wwise as an autoload, allowing functions such as post_event, set_rtpc, and set_2d_position to be universally accessible within the project.
  • Events: Sounds are triggered through Wwise event IDs. For example, the post_event method is called to play a sound, while stop_event halts the sound playback when required.

This centralized audio system ensures a modular and maintainable approach to sound management across all entities. Each entity's unique sounds and behaviors are implemented through inheritance from BaseAudio.gd, centralizing functionality while allowing for customization.

Cutscenes

Cutscenes will be a range of no interaction to very limited interaction. E.g. walking to move the plot forward.

For now, there is only one "placeholder" generic cutscene scene so that I could implement Quest 005 that required it. It plays a simple "loading bar" animation and then, if the current active quest is completed, it will call its respective Quest Announcement.

As a generic placeholder, it should work with whatever is the current active quest.

Goals

The goal of the Cutscenes in this game are primarily used for storytelling and narrative progression. They provide a cinematic means to convey the game's plot, introduce new characters, and establish the setting and context of the game's world. Through cutscenes, we can create emotional impact and deepen the player's immersion in the story. They also serve to reward players, marking the completion of key objectives or levels. Additionally, cutscenes can be used to provide necessary exposition or tutorial information in a more engaging way than simple text or dialogue boxes.

How it works

The placeholder scene

You can find the placeholder scene at res://src/Part_PlaceholderQuestCutscene.tscn. It's script is right beside it and will work automatically doing the following steps:

  1. It will connect to the Event screen_change_fade_out_finished, and play the main animation on its callback.
  2. The AnimationPlayer is configured to automatically transition from its main animation to fade_out animation.
  3. The animation_finished signal from the AnimationPlayer node is connected to the script and once fade_out finishes, it will try to complete the current active quest, which should show its quest announcement, or an error if there is no active quest
    • In the case that there was an error, it will stop here and be locked on a black screen
  4. Once you "accept" the quest completed announcement, it will proceed to the "Next Day"

How the Quest cutscene is triggered

Quest 005 is the only one we have a cutscene so far, so understanding what it asked will help to understand the choices made for this implementation. On Quest 005 description, once we return to Campsite, we should find it empty and a cutscene should start.

But LinearWorld only cares about moving the player between pre-existing levels, so it would just move the player to normal Campsite. From there we would either have to have custom logic on the Campsite scene, to identify that this is Quest 005 final step and change itself, or have some way for Quest 005 to trigger changes on it.

If we start to have more cutscene and Level0_0 scene has to know about all of them, things could get messy. So it would be easier to transition to another "Part_" scene entirely, where we can have a customized Level0_0 and just animate or script the cutscene there the way we want it, but then how do we make LinearWorld understand that this particular transition to Level0_0 should be different?

For that 3 new FuncRef properties were added to RuntimeData.tres (FuncRef are objects that hold a reference to another object and a function name so that it makes it easier to call "remote" functions):

  • funcref_custom_game_screen_condition - LinearWorld will use it when changing levels/locations to check if there is a special condition activated
  • funcref_custom_game_screen_play - if there is any special condition and it returns true, LinearWorld will use this FuncRef instead of its normal logic.
  • funcref_custom_game_screen_finished - This can be called by the cutscene or custom screen when it finished what it needs to do.

This way, the logic for the custom screen/cutscene/special circumstance can stay encapsulated wherever it makes more sense and in whatever script should be responsible for it. In Quest 005 case, it's in res://src/Quests/Resources/Torion/custom_step_logic/005_step_02_trigger_cutscene.gd. This step will be responsible for injecting the relevant funcrefs in RuntimeData.tres and once the player triggers the condition by trying to go back to Campsite, its funcrefs will take over and control the game to go to the correct cutscene.

This approach allows for the "entity" that is responsible for the "cutscene" to handle everything related to it directly, with a "simple" and expect api. Not all of the funcrefs are needed, and outside of triggers that are "enter level/location X" we can just directly trigger a screen change with Events, but for anything that needs to be triggered on level/location changes, these three properties can be used to highjack control from it.

There are also two helper methods on RuntimeData:

  • should_use_custom_game_screen_transition() - will do all the relevant checks to see if funcrefs are valid and special condition is passed.
  • custom_game_screen_completed() - will check if funcref_custom_game_screen_finished is valid and if it is, call it.

With what script it communicates

  • RuntimeData.gd - So that it can inject funcrefs in it where LinearWorld can access them
  • LinearWorld.gd - Since it's responsible for navigating between levels/locations and the trigger for the cutscene is "navigating to level/location X"
  • Specific Quest and/or Cutscene scripts, as needed.

Enemies

Every enemy is unique, and they all will have different mechanics to play around, to the game is more fun and engaging for the player. When exploring the map, the player will face two types of enemies:

  1. Creatures: Refers to animals of all kinds from mammals to invertebrates,
  • Mammals:

    • Bird
    • Rabbit
    • Deer
    • Ibex
    • Boar
    • Bison
    • Rhino
    • Mammoth
    • Bat
    • Snake
    • Wolf
    • Bear
    • Smilodon
  • Invertebrates:

    • Ant
    • Hornet
    • Bee Swarm
    • Spider
    • Mosquito
  1. Humans: Refers to human enemies, from tribes that are agressive towards the player

More info TBA

Enemy Creature Stats

  • species: Defines which species a creature belongs to, examples of species: Ant, Hornet, Spider, Bison, Rabbit, Bear, Snake and so on.

  • variant: Defines a variant of a species. The default variant is A. All the other variants are stronger than the default one, and can have: More health, more attack speed, more speed, etc.

  • behaviour: Defines the behaviour of the species. Some are territorial, so if you enter their territory area, they will attack you to make you leave their area. Others are

  • max_health: Max amount of health points this creature can have (For reference, Adira has 100 Health Points). When Health Points == 0, the creature will die.

  • max_poise: Max amount of poise points this creature can have (For reference, Adira has 50 Poise Points). When Poise Points == 0, the creature will enter a staggered state for 2 seconds.

  • health_damage: Determines how much damage an enemy attack will deal to the Health Points.

  • poise_damage: Determines how much damage an enemy attack will deal to the Poise Points

  • walk_speed: Defines how fast a creature will roam when they are in the "idle" state.

  • run_speed: Defines how fast a creature will sprint when they are engaging in combat or fleeing the battle.

  • weight: Defines the creature weight, to determine if when attacking, the target will be knockbacked or not. If the attacker have equal weight, the knockback will be minimal. If the attacker have way more weight, the knockback will be stronger. If the attacker have less weight there will be no knockback.

  • attack_speed: Defines how quickly a creature will initiate their next attack, after the first attack have been completed. Those attacks need to be in the same attack pattern.

  • range: Defines how far this creature attacks will reach.

  • attack_pattern: The number of attack patterns a creature have. Still in the works, may need to be reworked.

  • attach: Defines if a creature will be able to attach to the player. Example: A mosquito attacks the playing, by attaching to them, and then sucking blood, depleting Adira's Health Points. The player will need to engage in a minigame to detach the enemy.

For more information, you can check the following GDDs:

Enemy Humans Stats

Stats TBA

Enemies

Every enemy is unique, and they all will have different mechanics to play around, to the game is more fun and engaging for the player. When exploring the map, the player will face two types of enemies:

  1. Creatures: Refers to animals of all kinds from mammals to invertebrates,
  • Mammals:

    • Bird
    • Rabbit
    • Deer
    • Ibex
    • Boar
    • Bison
    • Rhino
    • Mammoth
    • Bat
    • Snake
    • Wolf
    • Bear
    • Smilodon
  • Invertebrates:

    • Ant
    • Hornet
    • Bee Swarm
    • Spider
    • Mosquito
  1. Humans: Refers to human enemies, from tribes that are agressive towards the player

More info TBA

Enemy Creature Stats

  • species: Defines which species a creature belongs to, examples of species: Ant, Hornet, Spider, Bison, Rabbit, Bear, Snake and so on.

  • variant: Defines a variant of a species. The default variant is A. All the other variants are stronger than the default one, and can have: More health, more attack speed, more speed, etc.

  • behaviour: Defines the behaviour of the species. Some are territorial, so if you enter their territory area, they will attack you to make you leave their area. Others are

  • max_health: Max amount of health points this creature can have (For reference, Adira has 100 Health Points). When Health Points == 0, the creature will die.

  • max_poise: Max amount of poise points this creature can have (For reference, Adira has 50 Poise Points). When Poise Points == 0, the creature will enter a staggered state for 2 seconds.

  • health_damage: Determines how much damage an enemy attack will deal to the Health Points.

  • poise_damage: Determines how much damage an enemy attack will deal to the Poise Points

  • walk_speed: Defines how fast a creature will roam when they are in the "idle" state.

  • run_speed: Defines how fast a creature will sprint when they are engaging in combat or fleeing the battle.

  • weight: Defines the creature weight, to determine if when attacking, the target will be knockbacked or not. If the attacker have equal weight, the knockback will be minimal. If the attacker have way more weight, the knockback will be stronger. If the attacker have less weight there will be no knockback.

  • attack_speed: Defines how quickly a creature will initiate their next attack, after the first attack have been completed. Those attacks need to be in the same attack pattern.

  • range: Defines how far this creature attacks will reach.

  • attack_pattern: The number of attack patterns a creature have. Still in the works, may need to be reworked.

  • attach: Defines if a creature will be able to attach to the player. Example: A mosquito attacks the playing, by attaching to them, and then sucking blood, depleting Adira's Health Points. The player will need to engage in a minigame to detach the enemy.

For more information, you can check the following GDDs:

Enemy Humans Stats

Stats TBA

LoadDB

The LoadDB is a standalone scene with the main focus of importing a single file or multiple files with .csv data, the data will then be transformed into multiple resource files that will be utilized by the game for multiple purposes.

At the moment those are the types of files that can be mass imported:

  • Enemy stats
  • Weapon stats

Importing data

1) You will first need to access the spreadsheet with the values and stats: res://src/CombatData/Data/

Don't forget to navigate through the files to find what you are looking for to edit.

Bottom Pages

2) After changing everything, you need to export the spreadsheet as a ".csv" file, with the following name structure, formatting and extension: Type + SpreadsheetPage + ".data"

Examples:
"EnemyCreature.data"
"WeaponDagger.data"

Explanation:

  • Type: If the data is about "Weapon", "Enemy", etc.
  • SpreadsheetPage: The name of the page from the Spreadsheet being exported. For Enemies, for example, there is: "Creature" and "Human".
  • The extension: As you can see, the extension MUST BE changed to ".data", otherwise, it won't work.

3) Now move the file to the folder: src/CombatData/Data

4) Next you need to run only the scene LoadEnemyDB: res://helpers/LoadDB/LoadDB.tscn. Now it's done! Every resource file will be created.

LoadDB

5) Now select the type of Data you want to import.

6) Then select which files (you can select multiple) you want to import and press "Start".

7) If you want to import anything else from another type of Data, feel free to click: "Back", then import more files.

Weapons

Weapons play a vital role in a 2D action game, significantly enhancing the player's combat capabilities and aiding in progression through various levels. Each weapon comes with unique attributes such as attack speed, damage output, and range, allowing players to select the most suitable tool for different combat scenarios. This variety not only keeps the gameplay engaging but also allows players to develop and refine their strategies, making the game more immersive and challenging.

Equipping Weapons

Once a weapon is unlocked, it becomes permanently available and visible in the inventory, accessible via the HUD. Players can switch between equipped weapons using specific controller buttons.

For instance, if two weapons are unlocked, using the L2 and R2 buttons rotates the equipped weapon:

  1. Unarmed (Fist and Kick) is equipped by default.
  2. Press 'R2' to switch to 'Spear.'
  3. Attack using the Spear.
  4. Press 'R2' again to revert to 'Unarmed.'
  5. Press 'L2' to switch back to 'Spear.'

The choice of weapon persists throughout the game.

Types of Weapons

Weapons are unlocked in the following order:

  1. Unarmed (Available from the start)\
    • Fast attacks with low health and poise damage.
  2. Spear (Unlocked in the first narrative scene)\
    • Long reach with high health damage but slow attack speed.
  3. Dagger\
    • Fast attacks are similar to unarmed but with more damage and low block efficiency. High stealth multiplier but low overall damage compared to other weapons.
  4. Axe\
    • Very slow attack speed with high health damage and average poise damage. Poor stealth multiplier.
  5. Club\
    • Medium attack speed, average health damage, and high poise damage. Medium stealth multiplier.
  6. Javelin\
    • Throwable with good health and poise damage. Long draw time and recoverable from the map.
  7. Bow\
    • Shoots arrows with good health damage. Long draw time and recoverable arrows.
  8. Slingshot\
    • Shoots rocks with low health damage but good poise damage. Quick draw time and high stealth multiplier.

Weapon Upgrades (v2)

Each weapon may have upgrade options that slightly enhance its effectiveness. For example:

  • Spear
    • Wooden Spear (Basic)
    • Stone Spear (Improved)
    • Flint Spear (Advanced)

Demo Mode

Goals

To be able to add custom project settings and in game logic to separate "demo" specific behavior from the standard builds.

How it works

Configuring feature tags in Export screen on Godot First we need to create extra export presets, click on the "Features" tab, and add the "demo" tag to it, or any other number of tags for this particular export preset.

Then, anywhere on code you can check for the existence of any feature tag to trigger any special logic related to it by using OS.has_feature(Constants.TAG_DEMO) Example of using OS.has_feature(Constants.TAG_DEMO)

For adding custom Project Settings options, you'll need to: Image of steps needed to add a Project Setting override for any feature tag

  1. Click the "name" of the setting you want to override
  2. Click the button "Override for..." on the top right of the Project Settings screen, to the left of the "Delete" button (be careful not to misclick the "Delete" button)
  3. Choose the desired "feature tag" from the drop down list
  4. A new entry will be created in the format "setting_name.feature_tag" and you can change it's value to whatever you want! When a build is exported with this feature tag, the value of that setting will be overriden to this value.

Testing

Unfortunately, it is not possible to test custom feature tags in the editor directly. Running the game in the editor will not apply any custom feature tags, even from export presets marked as "Runnable".

Marking an export preset as "Runnable" only affects what preset will be chosen for one click deploys, and in those, you can test for feature tags normally, but on Godot 3.x they only work for HTML and android builds.

So we need to export the game with the export preset that has the tag we need to test and test it manually.

Alternatively, you can create a custom gut test or scene to forcedly test the functions or logic that will be called in the demo build, but you can't test for the presence of the demo tag triggering this logic on gut or the editor.

With what script it communicates

To find out what is different on "demo" mode, run a project wide search for OS.has_feature(Constants.TAG_DEMO)

For now it is affecting:

  • version label - it adds a "demo" to it
  • SMKSIntroSplashScreen - makes a "demo" warning label visible
  • QuestAnnouncement - Stops game after completing a quest and locks the player in a "Thanks for playing the demo please give feedback" screen. The player can go back to main menu to play the demo from scratch if they want, but can't progress further than this.

For finding all Project Settings that have a custom demo "override", open it in something like visual studio code, and search for .demo

The current overrides are for:

  • name - Changes project name to "Tribe of the Accord Demo", which is the name that will appear in the window or task bar icon.

Emotes

Goals

The emote node can be added to any entity to display an emote bubble conveying the emotion of that entity.

Emote spritesheet

How it works

Add the Emote node to any Node2D scene, to play the animation call the function show_emote() with the appropriate enum values for bubble_type and icon_type.

Emotes

Goals

The emote node can be added to any entity to display an emote bubble conveying the emotion of that entity.

Emote spritesheet

How it works

Add the Emote node to any Node2D scene, to play the animation call the function show_emote() with the appropriate enum values for bubble_type and icon_type.

Enemies

All enemy scenes inherit from the res://src/EnemiesNew/Enemy.tscn scene

Managing Attributes & Rebalance

enemies have a set of attributes that define how they will behave and how strong they are. below there is a list of all the attributes an enemy will have, they share the name exact formatting as in the code:

Creatures

  • species: Defines which species a creature belongs to, examples of species: Ant, Hornet, Spider, Bison, Rabbit, Bear, Snake and so on.

  • variant: Defines a variant of a species. The default variant is A. All the other variants are stronger than the default one, and can have: More health, more attack speed, more speed, etc.

  • behaviour: Defines the behaviour of the species.

    • Fearful: They will usually avoid the player and may even try and run if the player gets too close to them. But if attacked, they may attack back.

    • Territorial: They will alert Adira if she is in their space, and they will attack the player if the player comes too close or attacks them.

    • Predatory: They will instantly attack Adira the moment they notice her. They have a good sense of smell, and can’t be sneaked upon. If the player gets close enough, they will notice Adira.

    • Reserved: The Enemy - unless attacked - minds its own business and continues to graze/do its own thing. If attacked will go into a ‘Defensive’ mood. When reserved they will walk around the level and graze.

    • Curious: The Enemy will follow the Player out of curiosity. If Adira lets them get too close, attack the animal or run away, they will attack you. If Adira keeps her distance from him and doesn't run, just walk, they will not attack her. They will just return to their original location.

    • Controlling: Used for controlling the enemies in cutscenes.

  • max_health: Max amount of health points this creature can have (For reference, Adira has 100 Health Points). When Health Points == 0, the creature will die.

  • max_poise: Max amount of poise points this creature can have (For reference, Adira has 50 Poise Points). When Poise Points == 0, the creature will enter a staggered state for 2 seconds.

  • health_damage: Determines how much damage an enemy attack will deal to the Health Points.

  • poise_damage: Determines how much damage an enemy attack will deal to the Poise Points

  • walk_speed: Defines how fast a creature will roam when they are in the "idle" state.

  • run_speed: Defines how fast a creature will sprint when they are engaging in combat or fleeing the battle.

  • weight: Defines the creature weight, to determine if then attacking, the target will be knockbacked or not. If the attacker have equal weight, the knockback will be minimal. If the attacker have way more weight, the knockback will be stronger. If the attacker have less weight there will be no knockback.

  • attack_speed: Defines how quickly a creature will initiate their next attack, after the first attack have been completed. Those attacks need to be in the same attack pattern.

  • range: Defines how far this creature attacks will reach.

  • attack_pattern: The number of attack patterns a creature have. Still in the works, may need to be reworked.

  • attach: Defines if a creature will be able to attach to the player. Example: A mosquito attacks the playing, by attaching to them, and then sucking blood, depleting Adira's Health Points. The player will need to engage in a minigame to detach the enemy.

For more information, you can check the following GDDs:

How to change enemies attributes

If you need to make heavy changes to their attributes, renaming them, adding new creatures, etc, you first need to delete every folder inside:
For creatures: res://src/CombatData/Resources/Creature/
For humans: res://src/CombatData/Resources/Human/

After that, or if you have simple changes in values, you need to follow the step-by-step guide down below:

1) To change enemy data, you have to access Enemies Spreadsheet, and change the attribute values there.

2) There are two spreadsheets in this document, one for Creatures, and the other for Humans.

3) After changing everything, you need to export the spreadsheet as a ".csv" file, with the following name structure, formatting and extension:
If creature: EnemyCreature.data.
If human: EnemyHuman.data

4) Now move the file to the folder: src/CombatData/Data

5) Next you need to run only the scene LoadEnemyDB, inside: res://src/CombatData/. Now it's done! Every resource file will be created.

AI

Enemy works with a behavior structure, with the help of a behavior manager. Each enemy can have unique behaviors & states within behaviors. Check Behavior Section for more information.

NPC

Goals

Is able to move around the map (walk/run, go to a location).
Can talk and give quests to the player.

How it works

CaveWarps

Goals

Cave Warps are an "entity" used to get out of caves (ProceduralWorld) and get back to LinearWorld.

How it works

They can be placed in any cave scene, but are supposed to go into StartLevel_*.tscn and EndRewardLevel_*.tscn scenes. Currently they usually start invisible and are "revealed" in two situations:

  • On StartLevel scenes, they double as starting points and are revealed once the player moves away from them
  • On EndRewardLevel scenes they are revealed once all chests in the scene are opened.

The sprite is currently a placeholder white circle, but once it is changed to it's final art, this "revealing" logic can be replaced for whatever is needed.

Using CaveWarp in StartLevel scenes

Setting up Cave Warps in the Scene

  1. Place it inside the main YSort of the scene
  2. Make sure it's property is_final_room_warp is set to false.

Placing Cave Warps 3. Move the warp to whatever position you want, avoiding any space near doors.

It's important to avoid doors so that we don't give the false impression the player came into the Cave through that door.

Player Starting Position

Also, by moving the CaveWarp, it is automatically updating the value of the Room's player_starting_position. To make sure this is working just test the room by pressing F6 or clicking the Play Scene button on the top right.

Play Scene button

For more info on debugging options for caves see Testing Caves (Procedural World).

Using CaveWarp in EndLevelReward scenes

Setting Up CaveWarps on EndLevelReward

  1. Place it inside the main YSort of the scene
  2. Make sure it's property is_final_room_warp is set to true.
  3. Open "Paths to Rewards" on the inspector and increase its Size to the same amount of "item chests" in the scene.
  4. For each of the values inside "Paths to Rewards" click on "Assign" and choose one of the ItemChest nodes.
  5. Move the warp to whatever position you want.

The CaveWarp will reveal once all the listed ItemChests are opened by the player. You can test it with F6 though, they won't drop any items in this case.

With what script it communicates

Only in the Editor it communicates with Room.gd so that it can be used as a tool to set player_starting_position. During runtime, it communicates with the player when the player is in range to show the action tooltip, but other than that it just listens to signals and sends out Events.

CaveWarps

Goals

Cave Warps are an "entity" used to get out of caves (ProceduralWorld) and get back to LinearWorld.

How it works

They can be placed in any cave scene, but are supposed to go into StartLevel_*.tscn and EndRewardLevel_*.tscn scenes. Currently they usually start invisible and are "revealed" in two situations:

  • On StartLevel scenes, they double as starting points and are revealed once the player moves away from them
  • On EndRewardLevel scenes they are revealed once all chests in the scene are opened.

The sprite is currently a placeholder white circle, but once it is changed to it's final art, this "revealing" logic can be replaced for whatever is needed.

Using CaveWarp in StartLevel scenes

Setting up Cave Warps in the Scene

  1. Place it inside the main YSort of the scene
  2. Make sure it's property is_final_room_warp is set to false.

Placing Cave Warps 3. Move the warp to whatever position you want, avoiding any space near doors.

It's important to avoid doors so that we don't give the false impression the player came into the Cave through that door.

Player Starting Position

Also, by moving the CaveWarp, it is automatically updating the value of the Room's player_starting_position. To make sure this is working just test the room by pressing F6 or clicking the Play Scene button on the top right.

Play Scene button

For more info on debugging options for caves see Testing Caves (Procedural World).

Using CaveWarp in EndLevelReward scenes

Setting Up CaveWarps on EndLevelReward

  1. Place it inside the main YSort of the scene
  2. Make sure it's property is_final_room_warp is set to true.
  3. Open "Paths to Rewards" on the inspector and increase its Size to the same amount of "item chests" in the scene.
  4. For each of the values inside "Paths to Rewards" click on "Assign" and choose one of the ItemChest nodes.
  5. Move the warp to whatever position you want.

The CaveWarp will reveal once all the listed ItemChests are opened by the player. You can test it with F6 though, they won't drop any items in this case.

With what script it communicates

Only in the Editor it communicates with Room.gd so that it can be used as a tool to set player_starting_position. During runtime, it communicates with the player when the player is in range to show the action tooltip, but other than that it just listens to signals and sends out Events.

CutsceneVignettes

Goals

Show black bars at the top and bottom of the screen to separate moments that are not playable. Though you still interact with dialogues on them.

How it works

It's a scene with two black ColorRect, that are animated by an AnimationPlayer.

It is inside the HUD scene, but it's not controlled by the Controller and the HUDStates, because it has an incompatibility with the DialogueState. Cutscenes will most likely use dialogue, and can do anything else realy. We can move the player, we might want to animate a menu, and any of these actions, but mainly, starting a dialogue, will change the HUDState and go out of the CutsceneState into DialogueState, making the Vignettes close.

So they live in the HUD scene because this way it's better to place it over or below other HUD elements, for example, above life bar, but below dialogue boxes. But to control them, you have to use two events, and it should be used case by case, depending on each cutscene's needs.

The events are:

  • cutscene_vignette_opened
  • cutscene_vignette_closed

To change the size of the black bars, just edit the margins in the show and hide animations in the scene's AnimationPlayer.

With what script it communicates

Just the Events script.

Gameplay Camera

Goals

Handle transition from level to level, camera effects like zoom and shake. It also handles navigation through multi screen levels as well as notifying game when level coordinates change inside a multi screen level.

How it works

Setting the camera to levels and level transitions

The Gameplay Camera lives inside LinearWorld and ProceduralWorld and is mostly controlled by them. It has two public functions they can use to set the camera to the initial level of a chunk/world and to move the camera between levels, and two other methods to toggle camera following the player on/off. All of these are being called automatically either in the world initialization or when transitioning between levels.

The GameplayCamera uses SceneTreeTween instead of normal Tween as its animations are simple, and SceneTreeTween is more modern and lightweight and compatible with the updated Tween API in Godot 4.x. Once it's 'move camera' tween ends, it emits the signal tweened_to_next_room so that LinearWorld or ProceduralWorld can continue handling the level transition from there.

Whenever we transition between levels, besides moving the camera, we also set the limits of the camera to the limits of the current level. This is not strictly necessary for single screen levels, but it makes working with multi screen levels easier and seamless.

On multi screen levels, the camera follow the player and emits the Events signal internal_level_coords_changed whenever the player moves to a new level coordinate.

The camera has a CameraAnchorDetector Area2D, which will handle locking the camera whenever it enters a CameraAnchor area. For more details about how to set up CameraAnchor nodes in multi screen levels, see Multi Screen Levels page.

The way they work overall is that CameraAnchorDetector calculates the level coordinate based on the CameraAnchor position, and then changes the limits of the GameplayCamera as if it was a single screen level at that coordinate. Once the player leaves the CameraAnchor, it restores the base limits of the level.

Zoom

They also are connected to two Events signals which control it's zoom level:

  • camera_zoomed
  • camera_zoom_reset

It is currently used for the Zoom in/out effect when entering/exiting a Pond.

Camera Shake

There is no way to control the camera shake directly, but whenever the player takes damage and the Event player_taken_damage is emitted, the Camera will shake based on the amount of damage inflicted.

With what script it communicates

It communicates directly with the CameraAnchorDetector which is its child, and mostly with Procedural/LinearWorld as they use the camera directly when setting up the world and when transitioning level, and their respective LevelChunkCoordinators as they handle moving between chunks.

Narrative scenes scripts may use move_camera like Part001_Tutorial for very specific and scripted sequences, while other scripts communicate with it either through sending Events or listening to its signals/Events.

Position and Sit Markers

Goals

PositionMarker and SitMarker are visual aids that can be placed anywhere to help guide the player.

How it works

Both are Area2Ds with a sprite and some animations.

For PositionMarker, it is only connected to the Area2D's body_entered signal, and once the player triggers it, the marker will hide and delete itself.

For SitMarker, it is connected to both body_entered and body_exited signals, once the player enters its area, it will show a tooltip alert to press the Sit button, and when the player sits, the marker will hide and delete itself.

To use them, you just need to instance their scenes and position them where you want. To make it easier, every Level has helper functions that you pass a position to it, and the level itself will place them:

  • add_position_marker(target_position: Vector2) - returns void.
  • add_sit_marker(target_position: Vector2) - this one returns the sit marker itself, so that you can connect to its tree_exited signal if you need to trigger something after the player sits.

For an example of usage of the SitMarker, you can look at Part_NightTime.tscn, we use it there to make Torion start telling the quest completed story once you sit by the fireplace.

With what script it communicates

None, though Room.gd knows how to instance them, and Level.gd forwards this to make it easier to use.

Inventory

TODO

Goals

How it works

The inventory is made up of 5 different scripts:

  • Inventory.gd
  • InventoryController.gd
  • InventoryItemManager.gd
  • InventoryModel.gd
  • InventoryStateMachine.gd

It is based on the Model View Controller design pattern.

With what script it communicates

Inventory

TODO

Goals

How it works

The inventory is made up of 5 different scripts:

  • Inventory.gd
  • InventoryController.gd
  • InventoryItemManager.gd
  • InventoryModel.gd
  • InventoryStateMachine.gd

It is based on the Model View Controller design pattern.

With what script it communicates

Weapons in the inventory

Weapons have been redesigned to be a permanent upgrade in the inventory rather than an item.

See:

Goals

To avoid re-coding the inventory system, the weapon system uses the existing inventory system. When an item is collected, if it is a weapon, the weapon system will store and handle the weapon along with the items (InventoryModel.gd > current_weapon_unlocked).

How it works

When an item is collected (InventoryController.gd > add_new_item() > InventoryItemManager.gd > add_new_item()) if the type of the item is "Weapon" then the add_new_weapon() function is called instead of .add_new_item().

The add_new_weapon() function checks if the weapon was already unlocked and if the new weapon we got is stronger than the one we already have. Then it returns a status enum { WEAPON_ADDED, WEAPON_REPLACED, WEAPON_NOT_REPLACED, WEAPON_FAILED } to the InventoryController.gd which prints the status to the output window.

If multiple weapons are unlocked, the user can cycle through them (see controls) (cycle_item_next and cycle_item_previous in the input map).

With what script it communicates

  • src\DebugItemManager.gd
  • src\HUD.gd
  • src\Inventory.gd
  • src\InventoryController.gd
  • src\InventoryItemManager.gd
  • src\InventoryModel.gd
  • src\ItemResource.gd
  • src\NumberLimits.gd

Narrative System

Chapter Events

Chapter Events are scripted sequences that trigger when a Player reaches a certain spot on the map.

Goals

Facilitate the creation of narrative scenes with reusable actions and a flexible structure.

How to create a Chapter Event

The first step to creating a Chapter Event is to create a ChapterEventPlayer and a ChapterEventTrigger.

All levels contain a proposed structure for setting up Narrative nodes:

  • Level
    • Narrative
      • Triggers: where ChapterEventTriggers should be set
      • Paths: where Path2Ds should be set
      • Players: where ChapterEventPlayers should be set

ChapterEventPlayer

To create a ChapterEventPlayer, simply add a new Node to the scene and choose ChapterEventPlayer.

In the inspector, you may change some of this event's behavior by modifying these properties:

  • ID: Must be a unique id (unique in the whole game), as it identifies the event in the player's save data. Following the placeholder suggestion (chapter_00/room_00/scene_00) should be enough;
  • Play Once: If true, this event will never trigger again after finished;
  • Is Interactive: If true, Player can interact (move, attack, etc.) during the event. If false, Player input is blocked and cutscene vignettes are triggered;
  • Trigger Path: Must point to this event's trigger.

Every child of this node must be a type of Event.

ChapterEventTrigger

To create a ChapterEventTrigger, instantiate it from the scene res://src/Narrative/ChapterEvent/ChapterEventTrigger.tscn - this scene has the base class with proper collision set.

You will need to add a CollisionShape2D node as child of the Trigger and set the area for triggering that event.

Adding Events

Events are added as nodes to the ChapterEventPlayer. You can see the full list of Events by opening the Create New Node dialog and searching for Event.

Every class that is a child of BaseChapterEvent can be used:

List of currently available events

EventAddNode

Adds a Node to the scene. Expects a path to a placeholder Position2D node and a PackedScene to instantiate.

EventCameraMove

Moves GameplayCamera along a curve. Expects a Path2D node that defines the movement.

EventCameraReturnToPlayer

Returns GameplayCamera to Player.

EventCameraSetPosition

Moves GameplayCamera instantanely to a set position. Expects a Node2D that defines the position.

EventChainParallel

Chains multiple events, playing them at the same time. Finishes when all events are finished.

Every child of this node must be a type of Event.

EventChainSequence

Chains multiple events, playing them in sequence, one after the other. Useful if you need to define a sequence inside of a EventChainParallel.

Every child of this node must be a type of Event.

EventNode2DMove

Moves any Node2D along a curve. Expects a Path2D node that defines the movement. Meant to be used to prototype scene while we don't have NPC or Enemy events.

EventPlayInnerMonologue

Plays an inner monologue.

EventPlayerMove

Moves the Player along a curve. Expects a Path2D node that defines the movement. Player will walk at its own speed.

EventRemoveNode

Removes a Node from the scene.

EventWaitForTimer

Waits for a timer.

How it works

A ChapterEventPlayer is responsible for executing a sequence of events in order. It must be connected to a ChapterEventTrigger. When its triggered signal is emitted, the ChapterEventPlayer will play its sequence.

When playing, ChapterEventPlayer iterates through its child nodes (each should extend BaseChapterEvent) and executes them. If an event isn't finished, the system will wait for a finished signal from the event node before proceeding to the next.

Both ChapterEventPlayer and BaseChapterEvent have started and finished signals if you need to track their execution.

All event scripts must have a custom class name - so that they are exposed in the "Create New Node" dialog - and should start with Event....

Creating a Custom Event

To create a new event, extend BaseChapterEvent and implement your _play() method. This method must return true or false, signaling if the event is completed.

Example of an instantaneous event:

class_name EventRemoveNode
extends BaseChapterEvent

export var node_path: NodePath

func _play() -> bool:
	var node: Node = get_node(node_path)
	node.get_parent().remove_child(node)
	node.queue_free()
	return true

If an event performs an action that takes time (e.g., animations), it must return false and call _finished() when complete.

Example of an asynchronous event:

class_name EventWaitForTimer
extends BaseChapterEvent

export var duration: float = 1.0

func _play() -> bool:
	var timer := get_tree().create_timer(duration)
	timer.connect("timeout", self, "_on_timer_timeout", [], CONNECT_ONESHOT)
	return false

func _on_timer_timeout() -> void:
	_finished()

With what script it communicates

Events can control: Player, GameplayCamera

Events can trigger: Inner Monologue

ChapterEventPlayer interacts with SaveDataHandler, to save if an event has been played yet.

SpawnPosition

Goals

A scene you can place inside levels to mark possible enemy spawn point.

How it works

You need to place SpawnPosition scenes inside of a Node2D named SpawnPositions, inside the main YSort for the level.

Image with and example of the necessary hierarchy for SpawnPositions inside a Level

The Room.gd script will identify these nodes and use them to spawn monsters in these starting positions. A SpawnPosition does not guarantee a monster will be spawned and it's also possible to spawn "nothing" according to the time of the day and area. This is normally decided by the WorldDirector script.

But it is possible to bypass the WorldDirector and force any Monster to be spawned using the SpawnPosition exported properties:

Image with an example of SpawnPosition's inspector with the forced monster property filled up with a monster scene

Just use the inspector to find any monster's tscn file you want on the forced_enemy property and that monster will be spawned in that spawn point. You can also use forced_direction and forced_mood to set the initial direction and mood of the monster, or leave them blank to use the monster's default.

This is specially useful for scripted scenes like the Deer tutorial.

With what script it communicates

Doesn't communicate with any other script, is expected by Room.gd

Multi Screen Levels

Levels that are bigger than one screen can be created and mixed with one screen levels.

In them the camera follows the player when you walk around while respecting the limits of the level, and it works seamlessly with the rest of the world when transition between levels, while transitioning from coordinates inside the Multi Screen are handled by a new event signal called internal_level_coords_changed.

Goals

Add more variety and freedom to level design while also giving a fresh perspective and "game feel" to the player, allowing for creating different experiences according to the needs of the game's narrative or gameplay design.

How to create Multi Screen levels

The main structure of a multi screen level is the same as an ordinary level. It should follow the same node hierarchy of single screen levels and same requirements for enemies, navigation, etc.

What needs to be adjusted is:

Inspector for Level node, highlighting the "Level Size" property

  • Set the level_size property in the main Level node. It must be set manually, match the actual size of screens that were created in the level and must always be whole numbers.

Showing examples of CameraAnchors set up in a level

  • Setup CameraAnchors around the levels exits/entrances. See more details below.

And that's all. Notice that while you work on the level in the editor, the MoveLevelTriggers will look wrong, and will look like they only cover the first screen of the level:

Image of 2x2 test level zoomed out and MoveLevelTriggers only covering the first quadrant

That is normal and expected, and you don't need to do anything about it, it will calculate its correct dimensions when the game starts running. It will use the level_size property explained above to do it, so if that property has the wrong value, the MoveLevelTriggers will also be wrong on runtime.

Testing Levels

You can test if the level is working and if the camera anchors are setup in a nice way by pressing F6 to run the level scene directly. You will not be able to transition to other leves, but a player and a camera will be automatically added to the scene and you'll be able to walk around, test the camera anchors, fight enemies or test any other challenge the level design proposes.

Setting up Camera Anchors

We need CameraAnchor so that we can lock the screen to the expected "screen coordinate" whenever the player is approaching any exits to prepare for screen transitions or so that the camera doesn't do any weird movements after entering a Multi Screen level.

While the player is inside any CameraAnchor's area, the camera will lock to the coordinates of that screen, as if it were a single screen level. Once the player leaves a CameraAnchor's area the Camera will be freed again and follow the player's position.

ScreenTransitions without CameraAnchor:

ScreenTransitions with CameraAnchor:

To add CameraAnchors, instance the CameraAnchors Scene using Ctrl+Shift+A or drag and dropping it from the filesystem tab. They can live anywhere in the Level hierarchy, but I think it makes sense to but them inside the Borders node.

Image of CameraAnchor's inspector

Use the inspector to set their size, and move the node to position them accordingly. Here you can freely use float values for the size, each unit is the size of a tile.

The blue rectangle is a "preview" of where the camera will lock. As you move the node in the editor the "camera preview" will move as the position of the "origin" of the CameraAnchor crosses to a new screen coordinate.

If you need a CameraAnchor with an area that is not a rectangle, you can have it by setting the size to 0 and adding a new CollisionPolygon or CollisionShape node as a child of it. Then you can set your own polygon or any other shape that best applies to the situation.

Image of example of CameraAnchor with a custom CollisionPolygon

Using Ponds in Multi Screen levels

Do NOT place ponds in intersections between "internal levels", or partially or fully inside camera anchors. Placing them inside or partially inside camera anchors may lead to some weird effects when zooming out when you leave the pond.

Placing them in a way they are in two or more "levels" at the same time doesn't really gives any bugs today, but the player will only be considered as having "changed" levels once it leaves the pond, which might lead to inconsistencies if some code needs to check for player level location or location change.

Here is an image with a few examples of ponds positioning. Ponds marked with a green circle are OK, while ponds marked with a red cross should be avoided:

Example of correct and incorrect pond placemente in nxn levels

With what script it communicates

This isn't really one specific script, but many changes that were added to Level.gd, Room.gd, MoveLevelTriggers.gd, GameplayCamera.gd and others, as well as new scripts like CameraAnchor.gd and CameraAnchorDetector.gd.

Most noticeably, there were some changes needed to "sanitize" player position as on Multi Screen levels, it can be beyond the base level size, and must be converted to "single screen" position whenever the player is transitioning between levels. And likewise, these "single screen" positions must then be converted back to "multi screen" position when the player is entering into a multi screen level through any "screen" that isn't its "origin" coordinates.

Multi Screen Levels

Levels that are bigger than one screen can be created and mixed with one screen levels.

In them the camera follows the player when you walk around while respecting the limits of the level, and it works seamlessly with the rest of the world when transition between levels, while transitioning from coordinates inside the Multi Screen are handled by a new event signal called internal_level_coords_changed.

Goals

Add more variety and freedom to level design while also giving a fresh perspective and "game feel" to the player, allowing for creating different experiences according to the needs of the game's narrative or gameplay design.

How to create Multi Screen levels

The main structure of a multi screen level is the same as an ordinary level. It should follow the same node hierarchy of single screen levels and same requirements for enemies, navigation, etc.

What needs to be adjusted is:

Inspector for Level node, highlighting the "Level Size" property

  • Set the level_size property in the main Level node. It must be set manually, match the actual size of screens that were created in the level and must always be whole numbers.

Showing examples of CameraAnchors set up in a level

  • Setup CameraAnchors around the levels exits/entrances. See more details below.

And that's all. Notice that while you work on the level in the editor, the MoveLevelTriggers will look wrong, and will look like they only cover the first screen of the level:

Image of 2x2 test level zoomed out and MoveLevelTriggers only covering the first quadrant

That is normal and expected, and you don't need to do anything about it, it will calculate its correct dimensions when the game starts running. It will use the level_size property explained above to do it, so if that property has the wrong value, the MoveLevelTriggers will also be wrong on runtime.

Testing Levels

You can test if the level is working and if the camera anchors are setup in a nice way by pressing F6 to run the level scene directly. You will not be able to transition to other leves, but a player and a camera will be automatically added to the scene and you'll be able to walk around, test the camera anchors, fight enemies or test any other challenge the level design proposes.

Setting up Camera Anchors

We need CameraAnchor so that we can lock the screen to the expected "screen coordinate" whenever the player is approaching any exits to prepare for screen transitions or so that the camera doesn't do any weird movements after entering a Multi Screen level.

While the player is inside any CameraAnchor's area, the camera will lock to the coordinates of that screen, as if it were a single screen level. Once the player leaves a CameraAnchor's area the Camera will be freed again and follow the player's position.

ScreenTransitions without CameraAnchor:

ScreenTransitions with CameraAnchor:

To add CameraAnchors, instance the CameraAnchors Scene using Ctrl+Shift+A or drag and dropping it from the filesystem tab. They can live anywhere in the Level hierarchy, but I think it makes sense to but them inside the Borders node.

Image of CameraAnchor's inspector

Use the inspector to set their size, and move the node to position them accordingly. Here you can freely use float values for the size, each unit is the size of a tile.

The blue rectangle is a "preview" of where the camera will lock. As you move the node in the editor the "camera preview" will move as the position of the "origin" of the CameraAnchor crosses to a new screen coordinate.

If you need a CameraAnchor with an area that is not a rectangle, you can have it by setting the size to 0 and adding a new CollisionPolygon or CollisionShape node as a child of it. Then you can set your own polygon or any other shape that best applies to the situation.

Image of example of CameraAnchor with a custom CollisionPolygon

Using Ponds in Multi Screen levels

Do NOT place ponds in intersections between "internal levels", or partially or fully inside camera anchors. Placing them inside or partially inside camera anchors may lead to some weird effects when zooming out when you leave the pond.

Placing them in a way they are in two or more "levels" at the same time doesn't really gives any bugs today, but the player will only be considered as having "changed" levels once it leaves the pond, which might lead to inconsistencies if some code needs to check for player level location or location change.

Here is an image with a few examples of ponds positioning. Ponds marked with a green circle are OK, while ponds marked with a red cross should be avoided:

Example of correct and incorrect pond placemente in nxn levels

With what script it communicates

This isn't really one specific script, but many changes that were added to Level.gd, Room.gd, MoveLevelTriggers.gd, GameplayCamera.gd and others, as well as new scripts like CameraAnchor.gd and CameraAnchorDetector.gd.

Most noticeably, there were some changes needed to "sanitize" player position as on Multi Screen levels, it can be beyond the base level size, and must be converted to "single screen" position whenever the player is transitioning between levels. And likewise, these "single screen" positions must then be converted back to "multi screen" position when the player is entering into a multi screen level through any "screen" that isn't its "origin" coordinates.

TestingCaves

Testing Individual Rooms

Just open any individual Cave scene in res://src/ProceduralLevels/Levels/Caves/ and press F6 or "Play Scene" button.

Play scene button

This works because on Room.gd of the following code for testing any "Level" scene by running them standalone:

Run standalone code

if get_tree().current_scene == owner: is a good trick to be able to run special logic to enable these kinds of tests. And since this is in Room.gd it should also work for any LinearWorld levels as well.

This is just useful to walk around the scene, as you won't be able to navigate to other levels, nor there will be any enemies spawned.

Testing entire caves with Sandbox

Open the ProceduralWorldSandbox.tscn scene and press F5.

You can press F10 to toggle between the "Debug Camera" and the "Gameplay Camera". While in the "Debug Camera" you can:

  • pan around using the movement keys
  • zoom in/out with the mouse's scroll wheel

Testing Caves in game.

Finding Opening hours for a cave in the editor

  1. Find out what is the level that has the cave you want to test
  2. Find out what the "opening hours" for it are.
  3. Run the game normally, use the Debug Menu to warp to the desired level and set the time of the day to something inside the cave's opening hours
  4. Save the game so that you don't need to repeat this setup
  5. Enter the Cave

Here you can also use F10 to toggle between Gameplay and Debug Camera just as above.

Platforms

Platforms are in-land and are raised levels where a Player can climb/walk up or drop down from.

More information

How to convert the old PlatformWalls to the new PlatformWalls

The old PlatformWalls tilemap relied on a PlatformCollisions tilemap, and you had to manually add the collision tiles to the scene.

The new PlatformWalls integrate the collision box in the tile itself removing the need to manually place collision tiles.

To convert a level:

  • Remove the "PlatformCollisions" tilemap node. (Under the "Room > Platforms" node)

That's it!

Pits

Pits (or Chasms) are tilemaps in the level design that the Player can fall down if colliding inside one of the drop zones. When the Player drops down, they lose a bit of health, and they are respawned to the latest entry point of the level they are in. Pits are supported for each Location/Biome.

How to Convert Old Pits to New Pits

In the old pits tilemap, a Pitbox Area2D was used, and you had to manually add CollisionPolygon2D nodes to the scene.

The new pits integrate the collision box directly into the tile itself, eliminating the need to manually place CollisionPolygon2D nodes.

Steps to Convert the Level:

  1. Remove the "PitBox" Area2D node (located under the "Pits" tilemap). Ensure that the name of the node is "Pits" Otherwise the Player won't get triggered.
  2. Set the "Pits" tilemap's collision layer to 17 (PitsBox).
  3. Remove all collision masks from the "Pits" tilemap.

That's it!


How to Add Collision to a Tilemap's Tile Set

  1. Click on the tile set.

  2. Click on the tilemap icon on the left.

  3. Select the tilemap in the center.

  4. Click the snap icon.

  5. Change the step size to a small value (e.g., 4x4).

Stairs

How to convert the old PlatformWalls' stairs to the new PlatformStairs

A new PlatformStairs tilemap has been created to simulate depth, it add a force when the player climbing the stairs. It can be used alongside the PlatformWalls tilemap.

If the stairs has been placed with the PlatformWalls tilemap the stairs will not apply a force. To do so please use the new PlatformStairs tilemap.

How to create a PlatformStairs tilemap in a Level

  1. Duplicate the PlatformWalls tilemap node.
  2. Rename the duplicated node to Platform_Stairs
  3. Replace the tile set with assets/Stairs/PlatformStairs.tres.
  4. Go to the Collision section of the tilemap.
  5. Remove every layer for the Collision Layer and Collision Mask.
  6. In the Collision Layer add the Stairs layer.
  7. You can now add stairs that will apply force automatically to the player.

AnimatedSprite

The player spritesheets are displayed by an animated sprite, it contains an animation for every spritesheet of the player.

How to add a new spritesheet

Add a new animation in the animation player, then add a callback track to call the method change_spritesheet in the script of the animated sprite (add the animation name as the arg).

Set the new animation in the animation tree.

Lastly, add a new animation in the animated sprite, the animation name must be the same as the one in the animation player (do not forget to set if the animation of the animated sprite loops), then add the frames of the new spritesheet in the animated sprite’s animation.

Why use a method track instead of signals?

Due to a bug (only fixed in Godot 4) the animation player will not send signals if the animation was set by an animation tree.

So, it is a track of the animation player that changes the animated sprite’s animation by calling a method in its script (change_spritesheet)

Why we are doing this?

The previous approach was to have a single spritesheet containing all the player animations.

In the player's animation player, each animation changed the frame index of a sprite.

Every time the spritesheet was changed, we had to change all the values of every frame in every animation. This was unsustainable.

AnimatedSprite

The player spritesheets are displayed by an animated sprite, it contains an animation for every spritesheet of the player.

How to add a new spritesheet

Add a new animation in the animation player, then add a callback track to call the method change_spritesheet in the script of the animated sprite (add the animation name as the arg).

Set the new animation in the animation tree.

Lastly, add a new animation in the animated sprite, the animation name must be the same as the one in the animation player (do not forget to set if the animation of the animated sprite loops), then add the frames of the new spritesheet in the animated sprite’s animation.

Why use a method track instead of signals?

Due to a bug (only fixed in Godot 4) the animation player will not send signals if the animation was set by an animation tree.

So, it is a track of the animation player that changes the animated sprite’s animation by calling a method in its script (change_spritesheet)

Why we are doing this?

The previous approach was to have a single spritesheet containing all the player animations.

In the player's animation player, each animation changed the frame index of a sprite.

Every time the spritesheet was changed, we had to change all the values of every frame in every animation. This was unsustainable.

AimGuide

The AimGuide is a component of the player used in conjunction with ranged weapon, to handle aim preview.

Goals

  • Draw a preview of where the player is aiming at.
  • Handle aim assist detection.

How it works

The AimGuide has one public method called get_aim_assisted_position_for. Any ranged weapon can call this function passing the vector of the target's global position and a max length that should be the max range.

The AimGuide will first check if it finds anything to collide in that direction so that it can lock into it, and return the final vector any ranged attack/weapon/projectile should use. The AimGuide will already limit this final position to the max length passed in, and update the aim preview to this "assisted" position. If it doesn't find anything to lock on, it will just update the aim preview and return the vector it received.

Setting up AimAssistAreas

Anything that should be "locked on" by ranged weapons should have a AimAssistArea node. Just create this node from the Add Node interface and it will already come configured with the correct physics layers.

Create new node dialog with AimAssistArea selected

Add a collision shape to it, it should be as big as you want it to be easy for the aim assist to lock into this entity. In the editor, select the path to the collision shape or polygon of the HurtBox for this entity. The AimAssistArea will redirect the aim to the position of the collision of the HurtBox, to ensure the projectile is headed to where it will actually deal damage.

Example of AimAssitArea fully configured in the editor

With what script it communicates

AimGuide only communicate directly with AimAssistAreas, to detect them and get the correct aim position from them. Any "Projectile" or "Ranged" State/Weapon can and should use it to get assisted aiming and automate showing the aim preview.

Save Game

This guide explains how to save and persist data.

Goals

  • Allow persistance in the Game through Save Slots

How it works

The Save system works around two main "concepts":

  • A single "SaveDataHandler" resource
  • A common "Save Integration Interface" that any node or resource that needs to save their own data uses.

Overview

The SaveDataHandler.tres resource is responsible for serializing and saving the data in the user:://save_slots/ folder. For debug builds is will save as .json so that we can explore them and find problems/bugs/modify them. For release builds it will save as a binary file with a .save extension, but it's contents are formatted the same.

It is also responsible for loading save slots, updating any resources and existing nodes with the loaded data, and holding this data so that nodes that are instanced at any other time after slot loading can request their own data from it.

How it works and Save "Interface"

SaveDataHandler expects a minimum "interface" in Resources or Nodes that need to save data:

  • get_save_data_key() - returns a unique string id that will be used as key in the json to identify that node/resource
  • get_data_to_save() - returns a dictionary with all the data that node/resource needs save, in whatever structure fits best for that particular node/resource
  • load_data_from_save(saved_data: Dictionary) - sends the saved data back to the resource/node so that they can update themselves.

This way SaveDataHandler only deals with "Handling" the data from game to disk and from disk to game, not having to know about how they are serialized/deserialized, or which data in each resource/node needs saving or not. Each Resource/Node implements the interface as it's best for its own context.

There is a basic "snippet" for the "interface" that needs to be implemented in each node/resource that needs saving in the script SaveDataUtils.gd that you can copy and uncomment wherever needed

Save Snippet 01

It has some comments with instructions where needed and specially for the one function that is only needed in Nodes

Save Snippet 02 - Node only function

Adding Resources to SaveDataHandler

SaveDataHandler.tres has a property for an array of Resources, just drag and drop the resource that needs to be saved/loaded in it, and implement the "Save Integration Interface" in the script for that particular resource.

Adding Resources to SaveDataHandler

Adding Nodes to SaveDataHandler

After implementing the "Save Integration Interface" snippet on the node, make sure to call _setup_saved_data() on the node's _ready() function or somewhere else if it makes sense for this particular node. Avoid calling it on _init(), it will probably be too soon, unless you know this node will always be created after loading a slot. But better to avoid it anyway, _ready() is usually a much better place.

_setup_saved_data() will take are of adding the node to the correct group, so that if the player saves the game, this node will be called by SaveDataHandler when it grabs all the nodes in the group.

Quest Exceptions

The save for Quests work a bit differently. Instead of each QuestLine, Quest, or QuestStep having their own unique id and saving their data, SaveDataHandler only handles QuestManager, and QuestManager will call the interface on each QuestLine and in any active Quest.

This way QuestManager can take care of the details of loading questlines first, activating quests or resuming them, initializing whatever is needed.

Also Quests are responsible for doing the same for their own QuestSteps. This way responsibility is always closer to the best entity to know how to handle these decisions and each one can handle it in the best way.

We don't need this for things like inventories which are simpler systems with less moving parts. If we have any other complex system like quests in the future, this can be used as a starting point, or reference.

SaveDataUtils and Json

Saving to Json and loading back has it's problems. Json only has a few data types, and converts any int into float, it expects every dict key to be a string, which is not always true, and Vector2 that get converted with to_json() or JSON.print() are not converted back to Vector2 by JSON.parse(), they just become strings.

So SaveDataUtils.gd is there to be a helper in this cases. It has the following static functions that can be called from anywhere:

  • convert_value_to_json_save(value) - this uses duck typing intentionally, to be able to receive any type and convert the ones that are incompatible into something we can later convert back into the original value.
  • convert_json_save_to_value(json_value) - expects values after a json parse, and will convert back the incompatible types to their original types.
  • add_to_save_nodes_group(node: node) - what the save interface uses to add nodes to the correct group, this way if we need to refactor this further up, we can change it here.

Besides this all, it also holds the "save integration interface" snippet, as described above.

How to use it in the editor or for debugging

On the Game scene, there is now a new user_editor_save property:

Using saves on editor runs

By default it is off, turn it on whenever you want the game to save to an "editor_slot" and whenever you press F5 to run the game it will automatically load it and continue from there. When it is on it will also ignore the debug_initial_screen property right above it. So if you want to test things like the splashscreen or the Main menu by setting the initial screen, disable use_editor_save

You can choose which slot to use in SaveDataHandler.tres

Choosing save slots

I left a high number so that I wouldn't overwrite actual save slots whenever that screen is integrated. You can use whichever number you want, but DON'T USE 100

Slot 100 is reserved for unit tests, whatever is there will be overwritten and deleted by GUT runs.

Also, if you want to see the save itself, or open it on visual studio code to check out something, just go to "Project > Open User Data Folder"

Easily open used data folder

They will be in the "save_slots" folder in a human readable json file.

To Load a Slot

There are two Events for loading a save slot through code in the game:

  • save_slot_chosen - used by SaveSlotsScreen to choose a slot and load it.
  • load_current_slot_requested - used by PauseScreen to reload the current slot.

Emitting any of these Event signals will trigger Game to properly handle a transition to a "Loading" screen and continue the game property from the scene the save tells it to go to.

Debug Menu

A scene that holds other scenes which are tools to help debug the game.

Goals

The Goal of the Debug Menu is to be the main HUD for other scenes that allow us to quickly cheat, change aspects of the game, or whatever else helps testing/debugging.

How it works

The scene itself is located at res://src/DebugMenu.tscn and since it is just a "Container" of other scenes that are the debug tools themselves, this scene and its logic is pretty simple.

It listens to input and reacts to the action "ui_debug_levels". Whenever this action is released it will toggle the debug menu to either _open() or _close(). These functions already take care of pausing the game and handling keyboard/controller focus.

It is dynamically instanced by Game.tscn when it recognizes that the current build is a "debug" build.

Accessing other nodes from the DebugMenu

Many times some tool inside the DebugMenu will have to access specific nodes, like LinearWorld, Player, or DayNightCycle.

An "easy" solution for that is using find_node on the root.

var _player = get_tree().root.find_node("Player", true, false) as Player

It is usually frowned upon and discouraged to use find_node as it is and expensive function and might make some weird couplings, but since this is just a debug menu and not actual gameplay logic, and if it's not something that will run on a loop or on process, then it can be used.

It might be good to try to cache the reference to avoid having to find the node every time a button is pressed. But, since the DebugMenu lives on Game and is persistent through scene changes, a "player" or "world" node that you've cached might not be valid anymore. This is an how PlayerDebugTool deals with it:

caching find node results example

This way I run _is_player_valid() at the start of any functions that needs a reference to the player. If it has no reference it will grab one and check that it is valid. If it already has one and it's still valid, it will just return true. And if it can't find a valid reference it will return false and let me exit the function that needs the player.

example of is_player_valid being used inside another function

Setting up the Debug Menu export vars

DebugMenu has one export vars:

  • _path_first_focus is an "internal" export var, as in, it's not meant to be edited from outside of the scene. It's just to choose which of the debug tools will receive the keyboard/controller focus when DebugMenu is first opened.

Making DebugMenu "sections" keyboard/controller friendly

Godot is usually pretty good at understanding focus between control nodes and navigating through them with a controller/keyboard. What happens sometimes is that when you are navigating focus goes to a "container" control that shows no feedback.

To make any scene keyboard/controller friendly inside the current scenes from the DebugMenu, I had to connect the focus_entered signal of the root control node of the scene to itself, and then make a desired first button grab the focus:

grab focus example

With just that in each of the "child" scenes from the DebugMenu it's enough for Godot itself to handle navigation between the buttons of each section and not "lose" focus when navigating between sections.

With what script it communicates

With LinearWorld, DayNightCycle, Player and possibly whatever tool is inside it and what they require.

Debug Menu

A scene that holds other scenes which are tools to help debug the game.

Goals

The Goal of the Debug Menu is to be the main HUD for other scenes that allow us to quickly cheat, change aspects of the game, or whatever else helps testing/debugging.

How it works

The scene itself is located at res://src/DebugMenu.tscn and since it is just a "Container" of other scenes that are the debug tools themselves, this scene and its logic is pretty simple.

It listens to input and reacts to the action "ui_debug_levels". Whenever this action is released it will toggle the debug menu to either _open() or _close(). These functions already take care of pausing the game and handling keyboard/controller focus.

It is dynamically instanced by Game.tscn when it recognizes that the current build is a "debug" build.

Accessing other nodes from the DebugMenu

Many times some tool inside the DebugMenu will have to access specific nodes, like LinearWorld, Player, or DayNightCycle.

An "easy" solution for that is using find_node on the root.

var _player = get_tree().root.find_node("Player", true, false) as Player

It is usually frowned upon and discouraged to use find_node as it is and expensive function and might make some weird couplings, but since this is just a debug menu and not actual gameplay logic, and if it's not something that will run on a loop or on process, then it can be used.

It might be good to try to cache the reference to avoid having to find the node every time a button is pressed. But, since the DebugMenu lives on Game and is persistent through scene changes, a "player" or "world" node that you've cached might not be valid anymore. This is an how PlayerDebugTool deals with it:

caching find node results example

This way I run _is_player_valid() at the start of any functions that needs a reference to the player. If it has no reference it will grab one and check that it is valid. If it already has one and it's still valid, it will just return true. And if it can't find a valid reference it will return false and let me exit the function that needs the player.

example of is_player_valid being used inside another function

Setting up the Debug Menu export vars

DebugMenu has one export vars:

  • _path_first_focus is an "internal" export var, as in, it's not meant to be edited from outside of the scene. It's just to choose which of the debug tools will receive the keyboard/controller focus when DebugMenu is first opened.

Making DebugMenu "sections" keyboard/controller friendly

Godot is usually pretty good at understanding focus between control nodes and navigating through them with a controller/keyboard. What happens sometimes is that when you are navigating focus goes to a "container" control that shows no feedback.

To make any scene keyboard/controller friendly inside the current scenes from the DebugMenu, I had to connect the focus_entered signal of the root control node of the scene to itself, and then make a desired first button grab the focus:

grab focus example

With just that in each of the "child" scenes from the DebugMenu it's enough for Godot itself to handle navigation between the buttons of each section and not "lose" focus when navigating between sections.

With what script it communicates

With LinearWorld, DayNightCycle, Player and possibly whatever tool is inside it and what they require.

HUD

Work in progress

Notifications

Goals

Show a message to the player that pops up on the lower right of the screen. It can be a message that disappears after some time is elapsed or a message that stays visible until it is dismissed by completing some objective in the game.

How it works

Regular Messages

Use the notification_requested event to send your notifications! This event needs three parameters, the message itself, the type of message, and the duration it should be displayed for before being dismissed. ex:

Events.emit_signal("notification_requested", "Hello World", "warning", 3)

The code above will make a notification pop up in the lower right of the game's window saying "Hello World", it will stay visible for 3 seconds and then hide.

You can also send -1 in the duration to make it stay on screen permanently. Then, you'll need to later dismiss it manually by sending the notification_dismissed event:

Events.emit_signal("notification_dismissed")

Valid Message Types

Message "types" change the icon that is displayed to the left of the notification. You must send a string in the event and valid options are:

  • "success" - uses a checkmark as icon test notification panel with a checkmark icon
  • "warning" - uses an exclamation mark as icon test notification panel with a checkmark icon
  • "failure" - uses a "x" as icon test notification panel with a checkmark icon
  • "" (or any other string) - uses an "i" as icon test notification panel with a checkmark icon

"Special" Messages

These are used when we need to create messages that have button prompts or any other special requirements.

How to add a new "Special" Notification

  1. Create a and format the message as you want, inside the Notifications scene. If it has any Button Prompts, make sure to add the correct "action" to it in the inspector. Setting up a special notification message in the editor
  2. Make sure to add the Label to the group special_prompt_label. Adding the message label to the special_prompt_label group
  3. Add a constant with the Node Name of the new prompt. adding a constant to Notifications.gd

How to use special prompts

You send the event notification_special_requested, which has the same three parameters as a regular notification.

Events.emit_signal(
		"notification_special_requested", 
		Notifications.SPECIAL_PROMPT_ROLL,
		"warning",
		-1
)

The "type" and "duration" parameters work the same. In the "message" parameter you must send the name of the Node that should be visible, that's why having the constants are useful as they serve as an autocomplete for which special notifications are available.

With what script it communicates

No external scripts. Other scripts communicate with this one through Event signals.

Version Label

Goals

This is a really simple label script that works on it's own and shows the version and if we are in a debug, release or demo build.

How it works

Add this script to any label you want. It will override the label text automatically to show the version label and build info:

  • release builds - will show only the version text.
  • debug builds - will show the word "debug" besides the version text.
  • demo builds - will show the word "demo" besides the version text.

Visibility Modes

choosing visibility mode in the editor inspector

It has two "visibility" modes that can be chosen:

  • RELEASE - always visible.
  • DEMO_DEBUG - only visible in either demo or debug versions.

With what script it communicates

It doesn't interact with any other scripts but it is present in the scenes:

  • HUD.tscn - only visible in demo or debug
  • PauseScreen.tscn - Always visible

World

Work in progress

Goals

Create a reusable shader for procedurally drawing VFX for a slash/circular strike.

How it works

Maps a texture to rotate around in a circle. The width of the shape from start to end is the curve width, modulated by width mod Start/End range from 0 - 1, and define where the start and end of the shape should be along the circle. Scroll amount rotates the circle's start/end ranges UVmod multiplies the UV after it has been converted to -1 to 1, and can be used to stretch the image. Pixellate scale should be such that it matches some factor of the scale of the vfx, such that it matches the pixel ratio of the game. This will depend on the size of the base texture. Using MissingTexture.png, this is 2x of the scale. For instance, setting the scale to 10,10, means pixellate scale should be 20,20.

Texture should be a black/white map value map, and gradient maps it to colors.

With what script it communicates

Material of canvasitems.

Team

NameRole
SmksProject Founder
AndrewLevel Designer
RenatoLevel Designer
DanielDeveloper (Quests; Systems)
PhnixDeveloper (Gameplay; Game Feel)
AcetrologerMarketing
ShoyguerGame Designer & Developer
pixelrogueDeveloper (Enemy AI)
FlytrapDeveloper (VFX/Shaders)

Team

NameRole
SmksProject Founder
AndrewLevel Designer
RenatoLevel Designer
DanielDeveloper (Quests; Systems)
PhnixDeveloper (Gameplay; Game Feel)
AcetrologerMarketing
ShoyguerGame Designer & Developer
pixelrogueDeveloper (Enemy AI)
FlytrapDeveloper (VFX/Shaders)

Priority List

Link to the priority list

Settings

These are the following settings configurable in the game:

  • Music Volume
  • Sound FX Volume
  • Full Screen
  • V Sync

Links

Here you will find useful link and the game's other documents

FAQs

Work in progress