Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A complete browser-based gaming platform with 50 games, progress tracking, and certificate generation. Built with Next.js frontend and WordPress backend.
1. Overview
2. Project Structure
3. Backend (WordPress)
• Setup
• REST API Endpoints
• Creating Games
• Game Configuration
• Circuit Path
• Other Games
• User Progress
• Certificate Generation
• Share Tracking
• CORS Configuration
4. Frontend (Next.js)
• Setup
• Project Structure
• Features
• Game Types
• Environment Variables
• Development
5. Troubleshooting
Play50Games is a comprehensive gaming platform featuring:查看完整 README ↗A complete browser-based gaming platform with 50 games, progress tracking, and certificate generation. Built with Next.js frontend and WordPress backend.
Play50Games is a comprehensive gaming platform featuring:
play50games/
├── play50games-backend/ # WordPress theme
│ ├── play50games/ # Theme files
│ │ ├── functions.php # Theme setup
│ │ ├── wt-cpt.php # Custom Post Types
│ │ ├── wt-cpt/
│ │ │ └── games.php # Games CPT meta fields
│ │ └── includes/
│ │ ├── rest-api.php # REST API endpoints
│ │ └── certificate-generator.php
│ └── README.md # Backend documentation
│
├── play50games-frontend/ # Next.js application
│ ├── src/
│ │ ├── app/ # Next.js App Router
│ │ ├── components/ # React components
│ │ ├── lib/ # API clients & utilities
│ │ └── types/ # TypeScript types
│ └── README.md # Frontend documentation
│
└── README.md # This file
WordPress theme with Custom Post Types and REST API for the Play50Games platform.
play50games theme folder to wp-content/themes/play50_game) - Game configurationsplay50_certificate) - Generated certificatesAll endpoints are under /wp-json/play50/v1/:
GET /games - Get all games with unlock statusGET /games/{id} - Get single game configurationPOST /progress - Save user progress
{ game_id, score, completed, guest_id? }GET /progress - Get user progress
game_id?, guest_id?GET /unlock-status - Get unlock status for all games
guest_id?POST /certificate/generate - Generate certificate
{ player_name, guest_id? }GET /certificate/{id} - Get certificate by IDPOST /share/register - Register a new share link
{ share_id, game_type }{ success: boolean, share_id: string, clicks: number }POST /share/click - Track when someone clicks a shared link
{ share_id }{ success: boolean, share_id: string, clicks: number }GET /share/status/{share_id} - Get share link status
{ success: boolean, share_id: string, game_type: string, clicks: number, has_clicks: boolean, created_at: string, last_click_at: string | null }logic, memory, speed, skill, or final)The platform includes a share tracking system that allows users to share games and receive unlimited hints when someone clicks their shared link.
shared URL parameter with a unique IDWordPress Admin includes a Share Tracking page (/wp-admin/admin.php?page=share-tracking) where you can:
Share tracking data is stored in the wp_play50_share_tracking table with the following structure:
id: Auto-increment primary keyshare_id: Unique share identifier (string)game_type: Game type (e.g., "card-flip", "tile-slider")clicks: Number of times the link was clickedcreated_at: When the share was createdlast_click_at: When the link was last clicked (NULL if never clicked)post.php?post=123&action=edit (123 is the ID)The WordPress admin includes a Quick Fill Templates dropdown that automatically fills all fields for common games. Simply select a game template and click Fill Template.
Circuit Path is a logic puzzle game where players connect nodes to create a continuous path from a Start node (green) to an End node (red).
{
"gameType": "circuit-path",
"gridSize": 3,
"rounds": 20
}
Fields:
gameType (required): Must be "circuit-path"gridSize (optional): Grid size (3 = 3x3, 4 = 4x4, 5 = 5x5, etc.) - Default: 3
rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)Scoring:
Controls:
Example Configuration:
{
"gameType": "circuit-path",
"gridSize": 3,
"rounds": 20
}
Recommended Settings:
Block Fill supports fixed grids (via gridSize) or multi-level layouts (via levelLayouts). If you provide layouts, the game will build pieces from the letters so the puzzle is guaranteed solvable.
{
"gameType": "block-fill",
"levels": [3, 4, 5, 6, 7],
"levelLayouts": [
{ "size": 3, "rows": ["AAB", "ACB", "CCB"] },
{ "size": 4, "rows": ["AAAB", "CABB", "CCDB", "CDDD"] },
{ "size": 5, "rows": ["AABBC", "ADBEC", "ADEEC", "FDDEC", "FFFEC"] },
{
"size": 6,
"rows": ["AAABBC", "DEABFC", "DEEBFC", "DGEHFC", "DGGHHC", "DGGHHC"]
},
{
"size": 7,
"rows": [
"AAABBCC",
"ADDBBCC",
"ADDEEFF",
"GGDEHFF",
"GGGHHII",
"JJKHHII",
"JJKKKII"
]
}
]
}
Fields:
gameType (required): Must be "block-fill"levels (optional): Ordered list of grid sizes per levellevelLayouts (optional): Array of layout objects
size: Grid size for that levelrows: Array of strings that define the solved layoutNotes:
"." for empty (unused) cells if needed.levelLayouts is provided, it overrides random piece sets for those levels.{
"gameType": "match-shapes",
"shapes": [
"Home",
"Fingerprint",
"Key",
"Star",
"Eye",
"Heart",
"Camera",
"Cube",
"Bell",
"Plus",
"Gift",
"Moon"
],
"rounds": 20
}
{
"gameType": "color-sequence",
"rounds": 20,
"colors": ["red", "blue", "green", "yellow"]
}
{
"gameType": "number-order",
"rounds": 20
}
{
"gameType": "find-odd-one",
"rounds": 20,
"icons": [
"Home",
"Fingerprint",
"Key",
"Star",
"Eye",
"Heart",
"Camera",
"Cube",
"Bell",
"Plus",
"Gift",
"Moon"
]
}
{
"gameType": "balance-scale",
"rounds": 20
}
{
"gameType": "sudoku-4x4"
}
{
"gameType": "tile-slider",
"gridSize": 3,
"showHints": true,
"maxHints": 5
}
gridSize (optional): Grid size (3 = 3x3, 4 = 4x4) - Default: 3showHints (optional): Enable hint button - Default: truemaxHints (optional): Maximum number of hints allowed - Default: 5
{
"gameType": "pattern-completion",
"totalRounds": 20,
"shapes": ["Home", "Star", "Heart", "Circle"],
"patternRules": [
{ "rounds": 5, "patternLength": 6, "repeatSize": 3 },
{ "rounds": 7, "patternLength": 9, "repeatSize": 3 },
{ "rounds": 8, "patternLength": 13, "repeatSize": 4 }
]
}
Configuration:
gameType (required): Must be "pattern-completion"totalRounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)
rounds for backward compatibilityshapes (optional): Array of Heroicon shape names to use - Default: ["Home", "Star", "Heart", "Circle"]
"Home", "Star", "Heart", "Circle", "Square", "Triangle", "Eye", "Camera", "Cube", "Bell", "Plus", "Gift", "Moon", "Fingerprint", "Key"patternRules (optional): Array of objects to configure pattern rules per round range:
rounds (max round for this rule)patternLength (total number of shapes in pattern, including the missing one)repeatSize (number of shapes that repeat: 3 = ABC ABC ABC, 4 = ABCD ABCD ABCD, 5 = ABCDE ABCDE ABCDE)patternLength: 6, repeatSize: 3patternLength: 9, repeatSize: 3patternLength: 13, repeatSize: 4Scoring:
Controls:
Goal:
Features:
patternRules)Recommended Settings:
Backend Configuration Example:
In WordPress admin, when creating/editing a game:
Title: "Pattern Completion"
Game Type: Logic
Game Order: 9 (or your desired order)
Difficulty: 2
Time Limit: 120
Passing Score: 80
Description: "Complete the missing pattern element"
Game Config (JSON):
{
"gameType": "pattern-completion",
"totalRounds": 20,
"shapes": ["Home", "Star", "Heart", "Circle"],
"patternRules": [
{ "rounds": 5, "patternLength": 6, "repeatSize": 3 },
{ "rounds": 7, "patternLength": 9, "repeatSize": 3 },
{ "rounds": 8, "patternLength": 13, "repeatSize": 4 }
]
}
Or with default pattern rules (no patternRules needed):
{
"gameType": "pattern-completion",
"totalRounds": 20,
"shapes": ["Home", "Star", "Heart", "Circle"]
}
Custom pattern rules example:
{
"gameType": "pattern-completion",
"totalRounds": 20,
"shapes": ["Home", "Star", "Heart", "Circle", "Eye", "Camera"],
"patternRules": [
{ "rounds": 3, "patternLength": 4, "repeatSize": 2 },
{ "rounds": 7, "patternLength": 7, "repeatSize": 3 },
{ "rounds": 15, "patternLength": 11, "repeatSize": 4 },
{ "rounds": 20, "patternLength": 16, "repeatSize": 5 }
]
}
{
"gameType": "rotate-to-fit",
"rounds": 20,
"shapes": [
"HandThumbUp",
"PuzzlePiece",
"GlobeAmericas",
"LightBulb",
"Funnel",
"Cake",
"LockClosed",
"ChevronDoubleRight",
"ArrowUturnLeft",
"BuildingOffice2"
],
"objectCountRules": [
{ "rounds": 5, "count": 3 },
{ "rounds": 10, "count": 4 },
{ "rounds": 15, "count": 5 },
{ "rounds": 20, "count": 5 }
]
}
Configuration:
gameType (required): Must be "rotate-to-fit"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)shapes (optional): Array of shape icon names from Heroicons - Default: 10 different Heroicons
HandThumbUp, PuzzlePiece, GlobeAmericas, LightBulb, Funnel, Cake, LockClosed, ChevronDoubleRight, ArrowUturnLeft, BuildingOffice2@heroicons/react/24/outline"HandThumbUp", "PuzzlePiece")objectCountRules (optional): Array of rules defining how many objects to rotate per round range - Default: 3 objects (rounds 1-5), 4 objects (rounds 6-10), 5 objects (rounds 11-15), 5 objects (rounds 16+)
rounds (max round number) and count (number of objects)rounds in ascending order[{"rounds": 5, "count": 3}, {"rounds": 10, "count": 4}, {"rounds": 15, "count": 5}]Scoring:
Controls:
Goal:
Features:
Recommended Settings:
Backend Configuration Example:
In WordPress admin, when creating/editing a game:
Title: "Rotate to Fit"
Game Type: Logic
Game Order: 11 (or your desired order)
Difficulty: 2
Time Limit: 120
Passing Score: 80
Description: "Rotate multiple objects to match their target orientations"
Game Config (JSON):
{
"gameType": "rotate-to-fit",
"rounds": 20,
"shapes": [
"HandThumbUp",
"PuzzlePiece",
"GlobeAmericas",
"LightBulb",
"Funnel",
"Cake",
"LockClosed",
"ChevronDoubleRight",
"ArrowUturnLeft",
"BuildingOffice2"
],
"objectCountRules": [
{ "rounds": 5, "count": 3 },
{ "rounds": 10, "count": 4 },
{ "rounds": 15, "count": 5 },
{ "rounds": 20, "count": 5 }
]
}
Or use default settings (no shapes or objectCountRules needed):
{
"gameType": "rotate-to-fit",
"rounds": 20
}
{
"gameType": "card-flip",
"rounds": 5,
"gridSizes": [
[2, 2],
[4, 4],
[6, 6],
[7, 6],
[8, 8]
]
}
Configuration:
gameType (required): Must be "card-flip"rounds (optional): Number of rounds - Default: 5 (recommended for 100 points max)gridSizes (optional): Array of grid sizes - Default: [[2, 2], [4, 4], [6, 6], [7, 6], [8, 8]]
[width, height] or a number (for square grids)Scoring:
Controls:
Goal:
Features:
Recommended Settings:
{
"gameType": "sound-memory",
"rounds": 10
}
Or with predefined sequences for each round:
{
"gameType": "sound-memory",
"rounds": 10,
"roundSequences": [
[2],
[2, 3],
[2, 3, 1],
[2, 3, 1, 1],
[2, 3, 1, 1, 4],
[3, 1, 4, 2, 2],
[3, 1, 4, 2, 2, 1],
[4, 2, 1, 3, 1, 2, 4],
[1, 2, 4, 1, 3, 2, 3, 4],
[2, 4, 1, 3, 2, 1, 4, 3, 1]
]
}
Configuration:
gameType (required): Must be "sound-memory"rounds (optional): Number of rounds - Default: 10 (recommended for 100 points max)roundSequences (optional): Array of predefined sequences for each round
roundSequences[0] is for round 1, roundSequences[1] is for round 2, etc.[2, 3, 1] means round 3 will play buttons 2 → 3 → 1 in orderScoring:
Controls:
Goal:
Features:
Game States:
UI/UX Features:
Recommended Settings:
{
"gameType": "click-green",
"levels": 10,
"levelDuration": 20,
"levelRequirements": [
{ "minCorrectClicks": 3 },
{ "minCorrectClicks": 4 },
{ "minCorrectClicks": 5 },
{ "minCorrectClicks": 6 },
{ "minCorrectClicks": 7 },
{ "minCorrectClicks": 8 },
{ "minCorrectClicks": 9 },
{ "minCorrectClicks": 10 },
{ "minCorrectClicks": 11 },
{ "minCorrectClicks": 12 }
]
}
Configuration:
gameType (required): Must be "click-green"levels (optional): Number of levels - Default: 10levelDuration (optional): Duration per level in seconds - Default: 20 secondslevelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCorrectClicks (minimum number of correct green clicks required)minCorrectClicks = 3 + levelLevel Duration:
Level Passing Requirements:
Për të kaluar çdo level, duhet të plotësosh kushtin:
Minimum Correct Clicks: Duhet të klikosh të paktën X green items
Nëse nuk plotëson kushtet:
Scoring:
correctClicks * 10 - wrongClicks * 5Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "avoid-red",
"levels": 10,
"levelRequirements": [
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 },
{ "minSurvivalTime": 20, "maxHits": 0 }
]
}
Configuration:
gameType (required): Must be "avoid-red"levels (optional): Number of levels - Default: 10levelRequirements (required): Array of requirements for each level
minSurvivalTime (seconds to survive) and maxHits (maximum hits allowed){"minSurvivalTime": 20, "maxHits": 0} means survive 20 seconds with 0 hitsLevel Requirements:
Level Passing Requirements:
Për të kaluar çdo level, duhet të:
minSurvivalTimemaxHits herë (zakonisht 0)Nëse nuk plotëson kushtet:
Scoring:
score = completedLevels * (100 / maxLevels)Controls:
Goal:
minSurvivalTime (per level)How It Works:
minSurvivalTime for that levelminSurvivalTime with hits ≤ maxHits, the level completesmaxHits, the level fails immediatelyFeatures:
requestAnimationFrameTips:
Recommended Settings:
{
"gameType": "reaction-test",
"levels": 10,
"levelRequirements": [
{ "maxTime": "700ms" },
{ "maxTime": "900ms" },
{ "maxTime": "1.2s" },
{ "maxTime": "1.5sec" },
{ "maxTime": 2000 },
{ "maxTime": "1.8s" },
{ "maxTime": "1.0s" },
{ "maxTime": "2.0s" },
{ "maxTime": "1.2s" },
{ "maxTime": "2.5s" }
]
}
Configuration:
gameType (required): Must be "reaction-test"levels (optional): Number of levels - Default: 10levelRequirements (required): Array of requirements for each level
maxTime (maximum reaction time allowed)maxTime can be specified in multiple formats:
"700ms", "1.2s", "1.5sec"2000 (means 2000ms = 2 seconds)Level Requirements:
Level Passing Requirements:
Për të kaluar çdo level, duhet të:
maxTimemaxTime, merr 100 points për levelmaxTime, score zvogëlohet gradualishtNëse nuk plotëson kushtet:
Scoring:
score = completedLevels * (100 / maxLevels)Game Variants:
Reaction Test përfshin 10 variante unike të mini-lojave:
Controls:
Goal:
How It Works:
maxTime for that level, you passmaxTime, you fail and must retryFeatures:
Tips:
Recommended Settings:
{
"gameType": "fast-math",
"levels": 20,
"levelDuration": 30,
"levelRequirements": [
{ "minCorrectAnswers": 5 },
{ "minCorrectAnswers": 6 },
{ "minCorrectAnswers": 7 },
{ "minCorrectAnswers": 8 },
{ "minCorrectAnswers": 9 },
{ "minCorrectAnswers": 10 },
{ "minCorrectAnswers": 11 },
{ "minCorrectAnswers": 12 },
{ "minCorrectAnswers": 13 },
{ "minCorrectAnswers": 14 },
{ "minCorrectAnswers": 15 },
{ "minCorrectAnswers": 16 },
{ "minCorrectAnswers": 17 },
{ "minCorrectAnswers": 18 },
{ "minCorrectAnswers": 19 },
{ "minCorrectAnswers": 20 },
{ "minCorrectAnswers": 21 },
{ "minCorrectAnswers": 22 },
{ "minCorrectAnswers": 23 },
{ "minCorrectAnswers": 24 }
]
}
Configuration:
gameType (required): Must be "fast-math"levels (optional): Number of levels - Default: 20levelDuration (optional): Duration per level in seconds - Default: 30 secondslevelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCorrectAnswers (minimum number of correct answers required)minCorrectAnswers = 5 + levelLevel Requirements:
{"minCorrectAnswers": 5} means you need at least 5 correct answers to pass level 1Level Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
{
"gameType": "typing-sprint",
"levels": 15,
"levelRequirements": [
{
"minCorrectWords": 3,
"duration": 30,
"words": [
"cat",
"dog",
"sun",
"moon",
"star",
"tree",
"bird",
"fish",
"book",
"pen",
"cup",
"hat",
"car",
"bus",
"key",
"door"
]
},
{
"minCorrectWords": 4,
"duration": 30,
"words": [
"apple",
"banana",
"orange",
"purple",
"yellow",
"green",
"computer",
"keyboard",
"window",
"garden",
"forest",
"ocean",
"planet",
"camera",
"guitar",
"pencil"
]
},
{
"minCorrectWords": 5,
"duration": 30,
"words": [
"beautiful",
"wonderful",
"adventure",
"mountain",
"elephant",
"butterfly",
"chocolate",
"dinosaur",
"hospital",
"university",
"keyboard",
"computer",
"internet",
"software",
"hardware"
]
},
{
"minCorrectWords": 6,
"duration": 30,
"words": [
"don't",
"can't",
"won't",
"it's",
"we're",
"they're",
"you're",
"I'm",
"he's",
"she's",
"let's",
"that's"
]
},
{
"minCorrectWords": 7,
"duration": 30,
"words": [
"The quick brown fox jumps over the lazy dog",
"Practice makes perfect in everything you do",
"Learning new skills takes time and dedication",
"Success comes to those who never give up"
]
},
{
"minCorrectWords": 8,
"duration": 30,
"words": [
"12345",
"67890",
"246813579",
"9876543210",
"314159265",
"271828182",
"1000000",
"9999999"
]
},
{
"minCorrectWords": 9,
"duration": 30,
"words": [
"JavaScript",
"TypeScript",
"React",
"NodeJS",
"Python",
"Java",
"CSharp",
"GoLang",
"Swift",
"Kotlin"
]
},
{
"minCorrectWords": 10,
"duration": 30,
"words": [
"helloworld",
"goodmorning",
"thankyou",
"welcomeback",
"seeyoulater",
"haveaniceday",
"goodluck",
"congratulations"
]
},
{
"minCorrectWords": 11,
"duration": 30,
"words": [
"racecar",
"level",
"radar",
"civic",
"rotor",
"deified",
"repaper",
"redder"
]
},
{
"minCorrectWords": 12,
"duration": 30,
"words": [
"go",
"hi",
"ok",
"no",
"yes",
"run",
"fly",
"jump",
"fast",
"quick",
"rapid",
"swift",
"speed",
"haste"
]
},
{
"minCorrectWords": 13,
"duration": 30,
"words": [
"The early bird catches the worm in the morning",
"A picture is worth a thousand words they say",
"Actions speak louder than words in real life",
"Better late than never is a common saying"
]
},
{
"minCorrectWords": 14,
"duration": 30,
"words": [
"[email protected]",
"user_name",
"price$99",
"score#1",
"item&item",
"test+test",
"value=100",
"key:value"
]
},
{
"minCorrectWords": 15,
"duration": 30,
"words": [
"abc123",
"test456",
"user789",
"code2024",
"game50",
"level15",
"score100",
"time60"
]
},
{
"minCorrectWords": 16,
"duration": 30,
"words": [
"The quick brown fox jumps over the lazy dog in the park",
"She sells seashells by the seashore every single day",
"How much wood would a woodchuck chuck if he could",
"Peter Piper picked a peck of pickled peppers today"
]
},
{
"minCorrectWords": 17,
"duration": 30,
"words": [
"Antidisestablishmentarianism",
"Pneumonoultramicroscopicsilicovolcanoconiosis",
"The quick brown fox jumps over the lazy dog quickly",
"JavaScript TypeScript React NodeJS Python Java CSharp"
]
}
]
}
Configuration:
gameType (required): Must be "typing-sprint"levels (optional): Number of levels - Default: 15levelRequirements (required): Array of requirements for each level
minCorrectWords: Minimum number of correct words required to passduration: Duration per level in secondswords: Array of words/sentences for that level (or comma-separated string)Level Requirements:
{"minCorrectWords": 3, "duration": 30, "words": ["cat", "dog", "sun"]} means you need at least 3 correct words in 30 seconds to pass level 1Level Progression:
Features:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "quick-compare",
"levels": 15,
"levelRequirements": [
{ "minCorrectAnswers": 5, "duration": 30 },
{ "minCorrectAnswers": 6, "duration": 30 },
{ "minCorrectAnswers": 7, "duration": 30 },
{ "minCorrectAnswers": 8, "duration": 30 },
{ "minCorrectAnswers": 9, "duration": 30 },
{ "minCorrectAnswers": 10, "duration": 30 },
{ "minCorrectAnswers": 11, "duration": 30 },
{ "minCorrectAnswers": 12, "duration": 30 },
{ "minCorrectAnswers": 13, "duration": 30 },
{ "minCorrectAnswers": 14, "duration": 30 },
{ "minCorrectAnswers": 15, "duration": 30 },
{ "minCorrectAnswers": 16, "duration": 30 },
{ "minCorrectAnswers": 17, "duration": 30 },
{ "minCorrectAnswers": 18, "duration": 30 },
{ "minCorrectAnswers": 20, "duration": 30 }
]
}
Configuration:
gameType (required): Must be "quick-compare"levels (optional): Number of levels - Default: 15levelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCorrectAnswers (required): Minimum number of correct comparisons to pass the levelduration (optional): Duration in seconds for this specific level (default: 30)Level Requirements:
Level Passing Requirements:
duration)Scoring:
completedLevels * (100 / maxLevels){
"gameType": "falling-objects",
"levels": 15,
"levelRequirements": [
{ "minCaughtGood": 8, "duration": 30 },
{ "minCaughtGood": 10, "duration": 30 },
{ "minCaughtGood": 12, "duration": 30 },
{ "minCaughtGood": 14, "duration": 30 },
{ "minCaughtGood": 16, "duration": 30 },
{ "minCaughtGood": 18, "duration": 30 },
{ "minCaughtGood": 20, "duration": 30 },
{ "minCaughtGood": 22, "duration": 30 },
{ "minCaughtGood": 24, "duration": 30 },
{ "minCaughtGood": 26, "duration": 30 },
{ "minCaughtGood": 28, "duration": 30 },
{ "minCaughtGood": 30, "duration": 30 },
{ "minCaughtGood": 32, "duration": 30 },
{ "minCaughtGood": 35, "duration": 30 },
{ "minCaughtGood": 40, "duration": 30 }
]
}
Configuration:
gameType (required): Must be "falling-objects"levels (optional): Number of levels - Default: 15levelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCaughtGood (required): Minimum number of good objects to catch to pass the levelduration (optional): Duration in seconds for this specific level (default: 30)Level Requirements:
Level Passing Requirements:
duration)Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
How It Works:
Level Progression:
Features:
Controls:
< button if left number is smaller, > button if left number is larger,) or <: Select "<" (left number is smaller).) or >: Select ">" (left number is larger)Goal:
<) or greater than (>) the right numberHow It Works:
< if the left number is smaller than the right number> if the left number is larger than the right numberLevel Progression:
Features:
Tips:
, and .) for faster comparisonsRecommended Settings:
{
"gameType": "tap-counter",
"levels": 15,
"levelRequirements": [
{ "minTaps": 20, "duration": 10 },
{ "minTaps": 25, "duration": 10 },
{ "minTaps": 30, "duration": 10 },
{ "minTaps": 35, "duration": 10 },
{ "minTaps": 40, "duration": 10 },
{ "minTaps": 45, "duration": 10 },
{ "minTaps": 50, "duration": 10 },
{ "minTaps": 55, "duration": 10 },
{ "minTaps": 60, "duration": 10 },
{ "minTaps": 65, "duration": 10 },
{ "minTaps": 70, "duration": 10 },
{ "minTaps": 75, "duration": 10 },
{ "minTaps": 80, "duration": 10 },
{ "minTaps": 85, "duration": 10 },
{ "minTaps": 90, "duration": 10 }
]
}
Configuration:
gameType (required): Must be "tap-counter"levels (optional): Number of levels - Default: 15levelRequirements (optional): Array of requirements for each level - Default: auto-progression
minTaps (required): Minimum number of taps required to pass the levelduration (optional): Duration in seconds for this specific level (default: 10)Level Requirements:
Level Passing Requirements:
duration)Scoring:
Math.min(100, Math.round((taps / minTaps) * 100))Math.round(totalScore / maxLevels)Controls:
Goal:
How It Works:
Level Progression:
Features:
Tips:
Recommended Settings:
{
"gameType": "reflex-arrow",
"levels": 15,
"levelRequirements": [
{ "minCorrect": 8, "duration": 30, "arrowInterval": 2500 },
{ "minCorrect": 9, "duration": 30, "arrowInterval": 2300 },
{ "minCorrect": 10, "duration": 30, "arrowInterval": 2100 },
{ "minCorrect": 11, "duration": 30, "arrowInterval": 1900 },
{ "minCorrect": 12, "duration": 30, "arrowInterval": 1700 },
{ "minCorrect": 13, "duration": 30, "arrowInterval": 1500 },
{ "minCorrect": 14, "duration": 30, "arrowInterval": 1300 },
{ "minCorrect": 15, "duration": 30, "arrowInterval": 1200 },
{ "minCorrect": 16, "duration": 30, "arrowInterval": 1100 },
{ "minCorrect": 17, "duration": 30, "arrowInterval": 1000 },
{ "minCorrect": 18, "duration": 30, "arrowInterval": 900 },
{ "minCorrect": 19, "duration": 30, "arrowInterval": 800 },
{ "minCorrect": 20, "duration": 30, "arrowInterval": 700 },
{ "minCorrect": 21, "duration": 30, "arrowInterval": 600 },
{ "minCorrect": 22, "duration": 30, "arrowInterval": 500 }
]
}
Configuration:
gameType (required): Must be "reflex-arrow"levels (optional): Number of levels - Default: 15levelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCorrect (required): Minimum number of correct arrow matches required to pass the levelduration (optional): Duration in seconds for this specific level (default: 30)arrowInterval (optional): Time in milliseconds between arrow changes (default: 2000)Level Requirements:
Level Passing Requirements:
duration)Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
How It Works:
Level Progression:
Features:
Tips:
Recommended Settings:
{
"gameType": "whack-shape",
"levels": 10,
"levelDuration": 20,
"levelRequirements": [
{ "minCorrectClicks": 3, "duration": 20 },
{ "minCorrectClicks": 4, "duration": 20 },
{ "minCorrectClicks": 5, "duration": 20 },
{ "minCorrectClicks": 6, "duration": 20 },
{ "minCorrectClicks": 7, "duration": 20 },
{ "minCorrectClicks": 8, "duration": 20 },
{ "minCorrectClicks": 9, "duration": 20 },
{ "minCorrectClicks": 10, "duration": 20 },
{ "minCorrectClicks": 11, "duration": 20 },
{ "minCorrectClicks": 12, "duration": 20 }
]
}
Configuration:
gameType (required): Must be "whack-shape"levels (optional): Number of levels - Default: 10levelDuration (optional): Default duration in seconds per level - Default: 20 (used as fallback if not specified in levelRequirements)levelRequirements (optional): Array of requirements for each level - Default: auto-progression
minCorrectClicks (required): Minimum number of correct clicks to pass the levelduration (optional): Duration in seconds for this specific level (overrides levelDuration)Level Requirements:
Level Passing Requirements:
duration)Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
How It Works:
Features:
duration in levelRequirements)Progressive Difficulty:
Tips:
Recommended Settings:
{
"gameType": "maze-escape",
"rounds": 20
}
Configuration:
gameType (required): Must be "maze-escape"rounds (optional): Number of rounds - Default: 20 (recommended for 2000 points max)size (optional): Fixed grid size (overrides dynamic sizing) - Default: dynamic based on roundsGrid Size Configuration:
size (optional): Fixed grid size - if not specified, uses dynamic progression:
gridSizes (optional): Array of objects to configure grid sizes per round range:
{
"gameType": "maze-escape",
"rounds": 20,
"gridSizes": [
{ "rounds": 5, "size": 10 },
{ "rounds": 10, "size": 15 },
{ "rounds": 20, "size": 20 }
]
}
rounds (max round for this size) and size (grid size){"gameType": "maze-escape", "rounds": 20, "size": 15} for fixed 15x15 gridScoring:
Controls:
Goal:
Features:
Recommended Settings:
Backend Configuration Example:
In WordPress admin, when creating/editing a game:
Title: "Maze Escape"
Game Type: Logic
Game Order: 8 (or your desired order)
Difficulty: 3
Time Limit: 300
Passing Score: 1600
Description: "Navigate from start to exit through a maze"
Game Config (JSON):
{
"gameType": "maze-escape",
"rounds": 20
}
Or with fixed grid size:
{
"gameType": "maze-escape",
"rounds": 20,
"size": 15
}
Quick Fill Template:
In WordPress admin, you can use the "Quick Fill Templates" dropdown and select "8. Maze Escape" to auto-fill all fields with recommended settings.
{
"gameType": "mirror-match",
"rounds": 20,
"mirrorTypes": ["horizontal", "vertical", "diagonal"],
"shapes": [
"WrenchWithJaw",
"LightningBolt",
"CameraOffCenter",
"FlagOnPole",
"SpiralCurl",
"GearAsymmetric",
"CircuitBranch",
"KeyAsymmetric",
"ShieldOffCenter",
"BirdAsymmetric",
"AnchorOffset",
"PaperclipUneven",
"RocketOneFin",
"PuzzleMissingTab"
],
"optionsCount": 3
}
Configuration:
gameType (required): Must be "mirror-match"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)mirrorTypes (optional): Array of mirror types to use - Default: ["horizontal", "vertical", "diagonal"]
"horizontal" (flips left ↔ right), "vertical" (flips top ↔ bottom), "diagonal" (flips both ways)shapes (optional): Array of custom SVG shape names - Default: 14 asymmetric shapes designed for clear mirror transformationsoptionsCount (optional): Number of options to display - Default: 3 (always shows horizontal, vertical, and diagonal mirrors)Scoring:
Controls:
Goal:
Features:
Recommended Settings:
{
"gameType": "logic-gates",
"rounds": 20,
"gates": ["AND", "OR", "NOT"],
"inputs": [0, 1],
"difficulty": "medium"
}
Configuration:
gameType (required): Must be "logic-gates"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)gates (optional): Array of gate types to use - Default: ["AND", "OR", "NOT"]
"AND", "OR", "NOT"inputs (optional): Array of possible input values - Default: [0, 1]difficulty (optional): Difficulty level - Default: "medium"Scoring:
Controls:
Goal:
Features:
Recommended Settings:
{
"gameType": "sequence-arrows",
"rounds": 20,
"sequenceLength": null
}
Configuration:
gameType (required): Must be "sequence-arrows"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)sequenceLength (optional): Fixed sequence length - Default: null (progressive difficulty)
null, sequence length increases: rounds 1-5 = 3, 6-10 = 4, 11-15 = 5, 16-20 = 6Scoring:
Controls:
Goal:
Pattern Types:
Features:
Recommended Settings:
{
"gameType": "emoji-memory",
"rounds": 20,
"gridSizes": [
[4, 4],
[4, 4],
[4, 4],
[4, 4],
[4, 4],
[5, 5],
[5, 5],
[5, 5],
[5, 5],
[5, 5],
[6, 7],
[6, 7],
[6, 7],
[6, 7],
[6, 7],
[8, 8],
[8, 8],
[8, 8],
[8, 8],
[8, 8]
]
}
Configuration:
gameType (required): Must be "emoji-memory"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)gridSizes (optional): Array of grid sizes for each round - Default: Calculated automatically
[width, height] representing the grid size for that roundScoring:
Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "number-recall",
"rounds": 15
}
Configuration:
gameType (required): Must be "number-recall"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)Scoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "image-recall",
"rounds": 15,
"gridSizes": [3, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6]
}
Configuration:
gameType (required): Must be "image-recall"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)gridSizes (optional): Array of grid sizes per round - Default: [3, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6]
gridSizes array is shorter than rounds, remaining rounds use the last grid size from array or fallback to default calculationScoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "path-memory",
"rounds": 15,
"gridSize": 5
}
Configuration:
gameType (required): Must be "path-memory"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)gridSize (optional): Grid size - Default: 5 (5x5 grid)Scoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "word-memory",
"rounds": 15,
"gridSizes": [3, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6]
}
Configuration:
gameType (required): Must be "word-memory"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)gridSizes (optional): Array of grid sizes per round - Default: [3, 3, 3, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6]
gridSizes array is shorter than rounds, remaining rounds use the last grid size from array or fallback to default calculationScoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "face-memory",
"rounds": 15
}
Configuration:
gameType (required): Must be "face-memory"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)Scoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "color-grid-memory",
"rounds": 20
}
Configuration:
gameType (required): Must be "color-grid-memory"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)Scoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "symbol-stack",
"rounds": 15
}
Configuration:
gameType (required): Must be "symbol-stack"rounds (optional): Number of rounds - Default: 15 (recommended for 100 points max)Scoring:
Math.round((completedRounds / maxRounds) * 100)Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "block-fill",
"rounds": 20,
"gridSize": 6
}
Configuration:
gameType (required): Must be "block-fill"rounds (optional): Number of rounds - Default: 20 (recommended for 100 points max)gridSize (optional): Base size of the grid - Default: 6 (6x6 grid)
Scoring:
Controls:
Goal:
How It Works:
Features:
Tips:
Recommended Settings:
{
"gameType": "ball-balance",
"levels": 15,
"levelRequirements": [
{ "minTimeInCenter": 3, "duration": 10 },
{ "minTimeInCenter": 4, "duration": 10 },
{ "minTimeInCenter": 5, "duration": 12 },
{ "minTimeInCenter": 6, "duration": 15 },
{ "minTimeInCenter": 7, "duration": 18 },
{
"minTimeInCenter": 8,
"duration": 18,
"shrinkingPlatform": true,
"shrinkMinScale": 0.1,
"shrinkDelay": 0
},
{
"minTimeInCenter": 9,
"duration": 10,
"shrinkingPlatform": true,
"shrinkMinScale": 0.3,
"shrinkDelay": 0
},
{
"minTimeInCenter": 10,
"duration": 18,
"redZones": [
{ "start": -100, "end": -60 },
{ "start": 60, "end": 100 }
]
},
{
"minTimeInCenter": 11,
"duration": 18,
"redZones": [
{ "start": -90, "end": -50 },
{ "start": 50, "end": 90 }
]
},
{
"minTimeInCenter": 12,
"duration": 30,
"shrinkingPlatform": true,
"shrinkMinScale": 0.4,
"redZones": [
{ "start": -85, "end": -45 },
{ "start": 45, "end": 85 }
]
},
{
"minTimeInCenter": 13,
"duration": 30,
"platformShake": true,
"shakeInterval": 6,
"shakeIntensity": 12,
"shakeDuration": 1.1,
"shakeFrequency": 13,
"shakeAngle": 10
},
{
"minTimeInCenter": 14,
"duration": 25,
"platformShake": true,
"shakeInterval": 5,
"shakeIntensity": 13,
"shakeDuration": 1,
"shakeFrequency": 14,
"shakeAngle": 15
},
{
"minTimeInCenter": 15,
"duration": 50,
"windZones": [
{ "start": -80, "end": -40, "force": -80 },
{ "start": 40, "end": 80, "force": 80 }
]
},
{
"minTimeInCenter": 16,
"duration": 50,
"platformShake": true,
"shakeInterval": 4,
"shakeIntensity": 14,
"shakeDuration": 1,
"shakeFrequency": 15,
"shakeAngle": 16,
"windZones": [
{ "start": -75, "end": -35, "force": -90 },
{ "start": 35, "end": 75, "force": 90 }
]
},
{
"minTimeInCenter": 20,
"duration": 50,
"shrinkingPlatform": true,
"shrinkMinScale": 0.35,
"redZones": [
{ "start": -70, "end": -30 },
{ "start": 30, "end": 70 }
],
"platformShake": true,
"shakeInterval": 3,
"shakeIntensity": 16,
"shakeDuration": 1.1,
"shakeFrequency": 16,
"shakeAngle": 18,
"windZones": [
{ "start": -65, "end": -25, "force": -110 },
{ "start": 25, "end": 65, "force": 110 }
]
}
]
}
{
"gameType": "target-aim",
"levels": 15,
"levelRequirements": [
{ "minTargetsHit": 5, "duration": 20 },
{ "minTargetsHit": 7, "duration": 20 },
{ "minTargetsHit": 9, "duration": 20 },
{ "minTargetsHit": 11, "duration": 20 },
{ "minTargetsHit": 13, "duration": 20 },
{ "minTargetsHit": 15, "duration": 20, "movingTargets": true },
{ "minTargetsHit": 17, "duration": 20, "movingTargets": true },
{ "minTargetsHit": 19, "duration": 20, "multipleTargets": true },
{
"minTargetsHit": 21,
"duration": 20,
"movingTargets": true,
"multipleTargets": true
},
{ "minTargetsHit": 23, "duration": 20, "shrinkingTargets": true },
{
"minTargetsHit": 25,
"duration": 20,
"movingTargets": true,
"shrinkingTargets": true
},
{
"minTargetsHit": 27,
"duration": 20,
"multipleTargets": true,
"shrinkingTargets": true
},
{
"minTargetsHit": 29,
"duration": 20,
"movingTargets": true,
"multipleTargets": true,
"shrinkingTargets": true
},
{
"minTargetsHit": 31,
"duration": 20,
"movingTargets": true,
"multipleTargets": true,
"shrinkingTargets": true
},
{
"minTargetsHit": 35,
"duration": 20,
"movingTargets": true,
"multipleTargets": true,
"shrinkingTargets": true
}
]
}
Description:
Aim and hit targets with precision across 15 progressively challenging levels. Move the target icon (crosshair) with keyboard (WASD/Arrow keys) or mouse, and hit targets when they are near the center.
Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
{
"gameType": "speed-drawing",
"levels": 15,
"levelDefinitions": [
{ "duration": 20, "targetShape": "circle", "minAccuracy": 60 },
{ "duration": 20, "targetShape": "square", "minAccuracy": 62 },
{ "duration": 18, "targetShape": "triangle", "minAccuracy": 65 },
{ "duration": 18, "targetShape": "star", "minAccuracy": 67 },
{ "duration": 16, "targetShape": "heart", "minAccuracy": 70 },
{ "duration": 16, "targetShape": "wave", "minAccuracy": 72 },
{ "duration": 15, "targetShape": "curve", "minAccuracy": 75 },
{ "duration": 15, "targetShape": "zigzag", "minAccuracy": 77 },
{ "duration": 14, "targetShape": "circle", "minAccuracy": 78 },
{ "duration": 14, "targetShape": "square", "minAccuracy": 80 },
{ "duration": 13, "targetShape": "triangle", "minAccuracy": 82 },
{ "duration": 13, "targetShape": "star", "minAccuracy": 83 },
{ "duration": 12, "targetShape": "heart", "minAccuracy": 84 },
{ "duration": 12, "targetShape": "wave", "minAccuracy": 85 },
{ "duration": 10, "targetShape": "spiral", "minAccuracy": 85 }
]
}
Description:
Draw target shapes as accurately as possible within the time limit. Each level has a specific shape to draw (circle, square, triangle, star, heart, wave, curve, zigzag, spiral) with increasing accuracy requirements.
Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
{
"gameType": "one-hand-mode",
"levels": 15,
"levelRequirements": [
{ "duration": 6, "speed": 260, "spawnInterval": 1.1 },
{ "duration": 5.85, "speed": 290, "spawnInterval": 1.067 },
{ "duration": 5.7, "speed": 320, "spawnInterval": 1.034 },
{ "duration": 5.55, "speed": 350, "spawnInterval": 1.001 },
{ "duration": 5.4, "speed": 380, "spawnInterval": 0.968 },
{ "duration": 5.1, "speed": 410, "spawnInterval": 0.902 },
{ "duration": 4.95, "speed": 440, "spawnInterval": 0.869 },
{ "duration": 4.8, "speed": 470, "spawnInterval": 0.836 },
{ "duration": 4.65, "speed": 500, "spawnInterval": 0.803 },
{ "duration": 4.5, "speed": 530, "spawnInterval": 0.77 },
{ "duration": 4.4, "speed": 560, "spawnInterval": 0.737 },
{ "duration": 4.25, "speed": 590, "spawnInterval": 0.704 },
{ "duration": 4.1, "speed": 620, "spawnInterval": 0.671 },
{ "duration": 3.95, "speed": 650, "spawnInterval": 0.638 },
{ "duration": 3.8, "speed": 680, "spawnInterval": 0.6 }
]
}
Description:
Control a character that runs automatically through an endless runner. Jump over obstacles using a single input (click, tap, or spacebar). Test your timing and reflexes across 15 progressively challenging levels with increasing speed, shorter durations, and more frequent obstacles.
Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
Level Progression:
Features:
{
"gameType": "cursor-maze",
"levels": 15,
"levelRequirements": [
{ "duration": 60 },
{ "duration": 58 },
{ "duration": 56 },
{ "duration": 54 },
{ "duration": 52 },
{ "duration": 48 },
{ "duration": 46 },
{ "duration": 44 },
{ "duration": 42 },
{ "duration": 40 },
{ "duration": 38 },
{ "duration": 36 },
{ "duration": 34 },
{ "duration": 32 },
{ "duration": 30 }
]
}
Description:
Navigate a blue square through a procedurally generated maze to reach the green exit. Avoid touching walls - if you hit a wall, you'll stay at your current position (no reset to start). The game has 15 levels with increasing difficulty (larger mazes and shorter time limits).
Scoring:
completedLevels * (100 / maxLevels)Controls:
Goal:
Level Progression:
Features:
Tips:
{
"gameType": "line-tracer",
"levels": 15,
"levelRequirements": [
{
"minAccuracy": 40,
"minProgress": 80,
"duration": 60,
"pathType": "smooth",
"complexity": 3,
"pathLength": 12
},
{
"minAccuracy": 45,
"minProgress": 82,
"duration": 60,
"pathType": "smooth",
"complexity": 3,
"pathLength": 12
},
{
"minAccuracy": 50,
"minProgress": 84,
"duration": 60,
"pathType": "smooth",
"complexity": 4,
"pathLength": 11
},
{
"minAccuracy": 52,
"minProgress": 85,
"duration": 62,
"pathType": "smooth",
"complexity": 4,
"pathLength": 11
},
{
"minAccuracy": 55,
"minProgress": 86,
"duration": 80,
"pathType": "zigzag",
"complexity": 5,
"pathLength": 10
},
{
"minAccuracy": 60,
"minProgress": 87,
"duration": 100,
"pathType": "zigzag",
"complexity": 5,
"pathLength": 10
},
{
"minAccuracy": 62,
"minProgress": 88,
"duration": 110,
"pathType": "zigzag",
"complexity": 6,
"pathLength": 9
},
{
"minAccuracy": 65,
"minProgress": 89,
"duration": 130,
"pathType": "spiral",
"complexity": 6,
"pathLength": 9
},
{
"minAccuracy": 65,
"minProgress": 90,
"duration": 140,
"pathType": "spiral",
"complexity": 7,
"pathLength": 8
},
{
"minAccuracy": 70,
"minProgress": 91,
"duration": 130,
"pathType": "circle",
"complexity": 7,
"pathLength": 8
},
{
"minAccuracy": 75,
"minProgress": 92,
"duration": 140,
"pathType": "smooth",
"complexity": 8,
"pathLength": 8
},
{
"minAccuracy": 75,
"minProgress": 93,
"duration": 160,
"pathType": "zigzag",
"complexity": 8,
"pathLength": 8
},
{
"minAccuracy": 80,
"minProgress": 94,
"duration": 180,
"pathType": "spiral",
"complexity": 9,
"pathLength": 7
},
{
"minAccuracy": 82,
"minProgress": 95,
"duration": 200,
"pathType": "circle",
"complexity": 9,
"pathLength": 7
},
{
"minAccuracy": 85,
"minProgress": 95,
"duration": 220,
"pathType": "smooth",
"complexity": 10,
"pathLength": 7
}
]
}
Description:
Trace paths with precision across 15 progressively challenging levels. Use your mouse or touch to follow the blue line as accurately as possible. Features include different path types (smooth, zigzag, spiral, circle) and increasing accuracy requirements.
Configuration:
gameType (required): Must be "line-tracer"levels (optional): Number of levels - Default: 15levelRequirements (required): Array of requirements for each level
minAccuracy: Minimum accuracy percentage required (0-100)minProgress: Minimum progress percentage required (0-100)duration: Duration per level in secondspathType: Type of path - "smooth", "zigzag", "spiral", or "circle"complexity: Path complexity (higher = more complex curves)pathLength: Path length multiplierLevel Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
Features:
{
"gameType": "timing-bar",
"levels": 15,
"levelRequirements": [
{ "minStops": 3, "duration": 30, "targetZoneWidth": 20, "barSpeed": 1.2 },
{ "minStops": 3, "duration": 30, "targetZoneWidth": 19, "barSpeed": 1.3 },
{ "minStops": 4, "duration": 30, "targetZoneWidth": 18, "barSpeed": 1.4 },
{ "minStops": 4, "duration": 30, "targetZoneWidth": 17, "barSpeed": 1.5 },
{ "minStops": 4, "duration": 30, "targetZoneWidth": 16, "barSpeed": 1.6 },
{ "minStops": 5, "duration": 30, "targetZoneWidth": 15, "barSpeed": 1.7 },
{ "minStops": 5, "duration": 30, "targetZoneWidth": 14, "barSpeed": 1.8 },
{ "minStops": 5, "duration": 30, "targetZoneWidth": 13, "barSpeed": 1.9 },
{ "minStops": 6, "duration": 30, "targetZoneWidth": 12, "barSpeed": 2.0 },
{ "minStops": 6, "duration": 30, "targetZoneWidth": 11, "barSpeed": 2.1 },
{ "minStops": 6, "duration": 30, "targetZoneWidth": 10, "barSpeed": 2.2 },
{ "minStops": 7, "duration": 30, "targetZoneWidth": 9, "barSpeed": 2.3 },
{ "minStops": 7, "duration": 30, "targetZoneWidth": 9, "barSpeed": 2.4 },
{ "minStops": 8, "duration": 30, "targetZoneWidth": 8, "barSpeed": 2.4 },
{ "minStops": 8, "duration": 30, "targetZoneWidth": 8, "barSpeed": 2.5 }
]
}
Description:
Stop the moving bar at the highlighted green zone. Test your timing and precision across 15 progressively challenging levels with increasing speed and smaller target zones.
Configuration:
gameType (required): Must be "timing-bar"levels (optional): Number of levels - Default: 15levelRequirements (required): Array of requirements for each level
minStops: Minimum number of successful stops requiredduration: Duration per level in secondstargetZoneWidth: Width of the target zone (percentage, smaller = harder)barSpeed: Speed multiplier for the moving bar (higher = faster)Level Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
Features:
{
"gameType": "stack-blocks",
"levels": 15,
"levelRequirements": [
{
"minBlocks": 5,
"duration": 30,
"blockSpeed": 0.5,
"initialBlockWidth": 50,
"widthReduction": 2
},
{
"minBlocks": 5,
"duration": 30,
"blockSpeed": 0.6,
"initialBlockWidth": 48,
"widthReduction": 2
},
{
"minBlocks": 6,
"duration": 30,
"blockSpeed": 0.7,
"initialBlockWidth": 46,
"widthReduction": 1.9
},
{
"minBlocks": 6,
"duration": 30,
"blockSpeed": 0.8,
"initialBlockWidth": 44,
"widthReduction": 1.9
},
{
"minBlocks": 7,
"duration": 30,
"blockSpeed": 0.9,
"initialBlockWidth": 42,
"widthReduction": 1.8
},
{
"minBlocks": 7,
"duration": 30,
"blockSpeed": 1.0,
"initialBlockWidth": 40,
"widthReduction": 1.8
},
{
"minBlocks": 8,
"duration": 30,
"blockSpeed": 1.1,
"initialBlockWidth": 38,
"widthReduction": 1.7
},
{
"minBlocks": 8,
"duration": 30,
"blockSpeed": 1.2,
"initialBlockWidth": 36,
"widthReduction": 1.7
},
{
"minBlocks": 9,
"duration": 30,
"blockSpeed": 1.3,
"initialBlockWidth": 34,
"widthReduction": 1.6
},
{
"minBlocks": 9,
"duration": 30,
"blockSpeed": 1.4,
"initialBlockWidth": 32,
"widthReduction": 1.6
},
{
"minBlocks": 10,
"duration": 30,
"blockSpeed": 1.4,
"initialBlockWidth": 32,
"widthReduction": 1.5
},
{
"minBlocks": 10,
"duration": 30,
"blockSpeed": 1.5,
"initialBlockWidth": 30,
"widthReduction": 1.5
},
{
"minBlocks": 11,
"duration": 30,
"blockSpeed": 1.5,
"initialBlockWidth": 30,
"widthReduction": 1.5
},
{
"minBlocks": 11,
"duration": 30,
"blockSpeed": 1.5,
"initialBlockWidth": 30,
"widthReduction": 1.5
},
{
"minBlocks": 12,
"duration": 30,
"blockSpeed": 1.5,
"initialBlockWidth": 30,
"widthReduction": 1.5
}
]
}
Description:
Stack blocks as evenly as possible. Click on the moving green block to place it on the stack. Align blocks as close to center as possible to pass each level. Each block placed reduces in width based on overlap with the block below.
Configuration:
gameType (required): Must be "stack-blocks"levels (optional): Number of levels - Default: 15levelRequirements (required): Array of requirements for each level
minBlocks: Minimum number of blocks to place successfullyduration: Duration per level in secondsblockSpeed: Speed multiplier for the moving block (higher = faster)initialBlockWidth: Initial width of the first block (percentage of canvas width)widthReduction: Amount to reduce block width per placement (pixels)Level Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
Features:
{
"gameType": "precision-drop",
"levels": 15,
"levelRequirements": [
{
"drops": 1,
"duration": 30,
"targetWidth": 160,
"targetSpeed": 0,
"shakeEnabled": false,
"minHits": 1
},
{
"drops": 1,
"duration": 30,
"targetWidth": 148,
"targetSpeed": 0,
"shakeEnabled": false,
"minHits": 1
},
{
"drops": 1,
"duration": 30,
"targetWidth": 136,
"targetSpeed": 0,
"shakeEnabled": false,
"minHits": 1
},
{
"drops": 1,
"duration": 30,
"targetWidth": 124,
"targetSpeed": 0,
"shakeEnabled": false,
"minHits": 1
},
{
"drops": 3,
"duration": 30,
"targetWidth": 112,
"targetSpeed": 210,
"shakeEnabled": false,
"minHits": 2
},
{
"drops": 3,
"duration": 30,
"targetWidth": 100,
"targetSpeed": 228,
"shakeEnabled": false,
"minHits": 2
},
{
"drops": 3,
"duration": 30,
"targetWidth": 88,
"targetSpeed": 246,
"shakeEnabled": false,
"minHits": 2
},
{
"drops": 3,
"duration": 30,
"targetWidth": 76,
"targetSpeed": 264,
"shakeEnabled": false,
"minHits": 2
},
{
"drops": 3,
"duration": 30,
"targetWidth": 64,
"targetSpeed": 282,
"shakeEnabled": false,
"minHits": 2
},
{
"drops": 5,
"duration": 30,
"targetWidth": 52,
"targetSpeed": 300,
"shakeEnabled": true,
"minHits": 3
},
{
"drops": 5,
"duration": 30,
"targetWidth": 40,
"targetSpeed": 318,
"shakeEnabled": true,
"minHits": 3
},
{
"drops": 5,
"duration": 30,
"targetWidth": 32,
"targetSpeed": 336,
"shakeEnabled": true,
"minHits": 3
},
{
"drops": 5,
"duration": 30,
"targetWidth": 28,
"targetSpeed": 354,
"shakeEnabled": true,
"minHits": 3
},
{
"drops": 5,
"duration": 30,
"targetWidth": 26,
"targetSpeed": 372,
"shakeEnabled": true,
"minHits": 3
},
{
"drops": 5,
"duration": 30,
"targetWidth": 24,
"targetSpeed": 390,
"shakeEnabled": true,
"minHits": 3
}
]
}
Description:
Drop object into small target area. Move the object left/right, then click to drop it. Land fully inside the target to score. Each level has multiple drops (mini levels) that must be completed.
Configuration:
gameType (required): Must be "precision-drop"levels (optional): Number of levels - Default: 15levelRequirements (required): Array of requirements for each level
drops: Number of drops (mini levels) per levelduration: Duration per level in secondstargetWidth: Width of the target area in pixels (smaller = harder)targetSpeed: Speed of target movement in px/s (0 = static, >0 = moving)shakeEnabled: Whether platform shakes while object is falling (true/false)minHits: Minimum number of successful hits required to passLevel Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
Features:
{
"gameType": "drag-sort",
"levels": 15,
"levelDefinitions": [
{
"duration": 45,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "red",
"label": "🔴",
"color": "rgba(239, 68, 68, 0.25)",
"items": ["🔴", "🟥", "❤️", "🍎"]
},
{
"id": "blue",
"label": "🔵",
"color": "rgba(59, 130, 246, 0.25)",
"items": ["🔵", "🟦", "💙", "🧊"]
}
]
},
{
"duration": 45,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "circle",
"label": "⚪",
"color": "rgba(148, 163, 184, 0.25)",
"items": ["⚪", "⚫", "🔘", "⭕"]
},
{
"id": "square",
"label": "⬜",
"color": "rgba(203, 213, 225, 0.25)",
"items": ["⬜", "⬛", "◻️", "◼️"]
}
]
},
{
"duration": 40,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "big",
"label": "🐘",
"color": "rgba(34, 197, 94, 0.22)",
"items": ["🐘", "🚌", "🏠", "🐋"]
},
{
"id": "small",
"label": "🐭",
"color": "rgba(168, 85, 247, 0.22)",
"items": ["🐭", "🐜", "🍬", "🧸"]
}
]
},
{
"duration": 40,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "fruits",
"label": "🍎",
"color": "rgba(234, 88, 12, 0.25)",
"items": ["🍎", "🍌", "🍇", "🍉"]
},
{
"id": "animals",
"label": "🐶",
"color": "rgba(59, 130, 246, 0.25)",
"items": ["🐶", "🐱", "🐵", "🐯"]
}
]
},
{
"duration": 35,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "tools",
"label": "🔧",
"color": "rgba(148, 163, 184, 0.25)",
"items": ["🔧", "🔨", "🧰", "🪛"]
},
{
"id": "vehicles",
"label": "🚗",
"color": "rgba(59, 130, 246, 0.25)",
"items": ["🚗", "🚕", "🚲", "🚁"]
}
]
},
{
"duration": 35,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "food",
"label": "🍔",
"color": "rgba(245, 158, 11, 0.25)",
"items": ["🍔", "🍕", "🍟", "🌮"]
},
{
"id": "drinks",
"label": "🥤",
"color": "rgba(14, 165, 233, 0.25)",
"items": ["🥤", "🧃", "☕", "🥛"]
}
]
},
{
"duration": 35,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "living",
"label": "🌱",
"color": "rgba(34, 197, 94, 0.2)",
"items": ["🐶", "🐦", "🌳", "🐟"]
},
{
"id": "nonliving",
"label": "⚙️",
"color": "rgba(100, 116, 139, 0.25)",
"items": ["🪑", "📱", "🚗", "🧱"]
}
]
},
{
"duration": 30,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "indoor",
"label": "🏠",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["🛋️", "🛏️", "🚿", "🧴"]
},
{
"id": "outdoor",
"label": "🌤️",
"color": "rgba(234, 179, 8, 0.2)",
"items": ["🌳", "🏕️", "🏔️", "🏖️"]
}
]
},
{
"duration": 30,
"penaltySec": 0,
"minCorrect": 6,
"categories": [
{
"id": "natural",
"label": "🌿",
"color": "rgba(34, 197, 94, 0.2)",
"items": ["🌋", "🌊", "🌲", "🪨"]
},
{
"id": "manmade",
"label": "🏗️",
"color": "rgba(94, 234, 212, 0.2)",
"items": ["🏭", "🏢", "🛣️", "🧱"]
}
]
},
{
"duration": 28,
"penaltySec": 2,
"minCorrect": 6,
"categories": [
{
"id": "safe",
"label": "🛡️",
"color": "rgba(34, 197, 94, 0.2)",
"items": ["🪖", "🧯", "🦺", "🛟"]
},
{
"id": "danger",
"label": "⚠️",
"color": "rgba(239, 68, 68, 0.2)",
"items": ["🔥", "⚡", "🗡️", "☣️"]
}
]
},
{
"duration": 26,
"penaltySec": 2,
"minCorrect": 6,
"categories": [
{
"id": "before",
"label": "⏪",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["🥚", "🌱", "🧊", "🌙"]
},
{
"id": "after",
"label": "⏩",
"color": "rgba(234, 179, 8, 0.2)",
"items": ["🐣", "🌳", "💧", "🌞"]
}
]
},
{
"duration": 24,
"penaltySec": 3,
"minCorrect": 6,
"categories": [
{
"id": "cause",
"label": "💥",
"color": "rgba(248, 113, 113, 0.2)",
"items": ["⚡", "🌧️", "🔥", "🥶"]
},
{
"id": "effect",
"label": "✨",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["💡", "🌈", "💧", "🧊"]
}
]
},
{
"duration": 24,
"penaltySec": 3,
"minCorrect": 12,
"switchAt": 0.5,
"phases": [
{
"categories": [
{
"id": "true",
"label": "✅",
"color": "rgba(34, 197, 94, 0.2)",
"items": ["🐟💧", "🕊️🌤️", "🌞☀️", "🌳🌿"]
},
{
"id": "false",
"label": "❌",
"color": "rgba(239, 68, 68, 0.2)",
"items": ["🐟🔥", "☂️🔥", "🌙☀️", "🌵❄️"]
}
]
},
{
"categories": [
{
"id": "problem",
"label": "❓",
"color": "rgba(251, 191, 36, 0.2)",
"items": ["🔌❌", "💡❌", "🚪🔒", "🌧️"]
},
{
"id": "solution",
"label": "🧠",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["🔌✅", "💡", "🔑", "☂️"]
}
]
}
]
},
{
"duration": 22,
"penaltySec": 3,
"minCorrect": 12,
"switchAt": 0.5,
"phases": [
{
"categories": [
{
"id": "cause",
"label": "💥",
"color": "rgba(248, 113, 113, 0.2)",
"items": ["🌧️", "🏃", "😴", "🔥"]
},
{
"id": "effect",
"label": "✨",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["💧", "💦", "😪", "💨"]
}
]
},
{
"categories": [
{
"id": "before",
"label": "⏪",
"color": "rgba(59, 130, 246, 0.2)",
"items": ["🥚", "🧊", "🌑", "🌱"]
},
{
"id": "after",
"label": "⏩",
"color": "rgba(234, 179, 8, 0.2)",
"items": ["🐣", "💧", "🌕", "🌳"]
}
]
}
]
},
{
"duration": 20,
"penaltySec": 4,
"minCorrect": 19,
"switchAt": 0.5,
"phases": [
{
"categories": [
{
"id": "fruits",
"label": "🍎",
"color": "rgba(234, 88, 12, 0.25)",
"items": ["🍎", "🍌", "🍇"]
},
{
"id": "animals",
"label": "🐶",
"color": "rgba(59, 130, 246, 0.25)",
"items": ["🐶", "🐱", "🐵"]
},
{
"id": "vehicles",
"label": "🚗",
"color": "rgba(14, 165, 233, 0.25)",
"items": ["🚗", "🚌", "🚲"]
},
{
"id": "tools",
"label": "🛠️",
"color": "rgba(100, 116, 139, 0.25)",
"items": ["🔧", "🔨", "🪛"]
}
]
},
{
"categories": [
{
"id": "red",
"label": "🔴",
"color": "rgba(239, 68, 68, 0.25)",
"items": ["🔴", "🟥", "❤️"]
},
{
"id": "blue",
"label": "🔵",
"color": "rgba(59, 130, 246, 0.25)",
"items": ["🔵", "🟦", "💙"]
},
{
"id": "circle",
"label": "⚪",
"color": "rgba(148, 163, 184, 0.25)",
"items": ["⚪", "⚫", "⭕"]
},
{
"id": "square",
"label": "⬜",
"color": "rgba(203, 213, 225, 0.25)",
"items": ["⬜", "⬛", "◻️"]
}
]
}
]
}
]
}
Description:
Sort emoji items into the matching categories. Levels progress from simple visuals to real-world groups and logic, with faster timers later. Each level has different categories and items. Some levels have multiple phases that switch mid-level.
Configuration:
gameType (required): Must be "drag-sort"levels (optional): Number of levels - Default: 15levelDefinitions (required): Array of level definitions
duration: Duration per level in secondspenaltySec: Time penalty in seconds for incorrect drops (0 = no penalty)minCorrect: Minimum number of correctly sorted items requiredcategories: Array of category objects
id: Unique category identifierlabel: Display label (emoji or text)color: Background color (RGBA)items: Array of emoji items that belong to this categoryswitchAt (optional): Fraction (0-1) indicating when to switch phases (e.g., 0.5 = switch at 50% items placed)phases (optional): Array of phase objects for multi-phase levels
categories arrayLevel Progression:
Scoring:
Math.round((completedLevels / maxLevels) * 100)Controls:
Goal:
Features:
How It Works:
Features:
Tips:
Recommended Settings:
Final games combine multiple game mechanics and require completing multiple mini-games in sequence. They support both object and array formats for challengeConfigs.
Array Format (Recommended - allows duplicate categories):
{
"gameType": "boss-puzzle",
"challengeConfigs": [
{
"gameType": "match-shapes",
"rounds": 20
},
{
"gameType": "color-grid-memory",
"rounds": 15
},
{
"gameType": "typing-sprint",
"targets": 15
},
{
"gameType": "stack-blocks",
"targets": 15
}
]
}
Object Format (Legacy - for backward compatibility):
{
"gameType": "boss-puzzle",
"challengeConfigs": {
"logic": {
"gameType": "tile-slider",
"gridSize": 3
},
"memory": {
"gameType": "card-flip",
"gridSize": 4,
"pairs": 8
},
"speed": {
"gameType": "reaction-test",
"rounds": 5
},
"skill": {
"gameType": "target-aim",
"targets": 10
}
}
}
Key Features:
Configuration Fields:
gameType (required): Must be "boss-puzzle" or "time-challenge"challengeConfigs (required): Object or array of challenge configurations
gameType and any game-specific parametersExample with Duplicate Categories (Array Format):
{
"gameType": "time-challenge",
"challengeConfigs": [
{
"gameType": "typing-sprint",
"targets": 15
},
{
"gameType": "cursor-maze",
"targets": 15
}
]
}
Mixed Quiz Configuration:
{
"gameType": "mixed-quiz",
"rounds": 5,
"miniGameConfigs": {
"logic": {"gameType": "number-order"},
"memory": {"gameType": "number-recall"},
"speed": {"gameType": "fast-math"},
"skill": {"gameType": "target-aim"}
}
}
Survival Mode Configuration:
{
"gameType": "survival-mode",
"games": 5,
"gameSequence": [
{"type": "logic", "config": {"gameType": "number-order", "numbers": 5}},
{"type": "memory", "config": {"gameType": "card-flip", "gridSize": 3, "pairs": 4}},
{"type": "speed", "config": {"gameType": "fast-math", "rounds": 5}},
{"type": "skill", "config": {"gameType": "target-aim", "targets": 5}},
{"type": "logic", "config": {"gameType": "balance-scale"}}
]
}
Recommended Settings:
Progress is stored in:
play50_all_progress)Progress structure:
{
"game_id": {
"score": 85,
"completed": true,
"completed_at": "2024-01-15T10:30:00Z"
}
}
Certificates are generated as HTML (can be extended with DomPDF for PDF generation).
POST /wp-json/play50/v1/certificate/generate
Body:
{
"player_name": "John Doe",
"guest_id": "optional-guest-id"
}
Response:
{
"certificate_id": 123,
"certificate_url": "https://cms.play50.games/wp-json/play50/v1/certificate/123"
}
composer require dompdf/dompdfCORS (Cross-Origin Resource Sharing) is configured in wp-config.php and includes/rest-api.php.
The backend automatically allows requests from:
http://localhost:3000http://localhost:3001http://127.0.0.1:3000http://127.0.0.1:3001Configure allowed origins in wp-config.php:
define('PLAY50_CORS_ORIGIN', 'https://your-frontend-domain.com');
Or allow multiple origins:
define('PLAY50_CORS_ORIGIN', 'https://frontend1.com,https://frontend2.com');
Test the API endpoint:
curl -H "Origin: http://localhost:3000" \
-H "Access-Control-Request-Method: GET" \
-H "Access-Control-Request-Headers: Content-Type" \
-X OPTIONS \
https://cms.play50.games/wp-json/play50/v1/games
Next.js frontend for the Play50Games platform - a browser-based game platform with 50 games, progress tracking, and certificate generation.
cd play50games-frontend
npm install
.env.local file:NEXT_PUBLIC_WORDPRESS_API_URL=https://cms.play50.games/wp-json/play50/v1
For local development:
NEXT_PUBLIC_WORDPRESS_API_URL=http://localhost/wp-json/play50/v1
npm run dev
src/
├── app/ # Next.js App Router pages
│ ├── page.tsx # Home page (games list)
│ ├── games/[id]/ # Individual game pages
│ ├── progress/ # Progress dashboard
│ ├── certificate/ # Certificate generation/view
│ └── diagnostics/ # API diagnostics page
├── components/
│ ├── GameEngine/ # Main game engine
│ │ ├── GameEngine.tsx # Core game orchestrator
│ │ ├── KeyboardControls.tsx # Keyboard controls display
│ │ ├── NumberKeypad.tsx # Numeric keypad component
│ │ └── game-types/ # Game type implementations
│ │ ├── LogicGames.tsx # Logic games container
│ │ ├── MemoryGames.tsx # Memory games container
│ │ ├── SpeedGames.tsx # Speed games container
│ │ ├── SkillGames.tsx # Skill games container
│ │ ├── FinalGames.tsx # Final games container
│ │ ├── logicgames-parts/ # Individual logic game components
│ │ │ ├── MatchShapes.tsx
│ │ │ ├── ColorSequence.tsx
│ │ │ ├── NumberOrder.tsx
│ │ │ ├── FindOddOne.tsx
│ │ │ ├── BalanceScale.tsx
│ │ │ ├── Sudoku4x4.tsx
│ │ │ ├── TileSlider.tsx
│ │ │ ├── CircuitPath.tsx
│ │ │ ├── MazeEscape.tsx
│ │ │ ├── PatternCompletion.tsx
│ │ │ ├── RotateToFit.tsx
│ │ │ ├── MirrorMatch.tsx
│ │ │ ├── LogicGates.tsx
│ │ │ ├── SequenceArrows.tsx
│ │ │ └── BlockFill.tsx
│ │ ├── memorygames-parts/ # Individual memory game components
│ │ │ ├── CardFlipMemory.tsx
│ │ │ ├── SoundMemory.tsx
│ │ │ ├── EmojiMemory.tsx
│ │ │ ├── NumberRecall.tsx
│ │ │ ├── ImageRecall.tsx
│ │ │ ├── PathMemory.tsx
│ │ │ ├── WordMemory.tsx
│ │ │ ├── FaceMemory.tsx
│ │ │ ├── ColorGridMemory.tsx
│ │ │ └── SymbolStack.tsx
│ │ └── speedgames-parts/ # Individual speed game components
│ │ ├── ClickGreen.tsx
│ │ ├── AvoidRed.tsx
│ │ ├── ReactionTest.tsx
│ │ ├── FastMath.tsx
│ │ ├── WhackShape.tsx
│ │ ├── TypingSprint.tsx
│ │ ├── QuickCompare.tsx
│ │ ├── FallingObjects.tsx
│ │ ├── ReflexArrow.tsx
│ │ └── TapCounter.tsx
│ │ ├── skillgames-parts/ # Individual skill game components
│ │ │ ├── BallBalance.tsx
│ │ │ ├── TargetAim.tsx
│ │ │ ├── SpeedDrawing.tsx
│ │ │ ├── OneHandMode.tsx
│ │ │ ├── CursorMaze.tsx
│ │ │ ├── LineTracer.tsx
│ │ │ ├── TimingBar.tsx
│ │ │ ├── StackBlocks.tsx
│ │ │ ├── PrecisionDrop.tsx
│ │ │ └── DragAndDropSort.tsx
│ └── UnlockSystem/ # Game unlock logic
├── lib/
│ ├── api/ # WordPress REST API clients
│ │ ├── games.ts # Games API
│ │ ├── progress.ts # Progress API
│ │ └── certificate.ts # Certificate API
│ ├── storage/ # Progress storage (localStorage + API)
│ │ └── progressStorage.ts
│ └── utils/ # Utility functions
│ ├── gameInstructions.ts # Game instructions and tips
│ └── gameTypes.ts # Game type utilities
├── hooks/
│ └── useKeyboardControls.ts # Keyboard controls hook
└── types/ # TypeScript type definitions
└── game.ts
logicgames-parts/, memorygames-parts/, speedgames-parts/, skillgames-parts/) for better maintainabilityFinal games are the ultimate challenges that combine multiple game mechanics and require completing multiple mini-games in sequence.
A challenging mix of logic, memory, speed, and skill games. Complete multiple rounds of randomly selected mini-games to test your overall cognitive abilities.
How It Works:
Configuration:
{
"gameType": "mixed-quiz",
"rounds": 5,
"miniGameConfigs": {
"logic": {"gameType": "number-order"},
"memory": {"gameType": "number-recall"},
"speed": {"gameType": "fast-math"},
"skill": {"gameType": "target-aim"}
}
}
Tips:
Complete several mini-games in sequence without failing. If you fail one, you have to start over. Survive as long as you can!
How It Works:
Configuration:
{
"gameType": "survival-mode",
"games": 5,
"gameSequence": [
{"type": "logic", "config": {"gameType": "number-order", "numbers": 5}},
{"type": "memory", "config": {"gameType": "card-flip", "gridSize": 3, "pairs": 4}},
{"type": "speed", "config": {"gameType": "fast-math", "rounds": 5}},
{"type": "skill", "config": {"gameType": "target-aim", "targets": 5}},
{"type": "logic", "config": {"gameType": "balance-scale"}}
]
}
Tips:
Combine multiple mechanics into one difficult puzzle. Complete multiple mini-games in sequence without failing.
How It Works:
Configuration:
Object Format (Legacy):
{
"gameType": "boss-puzzle",
"challengeConfigs": {
"logic": {
"gameType": "tile-slider",
"gridSize": 3
},
"memory": {
"gameType": "card-flip",
"gridSize": 4,
"pairs": 8
},
"speed": {
"gameType": "reaction-test",
"rounds": 5
},
"skill": {
"gameType": "target-aim",
"targets": 10
}
}
}
Array Format (Recommended - allows duplicate categories):
{
"gameType": "boss-puzzle",
"challengeConfigs": [
{
"gameType": "match-shapes",
"rounds": 20
},
{
"gameType": "color-grid-memory",
"rounds": 15
},
{
"gameType": "typing-sprint",
"targets": 15
},
{
"gameType": "stack-blocks",
"targets": 15
}
]
}
Features:
challengeConfigsTips:
Complete multiple mini-games in sequence without failing. Same mechanics as Boss Puzzle but with time pressure.
How It Works:
Configuration:
Array Format (Recommended):
{
"gameType": "time-challenge",
"challengeConfigs": [
{
"gameType": "match-shapes",
"rounds": 5
},
{
"gameType": "color-grid-memory",
"rounds": 5
},
{
"gameType": "typing-sprint",
"targets": 10
},
{
"gameType": "stack-blocks",
"targets": 10
}
]
}
Features:
challengeConfigs (allows duplicate categories)Tips:
Randomized final exam using previous game mechanics. Show what you've learned!
How It Works:
Tips:
NEXT_PUBLIC_WORDPRESS_API_URL - WordPress REST API base URL
https://cms.play50.games/wp-json/play50/v1http://localhost/wp-json/play50/v1npm run dev - Start development servernpm run build - Build for productionnpm run start - Start production servernpm run lint - Run ESLintTo add a new game:
*-parts/ folder (e.g., logicgames-parts/YourGame.tsx)LogicGames.tsx for logic gamesMemoryGames.tsx for memory gamesSpeedGames.tsx for speed gamesSkillGames.tsx for skill gamesFinalGames.tsx for final gamessrc/lib/utils/gameInstructions.tswt-cpt/games.php)src/app/globals.css if neededEach game component should:
config, onScoreUpdate, onComplete, and other relevant props// 1. Create logicgames-parts/YourGame.tsx
export default function YourGame({ config, onScoreUpdate, onComplete }) {
// Game implementation
}
// 2. Import in LogicGames.tsx
import YourGame from "./logicgames-parts/YourGame";
// 3. Add to gameComponents object
const gameComponents = {
"your-game": (
<YourGame
config={config}
onScoreUpdate={onScoreUpdate}
onComplete={onComplete}
/>
),
// ... other games
};
https://cms.play50.games/wp-json/play50/v1/gamesincludes/rest-api.php is loaded in functions.php/diagnostics page in frontend for detailed diagnosticsPLAY50_CORS_ORIGIN is set correctly in wp-config.phpincludes/rest-api.php is properly handling CORS headersgameType matches the expected valuenpm installnpm run lint.env.local.next folder and rebuild: rm -rf .next && npm run buildNEXT_PUBLIC_WORDPRESS_API_URL in .env.local/diagnostics page for detailed connection diagnosticsFor issues or questions:
/diagnostics) for API diagnosticsThis project is part of the Play50Games platform.