212 lines
6.1 KiB
C
212 lines
6.1 KiB
C
#include <lib.h>
|
|
#include <save.h>
|
|
#include <privs.h>
|
|
|
|
inherit LIB_NPC;
|
|
|
|
static string firstchoice, secondchoice,mm, vv, printvar;
|
|
static string response,s1,s2,s3;
|
|
static object ww;
|
|
static int playing, smart;
|
|
int runs,switches,stays,percent;
|
|
int fred,fgreen,fblue;
|
|
int wins,losses,red_wins,green_wins,blue_wins;
|
|
static string SaveFile = "";
|
|
|
|
string GetSaveFile(){
|
|
return SaveFile;
|
|
}
|
|
|
|
static string SetSaveFile(string str){
|
|
return (SaveFile = str);
|
|
}
|
|
|
|
mixed do_thing(string str){
|
|
mixed ret;
|
|
string msg = "%^B_BLACK%^%^YELLOW%^"+GetName()+" decides to "+response+".%^RESET%^";
|
|
tell_room(environment(this_object()),msg);
|
|
//ret = unguarded( (: command(response) :) );
|
|
command(response);
|
|
playing = 0;
|
|
return ret;
|
|
}
|
|
|
|
static void create() {
|
|
npc::create();
|
|
smart = 1;
|
|
SetKeyName("test subject");
|
|
SetId(({"subject"}));
|
|
SetShort("Test Subject");
|
|
SetLong("This is a file meant to be inherited by Charles "
|
|
"and Charly, to ensure their AI code remains in sync. If "
|
|
"you've examined an NPC and got this description, someone "
|
|
"has cloned the wrong file.");
|
|
SetLevel(5);
|
|
SetRace("human");
|
|
SetGender("male");
|
|
SetNoClean(1);
|
|
if(sizeof(SaveFile)) RestoreObject(SaveFile);
|
|
playing = 0;
|
|
response = "";
|
|
SetAutoStand(1);
|
|
SetPacifist(1);
|
|
}
|
|
|
|
int eventBeginPlay(){
|
|
int run;
|
|
if(!clonep()) return 0;
|
|
run = runs+1;
|
|
firstchoice = "";
|
|
response = "";
|
|
playing = 1;
|
|
eventForce("say If successful, this will be run "+run+".");
|
|
eventForce("say the winners have been: "
|
|
"red: "+red_wins+" green: "+green_wins+" blue: "+blue_wins);
|
|
eventForce("say I've switched "+percent(switches,runs)+"% "
|
|
"of the time. My win rate is "+
|
|
percent(wins,run)+"%.");
|
|
SaveObject(SaveFile,1);
|
|
eventForce("push a button on a pedestal");
|
|
eventForce("push button on pedestal");
|
|
return 1;
|
|
}
|
|
|
|
int choice1(){
|
|
int genrand;
|
|
eventForce("say I am faced with choice 1.");
|
|
genrand = random(3);
|
|
if( runs > 10 ){
|
|
if( red_wins > blue_wins ) firstchoice = "red";
|
|
if( red_wins < blue_wins ) firstchoice = "blue";
|
|
if( green_wins > blue_wins && green_wins > red_wins) firstchoice = "green";
|
|
}
|
|
if( !firstchoice || firstchoice == ""){
|
|
if(genrand == 0) { firstchoice = "red"; fred++; }
|
|
if(genrand == 1) { firstchoice = "green"; fgreen++; }
|
|
if(genrand == 2) { firstchoice = "blue"; fblue++; }
|
|
eventForce("say I randomly choose the "+firstchoice+" door");
|
|
}
|
|
else eventForce("say I select the "+firstchoice+" door");
|
|
eventForce("choose "+firstchoice+" door");
|
|
return 1;
|
|
}
|
|
|
|
int choice2(string str){
|
|
int genrand,which;
|
|
float percent_wins,percent_switch;
|
|
eventForce("say I am faced with choice 2.");
|
|
which = random(2);
|
|
eventForce("say stats:\nswitches: "+switches+"\n"+
|
|
"stays: "+stays+"\n"+
|
|
"wins: "+wins+"\n"+
|
|
"losses: "+losses+"\n"+
|
|
"runs: "+runs);
|
|
percent_switch = percent(to_float(switches),to_float(runs));
|
|
percent_wins = percent(to_float(wins),to_float(runs));
|
|
eventForce("say \nMy win rate is "+percent_wins+"%.\n"+
|
|
"My switch rate is "+percent_switch+"%.");
|
|
runs++;
|
|
if(smart && runs > 20){
|
|
if( percent_wins < 50 && percent_switch > 50 ) response = "stay";
|
|
else if( percent_wins < 50 && percent_switch < 50 ) response = "switch";
|
|
else if( percent_wins > 50 && percent_switch < 50 ) response = "stay";
|
|
else if( percent_wins > 50 && percent_switch > 50 ) response = "switch";
|
|
else if(which == 1) response = "switch";
|
|
else response = "stay";
|
|
}
|
|
else {
|
|
if(which) {
|
|
response = "switch";
|
|
}
|
|
else {
|
|
response = "stay";
|
|
}
|
|
}
|
|
if(sscanf(str,"%sswitch to the %s %s",s1,s2,s3) > 0) {
|
|
secondchoice = s2;
|
|
}
|
|
eventForce("say I decide to "+response+".");
|
|
if(response == "switch") switches++;
|
|
if(response == "stay") stays++;
|
|
call_out( "do_thing", 0, response );
|
|
return 1;
|
|
}
|
|
|
|
int WinFun(string str){
|
|
if(sscanf(str,"%smay enter the %s room and claim%s",s1,s2,s3) > 0){
|
|
if(s2 == "red") red_wins++;
|
|
if(s2 == "green") green_wins++;
|
|
if(s2 == "blue") blue_wins++;
|
|
wins++;
|
|
eventForce("say w00t! "+s2+" wins!");
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int LoseFun(string str){
|
|
string foo;
|
|
if(sscanf(str,"%smay enter the %s room to get%s",s1,s2,s3) > 0){
|
|
if(response == "stay") foo = secondchoice;
|
|
}
|
|
eventForce("say "+secondchoice+" wins, I guess.");
|
|
if(secondchoice == "red") red_wins++;
|
|
else if(secondchoice == "green") green_wins++;
|
|
else if(secondchoice == "blue") blue_wins++;
|
|
else eventForce("say WTF? foo is "+firstchoice);
|
|
losses++;
|
|
return 1;
|
|
}
|
|
|
|
int eventPedestalParse(string str){
|
|
if(sscanf(str,"%schoose one door from%s",s1,s2) > 0) choice1();
|
|
if(sscanf(str,"%sI have opened%s",s1,s2) > 0) choice2(str);
|
|
if(sscanf(str,"%sminor glitch%s",s1,s2) > 0) playing = 0;
|
|
if(sscanf(str,"%sclaim your prize%s",s1,s2) > 0) WinFun(str);
|
|
if(sscanf(str,"%syour big load%s",s1,s2) > 0) LoseFun(str);
|
|
return 1;
|
|
}
|
|
|
|
int eventFirstPass(string str){
|
|
if(!str || str == "") return 0;
|
|
if(sscanf(str,"A voice from the pedestal%s",s1) > 0){
|
|
eventPedestalParse(str);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private void eventPrint(string str1, string str2);
|
|
void init(){
|
|
::init();
|
|
set_heart_beat(5);
|
|
SetNoClean(1);
|
|
}
|
|
|
|
void receive_message(string string1, string string2){
|
|
eventFirstPass(string2);
|
|
}
|
|
|
|
varargs mixed eventHearTalk(object who, object target, int cls, string verb,
|
|
string msg, string lang) {
|
|
ww=who;
|
|
vv=verb;
|
|
mm=msg;
|
|
unguarded((: this_object()->receive_message("me",ww->GetName()+" "+vv+"s: "+mm) :));
|
|
return;
|
|
}
|
|
int eventPrint(string msg, string msg_class){
|
|
printvar=msg;
|
|
unguarded((: this_object()->receive_message("me again",printvar) :));
|
|
}
|
|
|
|
void heart_beat(){
|
|
if(!environment() || !clonep()){
|
|
set_heart_beat(0);
|
|
return;
|
|
}
|
|
if(!playing){
|
|
eventBeginPlay();
|
|
}
|
|
}
|