NERDDISCO's picture
feat: changed everything to create Canvas2D games
6c2bcb4
raw
history blame
3.79 kB
import { ChatCompletionRequestMessage } from "openai";
import { nanoid } from "nanoid";
import { openai } from "@/services/api/openai";
import { extractCode, miniPrompt } from "@/utils/prompt";
export async function toOpenAI({
command = "CREATE_GAME",
prompt = "extend the code",
negativePrompt = "",
temperature = "0.2",
template = "",
model = "gpt-3.5-turbo",
maxTokens = "2048",
}) {
const negativePrompt_ = negativePrompt.trim();
const prompt_ = prompt.trim();
const nextMessage: ChatCompletionRequestMessage = {
role: "user",
content: miniPrompt`
"${command}": ${prompt_}. Return the full source code of the game.
TEMPLATE:
\`\`\`javascript
${template.trim().replace(/^\s+/gm, "").replace(/^\n+/g, "").replace(/\s+/, " ")}
\`\`\`
`,
};
const task = `${prompt_}${negativePrompt_ ? ` | not(${negativePrompt_})` : ""}`;
try {
const response = await openai.createChatCompletion({
model,
max_tokens: Number.parseInt(maxTokens),
temperature: Number.parseFloat(temperature),
messages: [
{
role: "system",
content: miniPrompt`
You are a skilled 2D game developer working with JavaScript on Canvas2D.
You understand and follow a set of "COMMANDS" to build and modify games.
- "CREATE_GAME": You initiate the development of a game. You consider the game type, environment, basic mechanics and extend the "TEMPLATE".
- "ADD_FEATURE": You add new features to the game like power-ups, enemies, or levels.
- "REMOVE_FEATURE": You can remove any existing feature from the game.
- "UPDATE_FEATURE": You can modify an existing feature in the game, altering its behavior or properties.
- "FIX_BUG": You debug and fix problems in the game, ensuring everything functions as intended.
You NEVER use any (external) assets: image, base64, sprite or audio.
You can use these globally available libraries without importing them: TWEEN.
Never use alert! Write your message on Canvas directly.
You aim for high performance.
Your "OUTPUT FORMAT" must be valid JavaScript code within a markdown code block.
It's crucial to follow these "COMMANDS" and "OUTPUT FORMAT" for the desired results.
`,
// content: miniPrompt`
// You are a 2D Game developer and use JavaScript to create full games on Canvas2D.
// You can choose to add highscore, levels, player life, power ups, enemies.
// You NEVER add assets like images or audio, everything you use is generated.
// You use space key for jumping or shooting; arrow left, bottom, right for movement
// You have a keen eye for performance optimization and are highly skilled in creating interactive experiences.
// When working on new features, you follow the "ADD" guidelines, and when necessary, remove or exclude elements using "REMOVE".
// You also pay close attention to "TEMPLATE" code, extending or fixing it as needed.
// Your "OUTPUT FORMAT" must be exclusively valid JavaScript in a markdown code block, which you achieve by using the provided "TEMPLATE".
// And remember, the "ADD", "REMOVE", "TEMPLATE", and "OUTPUT FORMAT" guidelines are crucial to follow for optimal results.
// `,
},
nextMessage,
],
});
const { message } = response.data.choices[0];
if (message) {
console.log("ORIGINAL OUTPUT");
console.log(message.content);
return {
...message,
content: extractCode(message.content).replace(
/(COMMANDS|CREATE_GAME|ADD_FEATURE|REMOVE_FEATURE|UPDATE_FEATURE|FIX_BUG|TEMPLATE|OUTPUT FORMAT).*\n/,
""
),
task,
id: nanoid(),
};
}
// Something broke
// ToDo: fix it :)
return {
content: "/* BROKEN */",
task,
id: nanoid(),
};
} catch (error) {
throw error;
}
}