Skip to main content

Getting Started

This guide will help you set up React Text Game in your project.

Installation

React Text Game consists of two packages: the core engine (@react-text-game/core) and the UI components (@react-text-game/ui).

Core Package Only

If you want to build your own UI, you can install just the core package:

# Bun
bun add @react-text-game/core

# npm
npm install @react-text-game/core

# yarn
yarn add @react-text-game/core

# pnpm
pnpm add @react-text-game/core

Core + UI Packages

For a complete solution with ready-to-use React components:

# Bun
bun add @react-text-game/core @react-text-game/ui

# npm
npm install @react-text-game/core @react-text-game/ui

# yarn
yarn add @react-text-game/core @react-text-game/ui

# pnpm
pnpm add @react-text-game/core @react-text-game/ui

UI Package Setup

If you're using the UI package, you need to configure Tailwind CSS:

1. Install Tailwind CSS

Follow the official Tailwind installation guide for your stack.

2. Import UI Styles

Import the UI styles in your global CSS file (e.g., src/index.css or src/main.css):

@import "@react-text-game/ui/styles";

/* Optional: Override theme colors */
@theme {
--color-primary-500: oklch(0.65 0.25 265);
}

Basic Setup

Using Core Package Only

import { Game, createEntity, newStory } from '@react-text-game/core';

// IMPORTANT: Initialize the game first
await Game.init({
gameName: 'My Text Adventure',
isDevMode: true,
});

// Create game entities
const player = createEntity('player', {
name: 'Hero',
health: 100,
});

// Create story passages
const intro = newStory('intro', () => [
{
type: 'header',
content: 'Welcome!',
props: { level: 1 }
},
{
type: 'text',
content: 'Your adventure begins...'
},
]);

// Start the game
Game.jumpTo(intro);

Using Core + UI Packages

The UI package provides a complete game interface with minimal setup:

// src/App.tsx
import { GameProvider, PassageController } from '@react-text-game/ui';

export function App() {
return (
<GameProvider options={{ gameName: 'My Text Adventure', isDevMode: true }}>
<PassageController />
</GameProvider>
);
}

Then define your game entities and passages:

// src/game/entities.ts
import { createEntity } from '@react-text-game/core';

export const player = createEntity('player', {
name: 'Hero',
health: 100,
inventory: [] as string[],
});
// src/game/passages.ts
import { newStory, Game } from '@react-text-game/core';
import { player } from './entities';

export const intro = newStory('intro', () => [
{
type: 'header',
content: 'Welcome to the Game',
props: { level: 1 }
},
{
type: 'text',
content: `Hello, ${player.name}! Your health is ${player.health}.`
},
{
type: 'actions',
content: [
{
label: 'Start Adventure',
action: () => Game.jumpTo('chapter1'),
color: 'primary'
}
]
}
]);

Project Structure

Here's a recommended project structure:

src/
├── game/
│ ├── entities/ # Game entities (player, inventory, etc.)
│ │ ├── player.ts
│ │ ├── inventory.ts
│ │ └── index.ts
│ ├── passages/ # Game passages (story screens)
│ │ ├── intro.ts
│ │ ├── chapter1.ts
│ │ └── index.ts
│ └── index.ts # Game initialization
├── App.tsx # Main app component
└── main.tsx # Entry point

Next Steps

Now that you have the basics set up, learn more about:

  • Core Concepts - Understand entities, passages, and state management
  • Core API - Complete API reference for the core package
  • UI API - Complete API reference for the UI package

Example Projects

Check out the example projects in the repository:

Troubleshooting

Game Not Initializing

Make sure you call Game.init() before creating any entities or passages:

// ❌ Wrong
const player = createEntity('player', { name: 'Hero' });
await Game.init();

// ✅ Correct
await Game.init();
const player = createEntity('player', { name: 'Hero' });

UI Components Not Styled

Ensure you've imported the UI styles in your global CSS:

@import "@react-text-game/ui/styles";

And that Tailwind CSS is properly configured for your project.

TypeScript Errors

Make sure you have TypeScript 5+ installed (5.9+ recommended):

bun add -d typescript@latest

Need Help?