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>
This commit is contained in:
2026-02-24 22:55:17 -08:00
parent b69776ab42
commit cbd8ee7123

View File

@@ -0,0 +1,514 @@
# 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:**
```csharp
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:**
```csharp
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:**
```csharp
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:**
```bash
# 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:**
```csharp
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:**
```json
{
"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:**
```csharp
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:**
```bash
# 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`
```csharp
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:**
```csharp
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):**
```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:**
```bash
# 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?