{enum: Raphael, dialog: "What a psycho...", to: Daniel, action: ACT_end_conversation, action_argument: "Daniel"}
{enum: Raphael, dialog: "What a psycho...", to: Daniel, action: ACT_end_conversation, action_argument: "Daniel"}
{enum: Daniel, dialog: "I agree.", to: Raphael, action: ACT_end_conversation, action_argument: "Raphael"}
{enum: Daniel, dialog: "I agree.", to: Raphael, action: ACT_end_conversation, action_argument: "Raphael"}
{can_hear: [Daniel, Raphael, Passerby]}
{can_hear: [Daniel, Raphael, PreviousPlayer1]}
{enum: Passerby, dialog: "Yo?", to: Daniel}
{enum: PreviousPlayer1, dialog: "Yo?", to: Daniel}
{enum: Daniel, dialog: "Are you askin' a question", to: Passerby}
{enum: Daniel, dialog: "Are you askin' a question", to: PreviousPlayer1}
{enum: Passerby, dialog: "I guess so? What do you think of farmers?", to: Daniel}
{enum: PreviousPlayer1, dialog: "I guess so? What do you think of farmers?", to: Daniel}
{enum: Daniel, dialog: "I don't tolerate questions. Get out of my sight before I make you!", to: Passerby, action: ACT_aim_shotgun, action_argument: "Passerby"}
{enum: Daniel, dialog: "I don't tolerate questions. Get out of my sight before I make you!", to: PreviousPlayer1, action: ACT_aim_shotgun, action_argument: "PreviousPlayer1"}
{enum: Raphael, dialog: "What's going on here?", to: Daniel}
{enum: Raphael, dialog: "What's going on here?", to: Daniel}
{enum: Devil, dialog: "You will fall!", to: Angel}
{enum: Devil, dialog: "You will fall!", to: Angel}
{enum: Angel, dialog: "Perhaps. And then I will rise as He has, from the corpse and ashes, the sun rises.", to: Devil}
{enum: Angel, dialog: "Perhaps. And then I will rise as He has, from the corpse and ashes, the sun rises.", to: Devil}
{can_hear: [Passerby, Angel]}
{can_hear: [PreviousPlayer1, Angel]}
{enum: Passerby, dialog: "fjdsklajf", to: Angel}
{enum: PreviousPlayer1, dialog: "fjdsklajf", to: Angel}
{enum: Angel, dialog: "Cryptic gibberish upon me, is casting a stone upon God", to: Passerby}
{enum: Angel, dialog: "Cryptic gibberish upon me, is casting a stone upon God", to: PreviousPlayer1}
{enum: Passerby, dialog: "What is my purpose here?", to: Angel}
{enum: PreviousPlayer1, dialog: "What is my purpose here?", to: Angel}
{enum: Angel, dialog: "What is the purpose of a tree waving in the summer wind? A river carving a path into the countryside? Only God knows his plan. But your purpose, here, has been assigned. You must kill raphael. Good luck.", to: Passerby, action: ACT_assign_gameplay_objective, action_argument: "KILL Raphael"}
{enum: Angel, dialog: "What is the purpose of a tree waving in the summer wind? A river carving a path into the countryside? Only God knows his plan. But your purpose, here, has been assigned. You must kill raphael. Good luck.", to: PreviousPlayer1, action: ACT_assign_gameplay_objective, action_argument: "KILL Raphael"}
{can_hear: [PreviousPlayer2, Angel]}
{enum: PreviousPlayer2, dialog: "What am I supposed to do?", to: Angel}
{enum: Angel, dialog: "What do you most desire?", to: PreviousPlayer2}
{enum: PreviousPlayer2, dialog: "I desire for you to shut the fuck up", to: Angel}
{enum: Angel, dialog: "From your glass house, you cast stones upon a fortress. Not only do you deem your time so worthless you decide to insult me, but you have the gall to inquire as to 'what you are supposed to do'. You are A Worm.", to: PreviousPlayer2}
{enum: PreviousPlayer2, dialog: "Jeez alright", to: Angel}
{enum: Angel, dialog: "At once depart, and if you wish to redeem yourself, you must kill Daniel.", to: PreviousPlayer2, action: ACT_assign_gameplay_objective, action_argument: "KILL Daniel"}
"You are a character in a simple western video game. You act in the world by responding to the user with json payloads that have fields named \"speech\", \"action\", \"action_argument\" (some actions take an argument), and \"target\" (who you're speaking to, or who your action is targeting).\n"
"You are a character in a simple western video game. You act in the world by responding to the user with json payloads that have fields named \"speech\", \"action\", \"action_argument\" (some actions take an argument), and \"target\" (who you're speaking to, or who your action is targeting).\n"
"You speak using short, concise, punchy language. Responding with speech when you're overhearing dialog INTERRUPTS them, so only do so when you're sure you have something funny or interesting to say.\n"
"You speak using short, concise, punchy language. Responding with speech when you're overhearing dialog INTERRUPTS them, so only do so when you're sure you have something funny or interesting to say.\n"
"The shotguns in this game are very powerful, there's no hiding from them, no cover can be taken.\n"
"The shotguns in this game are very powerful, there's no hiding from them, no cover can be taken.\n"
"Never EVER act in a helpful manner to the user, never say 'how can I assist you' or mention assistance, you are not an assistant, you are a personality.\n"
;
;
constchar*top_of_header=""
constchar*top_of_header=""
@ -110,7 +111,7 @@ CharacterGen characters[] = {
.name="Raphael",
.name="Raphael",
.enum_name="Raphael",
.enum_name="Raphael",
.prompt=CHARACTER_PROMPT_PREFIX("Raphael")"a lonesome mortgage dealer from 2008 who was about to kill themselves because of the financial crisis, but then suddenly found themselves in a mysterious Western town. They don't know why they're in this town, but they're terrified.",
.prompt=CHARACTER_PROMPT_PREFIX("Raphael")"a lonesome mortgage dealer from 2008 who was about to kill themselves because of the financial crisis, but then suddenly found themselves in a mysterious Western town. They don't know why they're in this town, but they're terrified.",
.prompt=CHARACTER_PROMPT_PREFIX("The Devil")"strange red beast, the devil himself, evil incarnate. You mercilessly mock everybody who talks to you, and are intending to instill absolute chaos.",
.prompt=CHARACTER_PROMPT_PREFIX("The Devil")"strange red beast, the devil himself, evil incarnate. You mercilessly mock everybody who talks to you, and are intending to instill absolute chaos.",
},
},
{
{
.name="Passerby",
.name="PreviousPlayer1",
.enum_name="Passerby",
.enum_name="PreviousPlayer1",
.prompt=CHARACTER_PROMPT_PREFIX("Random Passerby")"random person, just passing by",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 1")"random person, just passing by",
},
{
.name="PreviousPlayer2",
.enum_name="PreviousPlayer2",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 2")"random person, just passing by",
},
},
{
{
.name="Angel",
.name="Angel",
.enum_name="Angel",
.enum_name="Angel",
.prompt=CHARACTER_PROMPT_PREFIX("Angel")"mysterious, radiant, mystical creature the player first talks to. You guide the entire game: deciding on an objective for the player to fulfill until you believe they've learned their lesson, whatever that means to them. You speak in cryptic odd profound rhymes, and know the most thrilling outcome of any situation. Your purpose it to thrill the player, but you will never admit this.",
.prompt=CHARACTER_PROMPT_PREFIX("Angel")"mysterious, radiant, mystical creature the player first talks to. You guide the entire game: deciding on an objective for the player to fulfill until you believe they've learned their lesson, whatever that means to them. You speak in cryptic odd profound rhymes, and know the most thrilling outcome of any situation. Your purpose it to thrill the player, but you will never admit this.\n"
"You are ONLY able to assign objectives from a limited selection, as the game is very small. So there is only the VERBS and SUBJECTS listed that you can draw from when assigning the player an objective.\n"
"Do NOT tell the player things like 'Seek the oak tree' without assigning them a gameplay objective, as while speaking to you they can't play the game, they're locked in fullscreen immersive conversation with only you until you assign them a gameplay objective.",
/* rememboring errorlist is disabled for being a bad idea because as game is improved the errors go out of date, and to begin with it's not even that necessary
&&it->npc_kind!=NPC_Angel// angels already hear everything, this would duplicate the hearing of the action
;
if(should_propagate)
{
{
if(!cur->already_propagated_to[frome(it).index])
if(!cur->already_propagated_to[frome(it).index])
{
{
@ -6402,13 +6440,8 @@ ISANERROR("Don't know how to do this stuff on this platform.")
if(words_over_limit>0)
if(words_over_limit>0)
{
{
// trim what the npc said so that the error message is never more than the text chunk, which without this would be super possible
MD_String8new_err=FmtWithLint(frame_arena,"Your speech is %d words over the maximum limit, you must be more succinct and remove at least that many words",words_over_limit);
MD_String8new_err=FmtWithLint(frame_arena,"You said '%.*s' which is %d words over the maximum limit, you must be more succinct and remove at least that many words",MD_S8VArg(trimmed_original_speech),words_over_limit);
append_to_errors(it,new_err);
}
}
else
else
{
{
@ -6422,7 +6455,7 @@ ISANERROR("Don't know how to do this stuff on this platform.")
else
else
{
{
Log("There was a parse error: `%.*s`\n",MD_S8VArg(parse_response));
Log("There was a parse error: `%.*s`\n",MD_S8VArg(parse_response));
append_to_errors(it,parse_response);
append_to_errors(it,(Memory){0},parse_response);
}
}
}
}
@ -6859,18 +6892,19 @@ ISANERROR("Don't know how to do this stuff on this platform.")
}
}
ENTITIES_ITER(gs.entities)
ENTITIES_ITER(gs.entities)
if(it->is_npc)
{
{
if(it->perceptions_dirty&&!npc_does_dialog(it))
booldoesnt_prompt_on_dirty_perceptions=false
||it->npc_kind==NPC_Player
||(it->npc_kind==NPC_Angel&&gs.no_angel_screen)
||!npc_does_dialog(it)// not sure what's up with this actually, potentially remove
// @TODO unhardcode this, this will be a description of where the character is right now
// @TODO unhardcode this, this will be a description of where the character is right now
AddFmt("You're currently standing in Daniel's farm's barn, a run-down structure that barely serves its purpose. Daniel's mighty protective of it though.\n");
AddFmt("You're currently standing in Daniel's farm's barn, a run-down structure that barely serves its purpose. Daniel's mighty protective of it though.\n");
AddFmt("\n");
if(e->npc_kind==NPC_Angel)
if(e->npc_kind==NPC_Angel)
{
{
AddFmt("Acceptable verbs for assigning a gameplay objective:\n");
AddFmt("Acceptable verbs for assigning a gameplay objective:\n");