Files
rr3-server/GAME-CONTENT-HOSTING-PLAN.md
Daniel Elliott cbd8ee7123 Create comprehensive game content hosting plan
Identified what's needed to host actual game content:
- Car database (200+ vehicles with stats)
- Track database (40+ circuits with layouts)
- Events database (career mode, time trials)
- Asset files (2-4 GB of .pak files)
- Multiplayer configuration
- Catalog/shop items

Plan includes:
 Infrastructure ready (96 endpoints, 36 tables)
 Content data extraction needed
 Database seeding required
 Asset file hosting setup
 APK integration testing

Documented extraction methods, storage requirements, and phased approach.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-02-24 22:55:17 -08:00

14 KiB

Game Content Hosting - Implementation Plan

Date: February 25, 2026
Status: 🟡 INFRASTRUCTURE READY - NEEDS CONTENT


📊 Current Status

What We Have (Infrastructure)

  • 96 API endpoints implemented
  • 36 database tables created
  • AssetsController for serving files
  • Asset directory structure (E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets)
  • Database entities for cars, tracks, events, leaderboards
  • Multiplayer/social system ready
  • Server routing configured

What We Need (Content Data)

  • Car database (definitions, stats, prices)
  • Track database (layouts, AI data)
  • Event database (championships, time trials)
  • Asset files (.pak files for 3D models, textures)
  • Initial leaderboard data
  • Server configuration values
  • Catalog/shop items

🎯 Game Content Categories

1. Cars Database 🏎️

What's Needed:

  • Car definitions (make, model, class, stats)
  • Performance specs (power, weight, handling)
  • Upgrade tiers and costs
  • Purchase prices (in-game currency)
  • Unlock requirements

Database Tables:

  • Cars - Base car definitions
  • CatalogItems - Shop listings
  • OwnedCars - Player-owned cars (per user)
  • CarUpgrades - Applied upgrades (per user)

Example Data Structure:

public class Car {
    public int Id { get; set; }
    public string Make { get; set; }          // "Nissan"
    public string Model { get; set; }         // "Silvia Spec-R"
    public string Class { get; set; }         // "C"
    public int BasePower { get; set; }        // 250 HP
    public int BaseWeight { get; set; }       // 1240 kg
    public int BasePrice { get; set; }        // 50000 R$
    public string AssetPath { get; set; }     // "/cars/nissan_silvia_s15.pak"
}

Where to Get Data:

  • 📱 Extract from APK: /assets/data/cars.json or similar
  • 🌐 Scrape from RR3 wikis/databases
  • 📊 Reverse engineer from game files
  • 🔍 Network traffic analysis from official servers (before shutdown)

2. Tracks Database 🏁

What's Needed:

  • Track definitions (name, location, length)
  • Layout variants (GP, National, Indy)
  • Sector times for AI
  • Weather conditions
  • Track limits data

Database Tables:

  • GameAssets (filtered by Category='tracks')
  • Custom Tracks table (optional)

Example Data:

public class Track {
    public int Id { get; set; }
    public string Name { get; set; }          // "Silverstone"
    public string Layout { get; set; }        // "GP"
    public string Country { get; set; }       // "UK"
    public float LengthKm { get; set; }       // 5.891
    public int Corners { get; set; }          // 18
    public string AssetPath { get; set; }     // "/tracks/silverstone_gp.pak"
}

3. Events Database 🏆

What's Needed:

  • Event definitions (career mode, specials)
  • Requirements (car class, PR level)
  • Rewards (currency, cars, unlocks)
  • AI difficulty settings
  • Time-limited events

Database Tables:

  • Events
  • EventCompletions (per user)
  • EventAttempts (per user)

Example Data:

public class Event {
    public int Id { get; set; }
    public string Name { get; set; }          // "American Muscle Cup"
    public string Type { get; set; }          // "championship"
    public string RequiredClass { get; set; } // "B"
    public int RequiredPR { get; set; }       // 50
    public int RewardGold { get; set; }       // 50
    public int RewardCash { get; set; }       // 25000
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

4. Asset Files 📦

What's Needed:

