Mercurial > mm7
diff NPC.cpp @ 291:0ea5fbd16edb
NPC mostly done
author | Gloval |
---|---|
date | Tue, 19 Feb 2013 00:34:15 +0400 |
parents | 96f3a1177b37 |
children | 5586bb4e8395 |
line wrap: on
line diff
--- a/NPC.cpp Mon Feb 18 20:47:41 2013 +0600 +++ b/NPC.cpp Tue Feb 19 00:34:15 2013 +0400 @@ -18,10 +18,10 @@ void InitializeTransitions(); void InitializeAutonotes(); void InitializeQuests(); - +bool CheckPortretAgainsSex(int portret_num, int sex); //----- (00476977) -------------------------------------------------------- -void NPCStats::Initialize2() +void NPCStats::InitializeNPCText() { int i; char* test_string; @@ -136,11 +136,11 @@ { if ((decode_step>0)&&(decode_step<77)) { - array_16544[decode_step].field_4[i]=atoi(test_string); + pProfessionChance[decode_step].professionChancePerArea[i]=atoi(test_string); } else if (decode_step==0) { - array_16544[0].field_4[i]=10; + pProfessionChance[0].professionChancePerArea[i]=10; } } else @@ -154,10 +154,10 @@ for (i=0; i<78; ++i) { - array_16544[i].field_0=0; + pProfessionChance[i].uTotalprofChance=0; for (int ii=1; ii<59; ++ii) { - array_16544[i].field_0+=array_16544[i].field_4[ii]; + pProfessionChance[i].uTotalprofChance+=pProfessionChance[i].professionChancePerArea[ii]; } } @@ -172,7 +172,7 @@ void NPCStats::_476C60() { for (unsigned int i = 1; i < uNumNewNPCs; ++i) - pNewNPCData[i].pName = pNPCNames2[i - 1]; + pNewNPCData[i].pName = pNPCUnicNames[i - 1]; if (pParty->pHirelings[0].pName) pParty->pHirelings[0].pName = pParty->pHireling1Name; @@ -181,570 +181,457 @@ } //----- (00476CB5) -------------------------------------------------------- -void NPCStats::Initialize1() +void NPCStats::InitializeNPCData() { - NPCStats *pNPCStats; // esi@1 - char *pRaw; // eax@1 - char *pHouse; // edi@1 - char *v4; // eax@2 - char v5; // dl@3 - int v6; // ecx@3 - char *v7; // eax@11 - char *v8; // eax@26 - char *v9; // ecx@27 - char v10; // dl@28 - int v11; // eax@28 - int v12; // edi@32 - char *v13; // eax@42 - char *v14; // eax@43 - char v15; // dl@44 - int v16; // ecx@44 - int v17; // edi@48 - char *v18; // eax@56 - char *v19; // eax@57 - char v20; // cl@58 - int v21; // edi@58 - int v22; // esi@62 - int v23; // [sp+Ch] [bp-14h]@7 - signed int v24; // [sp+10h] [bp-10h]@1 - signed int v25; // [sp+10h] [bp-10h]@26 - signed int v26; // [sp+10h] [bp-10h]@42 - signed int v27; // [sp+10h] [bp-10h]@56 - char *Str; // [sp+14h] [bp-Ch]@1 - NPCGreeting *pGreetings; // [sp+14h] [bp-Ch]@26 - unsigned __int16 *pGroups; // [sp+14h] [bp-Ch]@42 - char **pCatchPhrase; // [sp+14h] [bp-Ch]@56 - signed int v32; // [sp+18h] [bp-8h]@2 - signed int v33; // [sp+18h] [bp-8h]@27 - signed int v34; // [sp+18h] [bp-8h]@43 - signed int v35; // [sp+18h] [bp-8h]@57 - signed int v36; // [sp+1Ch] [bp-4h]@2 - signed int v37; // [sp+1Ch] [bp-4h]@27 - signed int v38; // [sp+1Ch] [bp-4h]@43 - signed int v39; // [sp+1Ch] [bp-4h]@57 + int i; + char* test_string; + unsigned char c; + bool break_loop; + unsigned int temp_str_len; + char* tmp_pos; + int decode_step; + + pNPCDataTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcdata.txt", 0); + strtok(pNPCDataTXT_Raw, "\r"); + strtok(NULL, "\r"); - pNPCStats = this; - pRaw = (char *)pEvents_LOD->LoadRaw("npcdata.txt", 0); - pNPCStats->pNPCDataTXT_Raw = pRaw; - strtok(pRaw, "\r"); - strtok(0, "\r"); - pHouse = (char *)&pNPCStats->pNPCData[1].house; - Str = (char *)pNPCStats->pNPCNames2; - v24 = 500; - do + for (i=0; i<500; ++i) { - v32 = 0; - v4 = strtok(0, "\r") + 1; - v36 = -1; - do + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do { - v5 = *v4; - v6 = 0; - while ( v5 != 9 && v5 ) + c = *(unsigned char*)test_string; + temp_str_len = 0; + while((c!='\t')&&(c>0)) { - ++v6; - v5 = v4[v6]; - } - v23 = (int)&v4[v6]; - if ( !v4[v6] ) - v32 = 1; - v4[v6] = 0; - if ( v6 ) - { - switch ( v36 ) + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + *tmp_pos = 0; + if (temp_str_len) + { //i+1 + switch (decode_step) { - case 0: - v7 = RemoveQuotes(v4); - *((int *)pHouse - 5) = (int)v7; - *(int *)Str = (int)v7; + case 1: + pNPCUnicNames[i] = RemoveQuotes(test_string); + pNPCData[i+1].pName=pNPCUnicNames[i]; break; - case 1: - *((int *)pHouse - 4) = atoi(v4); - break; - case 5: - *(int *)pHouse = atoi(v4); + case 2: + pNPCData[i+1].uPortraitID = atoi(test_string); break; case 6: - *((int *)pHouse + 1) = atoi(v4); + pNPCData[i+1].Location2D = atoi(test_string); break; case 7: - *((int *)pHouse + 2) = atoi(v4); + pNPCData[i+1].uProfession = atoi(test_string); break; case 8: - *((int *)pHouse + 3) = *v4 == 121; + pNPCData[i+1].greet = atoi(test_string); break; case 9: - *((int *)pHouse + 5) = atoi(v4); + pNPCData[i+1].joins = (*test_string == 'y')?1:0; break; case 10: - *((int *)pHouse + 6) = atoi(v4); + pNPCData[i+1].evt_A = atoi(test_string); break; case 11: - *((int *)pHouse + 7) = atoi(v4); + pNPCData[i+1].evt_B = atoi(test_string); break; case 12: - *((int *)pHouse + 8) = atoi(v4); + pNPCData[i+1].evt_C = atoi(test_string); break; case 13: - *((int *)pHouse + 9) = atoi(v4); + pNPCData[i+1].evt_D = atoi(test_string); break; case 14: - *((int *)pHouse + 10) = atoi(v4); + pNPCData[i+1].evt_E = atoi(test_string); break; - default: + case 15: + pNPCData[i+1].evt_F = atoi(test_string); break; } } - ++v36; - v4 = (char *)(v23 + 1); - } - while ( v36 + 1 <= 15 && !v32 ); - Str += 4; - pHouse += 76; - --v24; + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<16)&&!break_loop); } - while ( v24 ); - pNPCStats->uNumNewNPCs = 501; - v8 = (char *)pEvents_LOD->LoadRaw("npcgreet.txt", 0); - pNPCStats->pNPCGreetTXT_Raw = v8; - strtok(v8, "\r"); - pGreetings = pNPCStats->pNPCGreetings; - v25 = 205; - do + uNumNewNPCs = 501; + pNPCGreetTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcgreet.txt", 0); + strtok(pNPCGreetTXT_Raw, "\r"); + for (i=0; i<205; ++i) + { + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do { - v37 = 0; - v33 = 0; - v9 = strtok(0, "\r") + 1; - do - { - v10 = *v9; - v11 = 0; - while ( v10 != 9 && v10 ) - { - ++v11; - v10 = v9[v11]; - } - v12 = (int)&v9[v11]; - if ( !v9[v11] ) - v33 = 1; - *(char *)v12 = 0; - if ( v11 ) - { - if ( v37 == 1 ) - { - pGreetings->pGreeting1 = (char *)RemoveQuotes(v9); - } - else - { - if ( v37 == 2 ) - pGreetings->pGreeting2 = (char *)RemoveQuotes(v9); - } - } - ++v37; - v9 = (char *)(v12 + 1); - } - while ( v37 <= 2 && !v33 ); - ++pGreetings; - --v25; - } - while ( v25 ); - v13 = (char *)pEvents_LOD->LoadRaw("npcgroup.txt", 0); - pNPCStats->pNCPGroupTXT_Raw = v13; - strtok(v13, "\r"); - pGroups = pNPCStats->pGroups; - v26 = 51; - do + c = *(unsigned char*)test_string; + temp_str_len = 0; + while((c!='\t')&&(c>0)) { - v14 = strtok(0, "\r") + 1; - v38 = 0; - v34 = 0; - do + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + *tmp_pos = 0; + if (temp_str_len) + { //i+1 + switch (decode_step) { - v15 = *v14; - v16 = 0; - while ( v15 != 9 && v15 ) - { - ++v16; - v15 = v14[v16]; - } - v17 = (int)&v14[v16]; - if ( !v14[v16] ) - v34 = 1; - *(char *)v17 = 0; - if ( v16 && v38 == 1 ) - *pGroups = atoi(v14); - ++v38; - v14 = (char *)(v17 + 1); + case 1: + pNPCGreetings[i].pGreeting1 = RemoveQuotes(test_string); + break; + case 2: + pNPCGreetings[i].pGreeting2 = RemoveQuotes(test_string); + break; } - while ( v38 <= 1 && !v34 ); - ++pGroups; - --v26; } - while ( v26 ); - v18 = (char *)pEvents_LOD->LoadRaw("npcnews.txt", 0); - pNPCStats->pNPCNewsTXT_Raw = v18; - strtok(v18, "\r"); - pCatchPhrase = pNPCStats->pCatchPhrases; - v27 = 51; - do + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<3)&&!break_loop); + } + + pNCPGroupTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcgroup.txt", 0); + strtok(pNCPGroupTXT_Raw, "\r"); + + for (i=0; i<51; ++i) + { + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do + { + c = *(unsigned char*)test_string; + temp_str_len = 0; + while((c!='\t')&&(c>0)) + { + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + *tmp_pos = 0; + if (temp_str_len) + { //i+1 + if (decode_step==1) { - v19 = strtok(0, "\r") + 1; - v39 = 0; - v35 = 0; - do - { - v20 = *v19; - v21 = 0; - while ( v20 != 9 && v20 ) - { - ++v21; - v20 = v19[v21]; - } - v22 = (int)&v19[v21]; - if ( !v19[v21] ) - v35 = 1; - *(char *)v22 = 0; - if ( v21 && v39 == 1 ) - *pCatchPhrase = (char *)RemoveQuotes(v19); - ++v39; - v19 = (char *)(v22 + 1); - } - while ( v39 <= 1 && !v35 ); - ++pCatchPhrase; - --v27; + pGroups[i] = atoi(test_string); } - while ( v27 ); + } + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<2)&&!break_loop); + } + + pNPCNewsTXT_Raw = (char*)pEvents_LOD->LoadRaw("npcnews.txt", 0); + strtok(pNPCNewsTXT_Raw, "\r"); + + + for (i=0; i<51; ++i) + { + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do + { + c = *(unsigned char*)test_string; + temp_str_len = 0; + while((c!='\t')&&(c>0)) + { + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + *tmp_pos = 0; + if (temp_str_len) + { //i+1 + if (decode_step==1) + pCatchPhrases[i] = RemoveQuotes(test_string); + } + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<2)&&!break_loop); + } } //----- (0047702F) -------------------------------------------------------- void NPCStats::Initialize() - { - //NPCStats *v1; // edi@1 - char *v2; // ebx@1 - //char *v3; // eax@1 - char *v4; // ebx@3 - char v5; // al@4 - int v6; // ecx@4 - //char *v7; // eax@18 - char *v8; // ebx@18 - char *v9; // ecx@19 - char v10; // dl@20 - int v11; // eax@20 - char v12; // zf@41 - signed int v13; // [sp+Ch] [bp-14h]@18 - int v14; // [sp+10h] [bp-10h]@4 - int v15; // [sp+10h] [bp-10h]@24 - char *v16; // [sp+14h] [bp-Ch]@1 - signed int v17; // [sp+14h] [bp-Ch]@19 - unsigned int v18; // [sp+18h] [bp-8h]@1 - char *v19; // [sp+18h] [bp-8h]@18 - signed int v20; // [sp+1Ch] [bp-4h]@3 - signed int v21; // [sp+1Ch] [bp-4h]@19 - //v1 = this; + { + int i; + char* test_string; + unsigned char c; + bool break_loop; + unsigned int temp_str_len; + char* tmp_pos; + int decode_step; - Initialize1(); - Initialize2(); + InitializeNPCData(); + InitializeNPCText(); + InitializeQuests(); + InitializeAutonotes(); + InitializeAwards(); + InitializeTransitions(); + InitializeMerchants(); + InitializeScrolls(); - InitializeQuests(); - InitializeAutonotes(); - InitializeAwards(); - InitializeTransitions(); - InitializeMerchants(); - InitializeScrolls(); - v2 = 0; - field_17FC0 = 0; - pNPCNamesTXT_Raw = 0; - //v3 = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0); - pNPCNamesTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0); - strtok(pNPCNamesTXT_Raw, "\r"); - v18 = 0; - v16 = (char *)pNPCNames; - while ( 1 ) - { - v4 = strtok(v2, "\r") + 1; - v20 = 0; - do + pNPCNamesTXT_Raw = NULL; + pNPCNamesTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcnames.txt", 0); + strtok(pNPCNamesTXT_Raw, "\r"); + + uNewlNPCBufPos = 0; + + for (i=0; i<540; ++i) { - v5 = *v4; - v6 = 0; - v14 = 0; - if ( *v4 == 9 ) - goto LABEL_45; - do + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do { - if ( !v5 ) - break; - if ( v5 == 10 ) - break; - ++v6; - v14 = v6; - v5 = v4[v6]; - } - while ( v5 != 9 ); - if ( v6 ) + c = *(unsigned char*)test_string; + temp_str_len = 0; + if (c=='\t') { - v4[v6] = 0; - if ( v20 ) - { - if ( v20 == 1 ) - *((int *)v16 + 1) = (int)RemoveQuotes(v4); - } - else - { - *(int *)v16 = (int)RemoveQuotes(v4); - } + if ( (decode_step == 1)&&(!uNumNPCNames[1])) + uNumNPCNames[1]=i; } else { -LABEL_45: - if ( v20 == 1 && !uNumNPCNames[1] ) - uNumNPCNames[1] = v18; - } - ++v20; - v4 += v14 + 1; - } - while ( v20 <= 1 ); - ++v18; - v16 += 8; - if ( (signed int)v18 >= 540 ) - break; - v2 = 0; - } - pNPCProfTXT_Raw = 0; - uNumNPCNames[0] = v18; - //v7 = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0); - pNPCProfTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0); - strtok(pNPCProfTXT_Raw, "\r"); - strtok(0, "\r"); - strtok(0, "\r"); - strtok(0, "\r"); - v8 = (char *)&pProfessions[0].pJoinText; - v19 = (char *)&pProfessions[0].pJoinText; - v13 = 58; - do - { - v21 = 0; - v9 = strtok(0, "\r") + 1; - v17 = 0; - do - { - v10 = *v9; - v11 = 0; - if ( *v9 != 9 ) - { - do - { - if ( !v10 ) - break; - ++v11; - v10 = v9[v11]; + while((c!='\n')&&(c!='\t')&&(c>0)) + { + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + + if (temp_str_len) + { + *tmp_pos = 0; + if ( decode_step == 0) + pNPCNames[i][0] =RemoveQuotes(test_string); + else if ( decode_step == 1) + pNPCNames[i][1] =RemoveQuotes(test_string); + } + else + { + if ( (decode_step == 1)&&(!uNumNPCNames[1])) + uNumNPCNames[1]=i; + } } - while ( v10 != 9 ); - v8 = v19; - } - v15 = (int)&v9[v11]; - if ( !v9[v11] ) - v17 = 1; - *(char *)v15 = 0; - if ( v11 ) + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<2)&&!break_loop); + } + uNumNPCNames[0] = i; + + pNPCProfTXT_Raw = NULL; + pNPCProfTXT_Raw = (char *)pEvents_LOD->LoadRaw("npcprof.txt", 0); + strtok(pNPCProfTXT_Raw, "\r"); + strtok(NULL, "\r"); + strtok(NULL, "\r"); + strtok(NULL, "\r"); + + for (i=1; i<59; ++i) + { + test_string = strtok(NULL, "\r") + 1; + break_loop = false; + decode_step=0; + do { - switch ( v21 ) + c = *(unsigned char*)test_string; + temp_str_len = 0; + while((c!='\t')&&(c>0)) { - case 2: - *((int *)v8 - 3) = atoi(v9); - break; - case 3: - *((int *)v8 - 1) = (int)RemoveQuotes(v9); - break; - case 4: - *((int *)v8 - 2) = (int)RemoveQuotes(v9); - break; - case 5: - *(int *)v8 = (int)RemoveQuotes(v9); - break; - case 6: - *((int *)v8 + 1) = (int)RemoveQuotes(v9); - break; + ++temp_str_len; + c=test_string[temp_str_len]; + } + tmp_pos=test_string+temp_str_len; + if (*tmp_pos == 0) + break_loop = true; + *tmp_pos = 0; + if (temp_str_len) + { + switch(decode_step) + { + case 2: + pProfessions[i].uHirePrice = atoi(test_string); + break; + case 3: + pProfessions[i].pActionText = RemoveQuotes(test_string); + break; + case 4: + pProfessions[i].pBenefits= RemoveQuotes(test_string); + break; + case 5: + pProfessions[i].pJoinText = RemoveQuotes(test_string); + break; + case 6: + pProfessions[i].pDismissText = RemoveQuotes(test_string); + } } - } - else - { - if ( !v21 ) - v17 = 1; - } - ++v21; - v9 = (char *)(v15 + 1); + else + { + if (!decode_step) + break_loop = true; + } + ++decode_step; + test_string=tmp_pos+1; + } while ((decode_step<7)&&!break_loop); } - while ( v21 <= 6 && !v17 ); - v8 += 20; - v12 = v13-- == 1; - v19 = v8; + uNumNPCProfessions = 59; } - while ( !v12 ); - uNumNPCProfessions = 59; - } //----- (00477266) -------------------------------------------------------- void NPCStats::Release() { - NPCStats *v1; // esi@1 - void *v2; // ST00_4@1 - int v3; // ebx@1 - - v1 = this; - pAllocator->FreeChunk(this->pNPCTopicTXT_Raw); - v2 = v1->pNPCTextTXT_Raw; - v1->pNPCNewsTXT_Raw = 0; - pAllocator->FreeChunk(v2); - v1->pNPCNewsTXT_Raw = 0; - pAllocator->FreeChunk(0); - v1->pNPCNewsTXT_Raw = 0; - pAllocator->FreeChunk(v1->pNPCProfTXT_Raw); - v1->pNPCProfTXT_Raw = 0; - pAllocator->FreeChunk(v1->pNPCNamesTXT_Raw); - v1->pNPCNamesTXT_Raw = 0; - pAllocator->FreeChunk(v1->pNPCDataTXT_Raw); - v1->pNPCDataTXT_Raw = 0; - pAllocator->FreeChunk(v1->pNPCDistTXT_Raw); - v1->pNPCDistTXT_Raw = 0; - v3 = (int)&v1->pNPCGreetTXT_Raw; - pAllocator->FreeChunk(v1->pNPCGreetTXT_Raw); - v1 = (NPCStats *)((char *)v1 + 98296); - *(int *)v3 = 0; - pAllocator->FreeChunk(v1->pNPCData[0].pName); - v1->pNPCData[0].pName = 0; + pAllocator->FreeChunk(pNPCTopicTXT_Raw); + pNPCTopicTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCTextTXT_Raw); + pNPCTextTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCNewsTXT_Raw); + pNPCNewsTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCProfTXT_Raw); + pNPCProfTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCNamesTXT_Raw); + pNPCNamesTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCDataTXT_Raw); + pNPCDataTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCDistTXT_Raw); + pNPCDistTXT_Raw = NULL; + pAllocator->FreeChunk(pNPCGreetTXT_Raw); + pNPCGreetTXT_Raw = NULL; + pAllocator->FreeChunk(pNCPGroupTXT_Raw); + pNCPGroupTXT_Raw = NULL; } //----- (0047730C) -------------------------------------------------------- -int __fastcall const_1(int a1, int) +bool CheckPortretAgainsSex(int a1, int) { - return 1; + return true; } // 47730C: using guessed type int __stdcall const_1(int); //----- (0047732C) -------------------------------------------------------- -bool NPCStats::InitializeAdditionalNPCs(NPCData *a2, int a3, int a4, int a5) +void NPCStats::InitializeAdditionalNPCs(NPCData *pNPCDataBuff, int npc_uid, int uLocation2D, int uMapId) { - //NPCStats *v5; // ebx@1 - signed __int64 v6; // qax@1 - int v7; // esi@1 - int v8; // edx@1 - NPCData *v9; // edi@1 - int v10; // eax@1 - //int v11; // eax@23 - int v12; // ecx@23 - int v13; // edx@28 - int v14; // esi@37 - int v15; // edx@37 - int v16; // ecx@37 - int v17; // eax@37 - int v18; // edx@37 + + int uNPCSex; // esi@1 + int uGeneratedPortret; // ecx@23 + int test_prof_summ; // ecx@37 + int gen_profession; // eax@37 + int max_prof_cap; // edx@37 signed int result; // eax@39 - int v20; // [sp+Ch] [bp-Ch]@1 - signed int v21; // [sp+10h] [bp-8h]@1 - signed int v22; // [sp+14h] [bp-4h]@1 - int v23; // [sp+24h] [bp+Ch]@1 + int uRace; // [sp+Ch] [bp-Ch]@1 + bool break_gen; // [sp+10h] [bp-8h]@1 + signed int gen_attempts; // [sp+14h] [bp-4h]@1 + int uPortretMin; // [sp+24h] [bp+Ch]@1 + int uPortretMax; + + static const unsigned __int8 NPCSexGenTable[86] ={ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }; + static const unsigned __int8 NPCRaceGenTable[86] ={ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + , 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0}; - v23 = a3 - 1; - //v5 = this; - v6 = (signed __int64)((double)v23 * -0.33333334); - v7 = (unsigned __int8)byte_4E8394[-(_DWORD)v6 + 28]; - v20 = (unsigned __int8)byte_4E8394[-(_DWORD)v6 + 116]; - v8 = rand() % uNumNPCNames[v7]; - v9 = a2; - a2->uSex = v7; - a2->pName = pNPCNames[v8][v7]; - v10 = 0; - v22 = 0; - v21 = 0; + unsigned __int8 seed = (unsigned __int8)((double)(npc_uid - 1) * 0.33333334); + uNPCSex = NPCSexGenTable[seed]; + uRace = NPCRaceGenTable[seed]; + pNPCDataBuff->uSex = uNPCSex; + pNPCDataBuff->pName = pNPCNames[rand() % uNumNPCNames[uNPCSex]][uNPCSex]; + + gen_attempts = 0; + break_gen = false; - while ( 1 ) + do { - if ( v20 == v10 ) - { - if ( v7 == v10 ) + switch ( uRace ) { - v23 = 2; - a2 = (NPCData *)100; + case 0: + if ( uNPCSex == 0 ) + { + uPortretMin = 2; + uPortretMax = 100; } else { - if ( v7 - v10 == 1 ) - { - v23 = 201; - a2 = (NPCData *)250; - } + uPortretMin = 201; + uPortretMax = 250; } - } - else - { - switch ( v20 - v10 ) - { + case 1: - if ( v7 == v10 ) + if ( uNPCSex == 0 ) { - v23 = 400; - a2 = (NPCData *)430; + uPortretMin = 400; + uPortretMax = 430; } else { - if ( v7 - v10 == 1 ) - { - v23 = 460; - a2 = (NPCData *)490; - } + uPortretMin = 460; + uPortretMax = 490; } break; case 2: - if ( v7 == v10 ) + if ( uNPCSex == 0 ) { - v23 = 500; - a2 = (NPCData *)520; + uPortretMin = 500; + uPortretMax = 520; } else { - if ( v7 - v10 == 1 ) - { - v23 = 530; - a2 = (NPCData *)550; - } + uPortretMin = 530; + uPortretMax = 550; } break; case 3: - if ( v7 == v10 ) + if ( uNPCSex == 0 ) { - v23 = 300; - a2 = (NPCData *)330; + uPortretMin = 300; + uPortretMax = 330; } else - { - if ( v7 - v10 == 1 ) { - v23 = 360; - a2 = (NPCData *)387; + uPortretMin = 360; + uPortretMax = 387; } - } + break; } - } - v12 = v23 + rand() % ((int)a2 - v23 + 1); - if ( const_1(v12, v7) == 1 ) - v21 = 1; - ++v22; - if ( v22 >= 4 ) + + uGeneratedPortret = uPortretMin + rand() % (uPortretMax - uPortretMin + 1); + if ( CheckPortretAgainsSex(uGeneratedPortret, uNPCSex)) + break_gen = true; + ++gen_attempts; + if ( gen_attempts >= 4 ) { - v12 = v23; - v21 = 1; + uGeneratedPortret = uPortretMin; + break_gen = true; } - if ( v21 ) - break; - v10 = 0; } + while(!break_gen); - v9->uPortraitID = v12; - v9->uFlags = 0; - v9->fame = 0; + pNPCDataBuff->uPortraitID = uGeneratedPortret; + pNPCDataBuff->uFlags = 0; + pNPCDataBuff->fame = 0; + //generate reputation v13 = rand() % 100 + 1; if ( v13 >= 60 ) @@ -754,44 +641,34 @@ if ( v13 >= 95 ) { if ( v13 >= 98 ) - v9->rep = -600; + pNPCDataBuff->rep = -600; else - v9->rep = 400; + pNPCDataBuff->rep = 400; } else - { - v9->rep = -300; - } + pNPCDataBuff->rep = -300; } else - { - v9->rep = 200; - } + pNPCDataBuff->rep = 200; + } else - { - v9->rep = 0; - } + pNPCDataBuff->rep = 0; - //v14 = (int)((char *)v5 + 64 * a5); - //v15 = rand() % *(_DWORD *)(v14 + 91460); - v15 = rand() % array_16544[a5].field_0; - v16 = 0; - v17 = 0; - v18 = v15 + 1; + max_prof_cap = rand() % pProfessionChance[uMapId].uTotalprofChance+1; + test_prof_summ = 0; + gen_profession = 0; - if ( v18 > 0 ) + if ( max_prof_cap > 0 ) { do - //v14 += *(char *)(v14 + v17++ + 0x16548); - v16 += array_16544[a5].field_4[v17++]; - while ( v16 < v18 ); + test_prof_summ += pProfessionChance[uMapId].professionChancePerArea[gen_profession++]; + while ( test_prof_summ < max_prof_cap ); } - v9->uProfession = v17 - 1; - v9->house = a4; - v9->field_24 = 1; - v9->joins = 1; - return true; + pNPCDataBuff->uProfession = gen_profession - 1; + pNPCDataBuff->Location2D = uLocation2D; + pNPCDataBuff->field_24 = 1; + pNPCDataBuff->joins = 1; } @@ -850,7 +727,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pAwardsTXT_Raw ) pAllocator->FreeChunk(pAwardsTXT_Raw); @@ -906,7 +782,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pScrollsTXT_Raw ) pAllocator->FreeChunk(pScrollsTXT_Raw); @@ -957,7 +832,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pMerchantsTXT_Raw ) pAllocator->FreeChunk(pMerchantsTXT_Raw); @@ -1022,7 +896,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pTransitionsTXT_Raw ) pAllocator->FreeChunk(pTransitionsTXT_Raw); @@ -1073,7 +946,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pAutonoteTXT_Raw ) pAllocator->FreeChunk(pAutonoteTXT_Raw); @@ -1159,7 +1031,6 @@ unsigned int temp_str_len; char* tmp_pos; int decode_step; - int item_counter; if ( pQuestsTXT_Raw ) pAllocator->FreeChunk(pQuestsTXT_Raw);