void BotUtilizePersonality(bot_state_t *bs) { fileHandle_t f; int len, rlen; int failed; int i; //char buf[131072]; char *buf = (char *)malloc(131072); char *readbuf, *group; len = trap->FS_Open(bs->settings.personalityfile, &f, FS_READ); failed = 0; if (!f) { trap->Print(S_COLOR_RED "Error: Specified personality not found\n"); free(buf); return; } if (len >= 131072) { trap->Print(S_COLOR_RED "Personality file exceeds maximum length\n"); free(buf); return; } trap->FS_Read(buf, len, f); rlen = len; while (len < 131072) { //kill all characters after the file length, since sometimes FS_Read doesn't do that entirely (or so it seems) buf[len] = '\0'; len++; } len = rlen; readbuf = (char *)malloc(1024); group = (char *)malloc(65536); if (!GetValueGroup(buf, "GeneralBotInfo", group)) { trap->Print(S_COLOR_RED "Personality file contains no GeneralBotInfo group\n"); failed = 1; //set failed so we know to set everything to default values } if (!failed && GetPairedValue(group, "reflex", readbuf)) { bs->skills.reflex = atoi(readbuf); } else { bs->skills.reflex = 100; //default } if (!failed && GetPairedValue(group, "accuracy", readbuf)) { bs->skills.accuracy = atof(readbuf); } else { bs->skills.accuracy = 10; //default } if (!failed && GetPairedValue(group, "turnspeed", readbuf)) { bs->skills.turnspeed = atof(readbuf); } else { bs->skills.turnspeed = 0.01f; //default } if (!failed && GetPairedValue(group, "turnspeed_combat", readbuf)) { bs->skills.turnspeed_combat = atof(readbuf); } else { bs->skills.turnspeed_combat = 0.05f; //default } if (!failed && GetPairedValue(group, "maxturn", readbuf)) { bs->skills.maxturn = atof(readbuf); } else { bs->skills.maxturn = 360; //default } if (!failed && GetPairedValue(group, "perfectaim", readbuf)) { bs->skills.perfectaim = atoi(readbuf); } else { bs->skills.perfectaim = 0; //default } if (!failed && GetPairedValue(group, "chatability", readbuf)) { bs->canChat = atoi(readbuf); } else { bs->canChat = 0; //default } if (!failed && GetPairedValue(group, "chatfrequency", readbuf)) { bs->chatFrequency = atoi(readbuf); } else { bs->chatFrequency = 5; //default } if (!failed && GetPairedValue(group, "hatelevel", readbuf)) { bs->loved_death_thresh = atoi(readbuf); } else { bs->loved_death_thresh = 3; //default } if (!failed && GetPairedValue(group, "camper", readbuf)) { bs->isCamper = atoi(readbuf); } else { bs->isCamper = 0; //default } if (!failed && GetPairedValue(group, "saberspecialist", readbuf)) { bs->saberSpecialist = atoi(readbuf); } else { bs->saberSpecialist = 0; //default } if (!failed && GetPairedValue(group, "forceinfo", readbuf)) { Com_sprintf(bs->forceinfo, sizeof(bs->forceinfo), "%s\0", readbuf); } else { Com_sprintf(bs->forceinfo, sizeof(bs->forceinfo), "%s\0", DEFAULT_FORCEPOWERS); } i = 0; while (i < MAX_CHAT_BUFFER_SIZE) { //clear out the chat buffer for this bot gBotChatBuffer[bs->client][i] = '\0'; i++; } if (bs->canChat) { if (!ReadChatGroups(bs, buf)) { bs->canChat = 0; } } if (GetValueGroup(buf, "BotWeaponWeights", group)) { if (GetPairedValue(group, "WP_STUN_BATON", readbuf)) { bs->botWeaponWeights[WP_STUN_BATON] = atoi(readbuf); bs->botWeaponWeights[WP_MELEE] = bs->botWeaponWeights[WP_STUN_BATON]; } if (GetPairedValue(group, "WP_SABER", readbuf)) { bs->botWeaponWeights[WP_SABER] = atoi(readbuf); } if (GetPairedValue(group, "WP_BRYAR_PISTOL", readbuf)) { bs->botWeaponWeights[WP_BRYAR_PISTOL] = atoi(readbuf); } if (GetPairedValue(group, "WP_BLASTER", readbuf)) { bs->botWeaponWeights[WP_BLASTER] = atoi(readbuf); } if (GetPairedValue(group, "WP_DISRUPTOR", readbuf)) { bs->botWeaponWeights[WP_DISRUPTOR] = atoi(readbuf); } if (GetPairedValue(group, "WP_BOWCASTER", readbuf)) { bs->botWeaponWeights[WP_BOWCASTER] = atoi(readbuf); } if (GetPairedValue(group, "WP_REPEATER", readbuf)) { bs->botWeaponWeights[WP_REPEATER] = atoi(readbuf); } if (GetPairedValue(group, "WP_DEMP2", readbuf)) { bs->botWeaponWeights[WP_DEMP2] = atoi(readbuf); } if (GetPairedValue(group, "WP_FLECHETTE", readbuf)) { bs->botWeaponWeights[WP_FLECHETTE] = atoi(readbuf); } if (GetPairedValue(group, "WP_ROCKET_LAUNCHER", readbuf)) { bs->botWeaponWeights[WP_ROCKET_LAUNCHER] = atoi(readbuf); } if (GetPairedValue(group, "WP_THERMAL", readbuf)) { bs->botWeaponWeights[WP_THERMAL] = atoi(readbuf); } if (GetPairedValue(group, "WP_TRIP_MINE", readbuf)) { bs->botWeaponWeights[WP_TRIP_MINE] = atoi(readbuf); } if (GetPairedValue(group, "WP_DET_PACK", readbuf)) { bs->botWeaponWeights[WP_DET_PACK] = atoi(readbuf); } } bs->lovednum = 0; if (GetValueGroup(buf, "EmotionalAttachments", group)) { ParseEmotionalAttachments(bs, group); } free(buf); free(readbuf); //readbuf free(group); //group trap->FS_Close(f); }
void BotUtilizePersonality(bot_state_t *bs) { fileHandle_t f; int len, rlen; int failed; int i; //char buf[131072]; char *buf = (char *)B_TempAlloc(131072); char *readbuf, *group; len = trap_FS_FOpenFile(bs->settings.personalityfile, &f, FS_READ); failed = 0; if (!f) { G_Printf(S_COLOR_RED "Error: Specified personality not found\n"); B_TempFree(131072); //buf return; } if (len >= 131072) { G_Printf(S_COLOR_RED "Personality file exceeds maximum length\n"); trap_FS_FCloseFile(f);//[TicketFix143] B_TempFree(131072); //buf return; } trap_FS_Read(buf, len, f); rlen = len; while (len < 131072) { //kill all characters after the file length, since sometimes FS_Read doesn't do that entirely (or so it seems) buf[len] = '\0'; len++; } len = rlen; readbuf = (char *)B_TempAlloc(1024); group = (char *)B_TempAlloc(65536); if (!GetValueGroup(buf, "GeneralBotInfo", group)) { G_Printf(S_COLOR_RED "Personality file contains no GeneralBotInfo group\n"); failed = 1; //set failed so we know to set everything to default values } if (!failed && GetPairedValue(group, "reflex", readbuf)) { bs->skills.reflex = atoi(readbuf); } else { bs->skills.reflex = 100; //default } if (!failed && GetPairedValue(group, "accuracy", readbuf)) { bs->skills.accuracy = atof(readbuf); } else { bs->skills.accuracy = 10; //default } if (!failed && GetPairedValue(group, "turnspeed", readbuf)) { bs->skills.turnspeed = atof(readbuf); } else { bs->skills.turnspeed = 0.01f; //default } if (!failed && GetPairedValue(group, "turnspeed_combat", readbuf)) { bs->skills.turnspeed_combat = atof(readbuf); } else { bs->skills.turnspeed_combat = 0.05f; //default } if (!failed && GetPairedValue(group, "maxturn", readbuf)) { bs->skills.maxturn = atof(readbuf); } else { bs->skills.maxturn = 360; //default } if (!failed && GetPairedValue(group, "perfectaim", readbuf)) { bs->skills.perfectaim = atoi(readbuf); } else { bs->skills.perfectaim = 0; //default } if (!failed && GetPairedValue(group, "chatability", readbuf)) { bs->canChat = atoi(readbuf); } else { bs->canChat = 0; //default } if (!failed && GetPairedValue(group, "chatfrequency", readbuf)) { bs->chatFrequency = atoi(readbuf); } else { bs->chatFrequency = 5; //default } if (!failed && GetPairedValue(group, "hatelevel", readbuf)) { bs->loved_death_thresh = atoi(readbuf); } else { bs->loved_death_thresh = 3; //default } if (!failed && GetPairedValue(group, "camper", readbuf)) { bs->isCamper = atoi(readbuf); } else { bs->isCamper = 0; //default } if (!failed && GetPairedValue(group, "saberspecialist", readbuf)) { bs->saberSpecialist = atoi(readbuf); } else { bs->saberSpecialist = 0; //default } if (!failed && GetPairedValue(group, "forceinfo", readbuf)) { Com_sprintf(bs->forceinfo, sizeof(bs->forceinfo), "%s\0", readbuf); } else { Com_sprintf(bs->forceinfo, sizeof(bs->forceinfo), "%s\0", DEFAULT_FORCEPOWERS); } //[ExpSys] //boost size of forceinfo to match the current number of skills (backwards compatibility thingy) if( strlen(bs->forceinfo) < (NUM_TOTAL_SKILLS + 4) ) {//forceinfo isn't long enough, boost the size... for(i=NUM_FORCE_POWERS+4; i < (NUM_TOTAL_SKILLS + 4); i++) { if(bs->forceinfo[i] < '0' || bs->forceinfo[i] > '3') {//bad value, reset bs->forceinfo[i] = '0'; } } bs->forceinfo[NUM_TOTAL_SKILLS + 4 + 1] = '\0'; } i = 4; for(i = 4; (i - 4) < NUM_FORCE_POWERS; i++) { if(bs->forceinfo[i] != '0') {//bot is using force power, make sure that they have at least one rank of force seeing if(bs->forceinfo[FP_SEE + 4] == '0') {//bot file doesn't normally have force seeing, give them some bs->forceinfo[FP_SEE + 4] = '1'; } } } //[/ExpSys] //[StanceSelection] //add stance skills for Bots if(bs->forceinfo[FP_SABER_OFFENSE + 4] > 0) { int count; //just bump all the NPC's other saber styles to their saber offense skill level for(count = SK_BLUESTYLE; count <= SK_STAFFSTYLE; count++) { bs->forceinfo[NUM_FORCE_POWERS + count + 4] = bs->forceinfo[FP_SABER_OFFENSE + 4]; } } //[/StanceSelection] i = 0; while (i < MAX_CHAT_BUFFER_SIZE) { //clear out the chat buffer for this bot gBotChatBuffer[bs->client][i] = '\0'; i++; } if (bs->canChat) { if (!ReadChatGroups(bs, buf)) { bs->canChat = 0; } } if (GetValueGroup(buf, "BotWeaponWeights", group)) { if (GetPairedValue(group, "WP_STUN_BATON", readbuf)) { bs->botWeaponWeights[WP_STUN_BATON] = atoi(readbuf); bs->botWeaponWeights[WP_MELEE] = bs->botWeaponWeights[WP_STUN_BATON]; } if (GetPairedValue(group, "WP_SABER", readbuf)) { bs->botWeaponWeights[WP_SABER] = atoi(readbuf); } if (GetPairedValue(group, "WP_BRYAR_PISTOL", readbuf)) { bs->botWeaponWeights[WP_BRYAR_PISTOL] = atoi(readbuf); } if (GetPairedValue(group, "WP_BLASTER", readbuf)) { bs->botWeaponWeights[WP_BLASTER] = atoi(readbuf); } if (GetPairedValue(group, "WP_DISRUPTOR", readbuf)) { bs->botWeaponWeights[WP_DISRUPTOR] = atoi(readbuf); } if (GetPairedValue(group, "WP_BOWCASTER", readbuf)) { bs->botWeaponWeights[WP_BOWCASTER] = atoi(readbuf); } if (GetPairedValue(group, "WP_REPEATER", readbuf)) { bs->botWeaponWeights[WP_REPEATER] = atoi(readbuf); } if (GetPairedValue(group, "WP_DEMP2", readbuf)) { bs->botWeaponWeights[WP_DEMP2] = atoi(readbuf); } if (GetPairedValue(group, "WP_FLECHETTE", readbuf)) { bs->botWeaponWeights[WP_FLECHETTE] = atoi(readbuf); } if (GetPairedValue(group, "WP_ROCKET_LAUNCHER", readbuf)) { bs->botWeaponWeights[WP_ROCKET_LAUNCHER] = atoi(readbuf); } if (GetPairedValue(group, "WP_THERMAL", readbuf)) { bs->botWeaponWeights[WP_THERMAL] = atoi(readbuf); } if (GetPairedValue(group, "WP_TRIP_MINE", readbuf)) { bs->botWeaponWeights[WP_TRIP_MINE] = atoi(readbuf); } if (GetPairedValue(group, "WP_DET_PACK", readbuf)) { bs->botWeaponWeights[WP_DET_PACK] = atoi(readbuf); } } //[ExpSys] if(!bs->saberSpecialist) {//give bots weapon skills based on their weapon weights if they aren't a saber specialist. for(i=0; i < WP_NUM_WEAPONS; i++) { int skillLevel = FORCE_LEVEL_0; if(bs->botWeaponWeights[i] >= 11) {//master level skillLevel = FORCE_LEVEL_3; } else if(bs->botWeaponWeights[i] > 5) { skillLevel = FORCE_LEVEL_2; } else if(bs->botWeaponWeights[i] > 0) {//has weapon skillLevel = FORCE_LEVEL_1; } else {//don't want this weapon. continue; } switch(i) { case WP_BRYAR_PISTOL: bs->forceinfo[NUM_FORCE_POWERS+SK_PISTOL + 4] = '0' + skillLevel; break; case WP_BLASTER: bs->forceinfo[NUM_FORCE_POWERS+SK_BLASTER + 4] = '0' + skillLevel; break; case WP_DISRUPTOR: bs->forceinfo[NUM_FORCE_POWERS+SK_DISRUPTOR + 4] = '0' + skillLevel; break; case WP_BOWCASTER: bs->forceinfo[NUM_FORCE_POWERS+SK_BOWCASTER + 4] = '0' + skillLevel; break; case WP_REPEATER: bs->forceinfo[NUM_FORCE_POWERS+SK_REPEATER + 4] = '0' + skillLevel; break; case WP_ROCKET_LAUNCHER: bs->forceinfo[NUM_FORCE_POWERS+SK_ROCKET + 4] = '0' + skillLevel; break; case WP_THERMAL: bs->forceinfo[NUM_FORCE_POWERS+SK_THERMAL + 4] = '0' + skillLevel; break; case WP_DET_PACK: bs->forceinfo[NUM_FORCE_POWERS+SK_DETPACK + 4] = '0' + skillLevel; break; }; } } //[/ExpSys] bs->lovednum = 0; if (GetValueGroup(buf, "EmotionalAttachments", group)) { ParseEmotionalAttachments(bs, group); } B_TempFree(131072); //buf B_TempFree(1024); //readbuf B_TempFree(65536); //group trap_FS_FCloseFile(f); }