  • Car 3D models (.pak files)
  • Track 3D models (.pak files)
  • Texture packs
  • Audio files (engine sounds)
  • UI assets

File Structure:

Assets/
├── cars/
│   ├── nissan_silvia_s15.pak         (10-20 MB)
│   ├── ford_focus_rs.pak
│   └── ...
├── tracks/
│   ├── silverstone_gp.pak            (50-100 MB)
│   ├── laguna_seca.pak
│   └── ...
├── textures/
│   ├── ui_textures.pak               (5-10 MB)
│   └── car_textures_pack1.pak
└── audio/
    ├── engine_sounds_pack1.pak       (1-5 MB)
    └── ambient_sounds.pak

Total Storage Estimate: 2-4 GB for full game content

How to Extract:

# From installed game
adb pull /data/data/com.ea.games.r3_row/files/ ./rr3-assets/

# From APK
apktool d realracing3.apk -o rr3-decompiled
cp rr3-decompiled/assets/*.pak ./Assets/

5. Time Trials / Leaderboards ⏱️

What's Needed:

  • Active time trial definitions
  • Target times (gold/silver/bronze)
  • Initial leaderboard entries (for testing)
  • Ghost data (optional)

Database Tables:

  • TimeTrials
  • TimeTrialResults (per user)
  • LeaderboardEntries
  • PersonalRecords (per user)
  • GhostData (optional multiplayer feature)

Example Data:

public class TimeTrial {
    public int Id { get; set; }
    public string Name { get; set; }          // "Silverstone Sprint"
    public int TrackId { get; set; }          // FK to Track
    public int CarClassId { get; set; }       // "A"
    public int GoldTime { get; set; }         // 95000 ms
    public int SilverTime { get; set; }       // 98000 ms
    public int BronzeTime { get; set; }       // 102000 ms
    public int RewardGold { get; set; }       // 25
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

6. Multiplayer Data 🎮

What's Needed:

  • Matchmaking rules (by class, PR)
  • Race session configurations
  • Default ghost data (for solo races)
  • Competitive rating tiers

Database Tables:

  • MatchmakingQueues (active players)
  • RaceSessions (lobbies)
  • RaceParticipants (who's in each race)
  • GhostData (recorded laps)
  • CompetitiveRatings (ELO system)

Default Configuration:

{
  "matchmakingRules": {
    "maxPRDifference": 10,
    "matchTimeout": 30,
    "minPlayers": 2,
    "maxPlayers": 8
  },
  "ratingTiers": [
    { "name": "Bronze", "minRating": 0, "maxRating": 1000 },
    { "name": "Silver", "minRating": 1000, "maxRating": 1500 },
    { "name": "Gold", "minRating": 1500, "maxRating": 2000 },
    { "name": "Platinum", "minRating": 2000, "maxRating": 999999 }
  ]
}

7. Shop/Catalog 🛒

What's Needed:

  • Item catalog (cars, gold, VIP)
  • Prices (real money or fake for community)
  • Availability windows
  • Special offers

Database Table:

  • CatalogItems

Example Data:

public class CatalogItem {
    public int Id { get; set; }
    public string Sku { get; set; }           // "gold_500"
    public string Name { get; set; }          // "500 Gold"
    public string Type { get; set; }          // "currency"
    public int Price { get; set; }            // 0 (free for community)
    public bool Available { get; set; }       // true
}

🛠️ Implementation Steps

Phase 1: Extract Game Data (From APK/Game Files)

Tools Needed:

  • apktool (APK decompilation)
  • jadx (Java decompilation)
  • QuickBMS (asset extraction)
  • adb (device file access)

Commands:

# 1. Decompile APK
apktool d realracing3.apk -o rr3-decompiled

# 2. Extract assets
cd rr3-decompiled/assets
cp *.pak E:/rr3/RR3CommunityServer/RR3CommunityServer/Assets/

# 3. Find game data files
find . -name "*.json" -o -name "*.xml" -o -name "*.dat"

# 4. Parse data files into database format
# (Manual or script)

Phase 2: Create Database Seed Script

Create: E:\rr3\RR3CommunityServer\RR3CommunityServer\Data\SeedData.cs

public static class SeedData
{
    public static void Initialize(RR3DbContext context)
    {
        // Seed cars
        if (!context.Cars.Any())
        {
            context.Cars.AddRange(
                new Car { Make = "Nissan", Model = "Silvia Spec-R", Class = "C", BasePower = 250, BaseWeight = 1240, BasePrice = 50000, AssetPath = "/cars/nissan_silvia_s15.pak" },
                new Car { Make = "Ford", Model = "Focus RS", Class = "B", BasePower = 350, BaseWeight = 1524, BasePrice = 75000, AssetPath = "/cars/ford_focus_rs.pak" },
                // ... more cars
            );
        }

        // Seed tracks
        if (!context.GameAssets.Any(a => a.Category == "tracks"))
        {
            context.GameAssets.AddRange(
                new GameAsset { FileName = "silverstone_gp.pak", Category = "tracks", FileSize = 85000000, EaCdnPath = "/tracks/silverstone_gp.pak" },
                new GameAsset { FileName = "laguna_seca.pak", Category = "tracks", FileSize = 72000000, EaCdnPath = "/tracks/laguna_seca.pak" },
                // ... more tracks
            );
        }

        // Seed events
        if (!context.Events.Any())
        {
            context.Events.AddRange(
                new Event { Name = "Rookie Cup", Type = "championship", RequiredClass = "D", RequiredPR = 10, RewardGold = 10, RewardCash = 5000, StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddYears(10) },
                // ... more events
            );
        }

        // Seed time trials
        if (!context.TimeTrials.Any())
        {
            context.TimeTrials.AddRange(
                new TimeTrial { Name = "Silverstone Sprint", TrackName = "Silverstone GP", CarClass = "A", GoldTime = 95000, SilverTime = 98000, BronzeTime = 102000, RewardGold = 25, StartDate = DateTime.UtcNow, EndDate = DateTime.UtcNow.AddMonths(1) },
                // ... more time trials
            );
        }

        context.SaveChanges();
    }
}

Call from Program.cs:

using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<RR3DbContext>();
    db.Database.EnsureCreated();
    SeedData.Initialize(db);  // <-- Add this
}

Phase 3: Populate Assets Directory

Manual Steps:

  1. Extract .pak files from game installation
  2. Copy to Assets/ subdirectories
  3. Verify files are accessible

Automated Script (PowerShell):

# Copy assets from extracted game files
$source = "E:\rr3\phone-assets-full"
$dest = "E:\rr3\RR3CommunityServer\RR3CommunityServer\Assets"

# Cars
Copy-Item "$source\cars\*.pak" "$dest\cars\" -Force
# Tracks
Copy-Item "$source\tracks\*.pak" "$dest\tracks\" -Force
# Textures
Copy-Item "$source\textures\*.pak" "$dest\textures\" -Force
# Audio
Copy-Item "$source\audio\*.pak" "$dest\audio\" -Force

Write-Host "Assets copied successfully!"

Phase 4: Test Content Delivery

Test Endpoints:

# 1. Get asset manifest
curl http://localhost:5555/content/api/manifest

# 2. Download a car asset
curl http://localhost:5555/content/api/cars/nissan_silvia_s15.pak -o test.pak

# 3. Get car list
curl http://localhost:5555/synergy/progression/cars

# 4. Get active events
curl http://localhost:5555/synergy/events/active

# 5. Get time trials
curl http://localhost:5555/synergy/rewards/timetrials

Phase 5: APK Integration Test

Required:

  1. Modify APK to point to community server
  2. Install on device/emulator
  3. Launch game and monitor logs
  4. Verify assets download correctly
  5. Test gameplay (career, time trials, multiplayer)

Network Configuration:

# hosts file (Windows: C:\Windows\System32\drivers\etc\hosts)
127.0.0.1 firemonkeys-akamai-eac.eaprojects.com
127.0.0.1 cloudcellcdn-eaprojects.akamaized.net

Or update APK's Director URL to point directly to:

http://your-server-ip:5555/director/api/android/getDirectionByPackage

📝 TODO List

High Priority (Needed for Basic Gameplay)

  • Extract car data from APK
  • Seed Cars table with 20-30 common cars
  • Extract track data from APK
  • Seed Events table with career mode events
  • Copy asset .pak files to Assets directory
  • Create SeedData.cs script
  • Test asset delivery

Medium Priority (Needed for Full Experience)

  • Seed all 200+ cars
  • Seed all tracks
  • Create time trial definitions
  • Populate catalog items
  • Set up leaderboard defaults
  • Configure multiplayer rules

Low Priority (Optional Enhancements)

  • Community-created events
  • Custom car mods
  • Enhanced ghost data
  • Dynamic events system
  • CDN setup for assets

🚀 Quick Start (Minimal Viable Data)

To get the server working with minimal data:

  1. Extract 5 cars from APK (most popular)
  2. Extract 3 tracks (Silverstone, Laguna Seca, Brands Hatch)
  3. Create 1 event (test championship)
  4. Copy corresponding .pak files
  5. Seed database
  6. Test with APK

This gives you a playable demo to verify the infrastructure works before committing to extracting all 2-4 GB of content.


📊 Storage Requirements

Content Type Estimated Size Priority
Car Assets (200+) 2-3 GB High
Track Assets (40+) 1-2 GB High
Texture Packs 200-400 MB Medium
Audio Files 100-200 MB Medium
UI Assets 50-100 MB Low
Total ~4-6 GB -

Recommendation: Start with 10% of content (400-600 MB) for testing.


🎯 Next Actions

  1. Locate game assets on your system

    • Check: E:\rr3\phone-assets-full\
    • Check: E:\rr3\rr3-assets\
    • Check APK: E:\rr3\realracing3.apk
  2. Extract game data files (cars, tracks, events)

    • Use jadx to decompile APK
    • Look for JSON/XML files in /assets/
    • Parse into database format
  3. Create seed script

    • Add SeedData.cs
    • Call from Program.cs
    • Test database population
  4. Copy asset files

    • Copy .pak files to Assets/ subdirectories
    • Test file serving via AssetsController
  5. Test with APK

    • Modify APK to use community server
    • Install and launch game
    • Verify content loads

Status: Infrastructure 100% ready, waiting for content data population.

Would you like me to start extracting game data from the files we have?