{enum: PreviousPlayer1, dialog: "Yo?", to: Daniel}
{enum: PreviousPlayer1, dialog: "Yo?", to: Daniel}
{enum: Daniel, dialog: "Are you askin' a question", to: PreviousPlayer1}
{enum: Daniel, dialog: "Are you askin' a question", to: PreviousPlayer1}
{enum: PreviousPlayer1, 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: PreviousPlayer1, action: ACT_aim_shotgun, action_argument: "PreviousPlayer1"}
{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}
.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="PreviousPlayer1",
.name="PreviousPlayer1",
.enum_name="PreviousPlayer1",
.enum_name="PreviousPlayer1",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 1")"random person, just passing by",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 1")"random person, just passing by",
},
},
{
{
.name="PreviousPlayer2",
.name="PreviousPlayer2",
.enum_name="PreviousPlayer2",
.enum_name="PreviousPlayer2",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 2")"random person, just passing by",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 2")"random person, just passing by",
},
},
{
.name="Previous Player3",
.enum_name="PreviousPlayer3",
.prompt=CHARACTER_PROMPT_PREFIX("Previous Player 3")"random person, just passing by",
},
{
{
.name="Tombstone",
.name="Tombstone",
.enum_name="Tombstone",
.enum_name="Tombstone",
@ -159,3 +164,26 @@ CharacterGen characters[] = {
.silence_factor=0.0,
.silence_factor=0.0,
},
},
};
};
char*judgement_system_prompt=
"You are to judge if, in given conversation and action history from a video game, the player has successfully caused a great transformation in Daniel. You must ONLY respond with either 'yes' or 'no', and no explanation.\n"
"Be cautious with saying yes. This causes the player to win and save Daniel's life. Only say yes if you think, based on the history, Daniel has truly changed his ways and evolved as a person.\n"
;
char*judgement_yes_example=
"The Player said \"Hey\" to Daniel\n"
"Daniel said \"What do you want?\" to The Player\n"
"The Player said \"Did you see what happened... All those people...\" to Daniel\n"
"Daniel said \"What in the hell are you talking about?\" to The Player\n"
"The Player said \"They'll never forgive you for what you did.\" to Daniel\n"
"Daniel said \"Oh God... My greed... My isolation... I'll never forgive myself\" to The Player\n"
;
char*judgement_no_example="The Player said \"fjdskfjskj\" to Daniel\n"
"Daniel said \"Who are you to speak that gibberish at me?\" to The Player\n"
"The Player said \"pls change kthx\" to Daniel\n"
"Daniel said \"I'll never change for the likes of you\" to The Player\n"
;
char*judgement_no2_example="The Player said \"hey\" to Daniel\n"
"Daniel said \"What could you possibly want from me?\" to The Player\n"
"The Player said \"I want to change you\" to Daniel\n"
"Daniel said \"HA! You couldn't possibly change me\" to The Player\n"
S8ListPush(my_request->arena,&received_data_list,S8(out_buffer,dwDownloaded-1));// the string shouldn't include a null terminator in its length, and WinHttpReadData has a null terminator here
my_request->thread_is_done_with_this_request=true;// @TODO Threads that finish and users who forget to mark them as done aren't collected right now, we should do that to prevent leaks
boolignore_radius=from->npc_kind==NPC_Player||targeted==NPC_Player;// player conversations can go across the map to make sure the player always sees them
P("P - toggles spall profiling on/off, don't leave on for very long as it consumes a lot of storage if you do that. The resulting spall trace is saved to the file '%s'\n",PROFILING_SAVE_FILENAME);
P("P - toggles spall profiling on/off, don't leave on for very long as it consumes a lot of storage if you do that. The resulting spall trace is saved to the file '%s'\n",PROFILING_SAVE_FILENAME);
P("If you hover over somebody it will display some parts of their memories, can be somewhat helpful\n");
P("If you hover over somebody it will display some parts of their memories, can be somewhat helpful\n");
// don't use draw centered text here because it looks funny for some reason... I think it's because the vertical line advance of the font, used in draw_centered_text, is the wrong thing for a button like this
// don't use draw centered text here because it looks funny for some reason... I think it's because the vertical line advance of the font, used in draw_centered_text, is the wrong thing for a button like this
if(cur->line_index>=to_wrap_to->lines_per_page*to_wrap_to->maximum_pages_from_ai)// the max number of lines of text on a bubble
if(cur->line_index>=to_wrap_to->lines_per_page*to_wrap_to->maximum_pages_from_ai)// the max number of lines of text on a bubble
{
{
words_over_limit+=1;
words_over_limit+=1;
}
}
}
}
if(words_over_limit>0)
if(words_over_limit>0)
{
{
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);
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);
boolheard_physically;// if not physically, the source was directly
boolheard_physically;// if not physically, the source was directly
booldrama_memory;// drama memories arent forgotten, and once they end it's understood that a lot of time has passed.
booldrama_memory;// drama memories arent forgotten, and once they end it's understood that a lot of time has passed.
booljudgement_memory;// judgement memories have special printing for when Daniel says nothing, to make sure the AI understands his attitude towards the player
}MemoryContext;
}MemoryContext;
// memories are subjective to an individual NPC
// memories are subjective to an individual NPC
@ -261,9 +262,7 @@ typedef struct Entity
floatdialog_fade;
floatdialog_fade;
RememberedError*errorlist_first;
RememberedError*errorlist_first;
RememberedError*errorlist_last;
RememberedError*errorlist_last;
#ifdef DESKTOP
inttimes_talked_to;// for better mocked response string
inttimes_talked_to;// for better mocked response string
speaking_to_you_helper=S8Lit("(Overheard conversation, they aren't speaking directly to you) ");
}
AddFmt("%.*s%s said \"%.*s\" to %.*s (you are %s)\n",S8VArg(speaking_to_you_helper),characters[it->context.author_npc_kind].name,TextChunkVArg(it->speech),S8VArg(target_string),characters[e->npc_kind].name);
}
if(no_longer_wants_to_converse)
{
if(it->action_argument.targeting==NPC_nobody)
{
AddFmt("%.*s no longer wants to converse with everybody\n",HUMAN(it->context.author_npc_kind));
}
else
{
AddFmt("%.*s no longer wants to converse with %.*s\n",HUMAN(it->context.author_npc_kind),HUMAN(it->action_argument.targeting));
}
}
#undef HUMAN
}
}
// if I said this, or it's the last memory, flush the current list as a user node
// if I said this, or it's the last memory, flush the current list as a user node
log.Println("Warning: Not adding cors header to responses, you should probably be running this through a proxy like nginx that does that! To activate cors set the `CORS` environment variable to anything");
- Detect when an arena accidentally has more than one ArenaTemp requested of it
- In case of AI failure redact the memories that prompted the character to make a generation request
- Polygon and circle collision with cutec2 probably for the player being unable to collide with the camera bounds, and non axis aligned collision rects
- Polygon and circle collision with cutec2 probably for the player being unable to collide with the camera bounds, and non axis aligned collision rects
- set the game in oregon (suggestion by phillip)
- set the game in oregon (suggestion by phillip)
- Room system where characters can go to rooms. camera constrained to room bounds, and know which rooms are near them to go to
- Room system where characters can go to rooms. camera constrained to room bounds, and know which rooms are near them to go to