Skip to content

Instantly share code, notes, and snippets.

@angavrilov
Forked from peterix/gist:1517773
Created December 29, 2011 15:34
Show Gist options
  • Save angavrilov/1534596 to your computer and use it in GitHub Desktop.
Save angavrilov/1534596 to your computer and use it in GitHub Desktop.
void __cdecl sub_89289C0(int unit)
{
int unit; // esi@1
int unf_vec_end; // eax@3
int v3; // edx@3
int v4; // edx@4
int unf_vec_start; // ecx@4
int item_id; // edi@5
signed int v7; // edx@7
signed int v8; // eax@8
int item; // ebx@8
int v10; // esi@8
int v11; // ecx@10
char v12; // sf@16
void *in_inventory_vec; // edx@18
int v14; // eax@22
int squad_index; // ecx@22
void *v16; // ebp@22
signed int v17; // edx@24
signed int v18; // eax@25
int v19; // ebx@25
int squad; // edi@25
void *v21; // eax@34
__int16 v22; // bx@34
__int16 v23; // ax@34
__int16 v24; // bx@34
__int16 v25; // ax@34
__int16 v26; // bx@34
__int16 v27; // ax@34
int v28; // eax@34
int v29; // ebx@34
__int16 v30; // ax@34
int v31; // ebp@36
char *v32; // edx@37
int v33; // ecx@37
char *v34; // ecx@38
unsigned int v35; // edx@43
int v36; // eax@52
int v37; // ebx@52
void *v38; // edi@52
int cur_uniform_start; // ecx@52
int cur_uniform_end; // eax@52
int v41; // eax@54
int v42; // ebp@54
void *v43; // edx@57
unsigned int v44; // ecx@57
unsigned int v45; // ebp@60
unsigned int v46; // ebp@60
unsigned int v47; // eax@61
int _EDI; // edi@61
unsigned int _ECX; // ecx@62
int v50; // eax@65
int needs_pickup_id_vec; // ebp@65
int v52; // edi@66
int inv_mode; // eax@67
int inv_item; // ebx@67
int v55; // eax@76
int v56; // edx@76
int v57; // ebx@76
int v58; // eax@76
int v59; // ebx@83
int v60; // eax@86
int v61; // eax@93
char v62; // sf@95
int weapon_skill; // edx@97
unsigned __int8 is_hunter; // cl@97
int v65; // eax@99
int v66; // eax@100
int item_id; // edi@101
signed int v68; // edx@103
signed int v69; // eax@104
int item; // ebx@104
int item_id2; // esi@104
int v72; // ecx@106
char v73; // sf@112
int item_id; // edx@114
int v75; // eax@115
int v76; // ecx@115
int v77; // ebp@115
int v78; // ecx@116
int v79; // eax@117
unsigned int v80; // eax@121
int v81; // edx@122
char v82; // sf@129
int v83; // eax@132
int v84; // edx@132
int unit; // edx@133
int v86; // edi@133
char v87; // sf@134
int item; // ebx@136
__int16 race; // si@136
__int16 v90; // bp@136
__int16 v91; // ST30_2@136
__int16 item_type; // ax@136
int v93; // eax@136
char v94; // al@137
int item_id; // ecx@139
signed int v96; // eax@140
signed int v97; // eax@141
int v98; // esi@141
int v99; // esi@143
int v100; // esi@145
int v101; // eax@151
int v102; // edx@153
int v103; // ecx@153
int v104; // ecx@154
int v105; // eax@155
signed int v106; // edx@155
int v107; // ebp@155
int v108; // edi@155
signed int v109; // edx@155
int v110; // ebx@157
int v111; // edx@159
int v112; // ecx@159
int v113; // esi@159
int v114; // edx@162
int v115; // ecx@162
int v116; // ecx@163
int v117; // ebp@165
int v118; // edi@165
int v119; // ebx@167
int v120; // edx@169
unsigned int v121; // eax@173
int v122; // edx@174
int v123; // eax@181
int v124; // edx@181
int v125; // edi@182
int item; // ebx@183
__int16 v127; // ST2C_2@183
__int16 v128; // bp@183
__int16 v129; // ST30_2@183
__int16 item_type; // ax@183
int item_id; // edx@188
int v132; // eax@191
int v133; // ebp@191
signed int v134; // eax@196
signed int v135; // edx@196
signed int v136; // ecx@196
int v137; // eax@196
int v138; // eax@196
int v139; // ebx@196
char v140; // sf@202
int v141; // eax@204
unsigned int v142; // eax@208
int v143; // edx@209
int v144; // eax@216
int v145; // eax@221
int v146; // edx@221
char v147; // sf@223
int v148; // eax@226
int v149; // ebp@226
int squad_index0; // edi@226
int squad_index1; // ebx@227
int squad_index2; // eax@231
int squad_index3; // esi@231
int squad_index4; // edx@233
int squad_index5; // eax@233
int squad_index6; // eax@234
char squad_index7; // sf@237
void *squad_index8; // eax@239
int j; // ecx@240
int assigned_start; // eax@241
int spec; // eax@241
int v162; // edx@241
int assigned_end; // edx@241
int v164; // esi@242
int v165; // ebx@243
unsigned int v166; // eax@244
int v167; // eax@245
signed int v168; // edx@250
signed int v169; // eax@251
int v170; // edi@251
int v171; // esi@251
int v172; // ecx@253
char v173; // sf@259
int v174; // edx@263
int v175; // ecx@263
int v176; // ecx@264
signed int v177; // edx@266
int v178; // ebp@266
int v179; // edi@266
signed int v180; // edx@266
int v181; // ebx@268
int v182; // edx@270
unsigned int v183; // eax@279
int v184; // edx@280
int v185; // eax@285
int v186; // edx@285
int v187; // ecx@286
char v188; // sf@287
int v189; // eax@290
int v190; // edx@292
int v191; // eax@292
char v192; // sf@297
char v193; // sf@298
int v194; // eax@302
int v195; // edx@302
int v196; // eax@304
int v197; // eax@322
signed int v198; // esi@327
signed int v199; // eax@328
int v200; // ebx@328
int v201; // edi@329
int v202; // eax@335
int v203; // eax@339
char v204; // al@346
signed int v205; // eax@347
signed int v206; // ecx@347
signed int v207; // ebx@347
int v208; // eax@347
int v209; // eax@347
int v210; // esi@347
int v211; // eax@360
int v212; // ebx@360
int v213; // eax@374
int v214; // esi@374
int v215; // ecx@382
int v216; // eax@384
int squad_pos; // eax@388
void *v218; // edx@390
int body_plan; // edx@390
void *v220; // ebp@390
signed int body_plan_size_b; // eax@390
signed int body_plan_size_b; // eax@390
int v223; // ebx@391
void *v224; // eax@394
unsigned int v225; // ecx@394
unsigned int v226; // ecx@398
int _EBP; // ebp@398
unsigned int _EBX; // ebx@399
int v229; // ebp@402
int v230; // ebx@403
int v231; // eax@406
unsigned int v232; // ecx@406
unsigned int v233; // edx@410
int _EAX; // eax@411
unsigned int _EBX; // ebx@411
unsigned int v236; // edx@415
signed int v237; // edx@418
signed int v238; // eax@419
int item; // ebx@419
int v240; // ebp@419
int v241; // ecx@421
int v242; // ebp@431
signed int v243; // edx@433
signed int v244; // eax@434
int v245; // ebx@434
int v246; // ecx@436
void *part_vec_start; // eax@445
int v248; // edx@445
__int16 v249; // ST34_2@445
__int16 v250; // ax@445
__int16 v251; // ST34_2@445
__int16 v252; // ax@445
__int16 v253; // ST34_2@445
__int16 v254; // ax@445
int v255; // eax@445
int v256; // ebp@445
__int16 v257; // ax@445
int v258; // edx@447
char *cur_use; // ecx@448
int part_id; // ebx@448
char *v261; // ebx@449
char *v262; // ebp@450
char v263; // sf@455
int v264; // ebp@457
char *v265; // edx@458
signed int v266; // ecx@458
char v267; // sf@460
char v268; // sf@467
int v269; // ecx@469
char *v270; // edx@470
signed int v271; // ebp@470
char v272; // sf@472
int v273; // eax@476
int v274; // edx@476
int v275; // edx@477
int v276; // ecx@477
char v277; // sf@478
int v278; // eax@481
int v279; // edx@481
int v280; // eax@481
int v281; // edx@481
int v282; // ebx@482
char v283; // sf@483
int v284; // eax@486
int v285; // ebp@488
int v286; // eax@488
int v287; // eax@489
int v288; // ebx@491
int v289; // edx@492
int v290; // esi@492
signed int v291; // esi@494
signed int v292; // ebx@495
int v293; // edi@495
int v294; // eax@503
int v295; // ecx@503
int v296; // edx@504
int v297; // eax@509
int v298; // eax@511
int v299; // eax@512
int v300; // edx@512
int v301; // ecx@512
int v302; // ebp@513
unsigned int v303; // edx@514
unsigned int v304; // ecx@514
int v305; // ebx@514
unsigned int v306; // eax@515
int v307; // eax@516
signed int v308; // edx@521
signed int v309; // eax@522
int v310; // ebp@522
int v311; // ecx@524
char v312; // sf@530
char v313; // sf@534
char v314; // sf@536
int v315; // eax@541
int v316; // edx@541
int v317; // ebx@541
int v318; // eax@543
int v319; // eax@555
int v320; // edx@555
int v321; // ecx@556
char v322; // sf@557
int v323; // eax@560
int v324; // edx@560
int v325; // eax@560
int v326; // edx@560
int v327; // ebx@561
char v328; // sf@562
int v329; // eax@565
int v330; // ebp@567
int v331; // eax@567
int v332; // eax@568
int ammo_spec; // edx@570
int v334; // ebx@571
int v335; // edi@571
signed int v336; // edi@573
signed int v337; // edx@574
int v338; // esi@574
int v339; // eax@583
int v340; // ecx@584
int v341; // eax@585
int v342; // eax@586
int v343; // edx@586
int v344; // ebx@586
int v345; // ebp@587
unsigned int v346; // edx@588
unsigned int v347; // ecx@588
int v348; // ebx@588
unsigned int v349; // eax@589
int v350; // eax@590
signed int v351; // edx@595
signed int v352; // eax@596
int v353; // ebp@596
int v354; // ecx@598
char v355; // sf@604
char v356; // sf@608
char v357; // sf@610
int v358; // eax@615
int v359; // edx@615
int v360; // ebx@615
int v361; // eax@617
int v362; // eax@629
int v363; // edx@629
unsigned int item_subtype; // edx@631
int itemdef; // eax@633
int spec; // edx@636
int assigned; // ecx@636
int v368; // eax@637
int v369; // ecx@637
signed int v370; // edx@639
signed int v371; // eax@640
int v372; // ebx@640
int v373; // ebp@640
int v374; // ecx@642
int skill_melee; // edx@649
unsigned int v376; // eax@651
unsigned __int16 melee_skill; // ax@656
unsigned int v378; // eax@658
int v379; // eax@661
int v380; // edx@663
int v381; // edx@664
int v383; // ebx@668
int v384; // ebp@668
signed int v385; // edx@670
signed int v386; // eax@671
int v387; // ebx@671
int v388; // ecx@673
int v389; // eax@683
int v390; // edx@685
int v391; // ebp@685
int v392; // eax@687
int v393; // ecx@687
char *v394; // eax@697
int v395; // eax@699
signed int v396; // edx@703
signed int v397; // eax@704
int v398; // ebx@704
int item2; // ebp@704
int v400; // ecx@706
int v402; // edx@714
int v403; // ecx@714
int v404; // ecx@715
int v405; // eax@720
int v406; // edx@720
int v407; // ecx@720
int v408; // ebx@720
int v409; // eax@720
int v410; // ecx@721
int v411; // edx@728
int v412; // ebp@728
int v413; // eax@731
int v414; // eax@739
int v415; // ecx@739
int v416; // eax@740
int v417; // edx@745
int v418; // ebp@745
int v419; // eax@747
int v420; // ebx@765
int v421; // eax@767
int v422; // ecx@767
int v423; // ecx@771
int v424; // ebp@771
int v425; // eax@773
int v426; // edx@773
int v427; // esi@783
int v428; // eax@785
int v429; // ecx@791
int v430; // eax@793
int v431; // ecx@797
int v432; // eax@800
int unit; // [sp+2Ch] [bp-E0h]@136
int cur_uniform; // [sp+34h] [bp-D8h]@2
int unf_vec_start; // [sp+34h] [bp-D8h]@3
int v436; // [sp+34h] [bp-D8h]@34
int v437; // [sp+34h] [bp-D8h]@42
int cur_uniform; // [sp+34h] [bp-D8h]@44
int v439; // [sp+34h] [bp-D8h]@52
int v440; // [sp+34h] [bp-D8h]@100
int v441; // [sp+34h] [bp-D8h]@132
int v442; // [sp+34h] [bp-D8h]@181
int v443; // [sp+34h] [bp-D8h]@221
int v444; // [sp+34h] [bp-D8h]@241
unsigned int v445; // [sp+34h] [bp-D8h]@393
unsigned int v446; // [sp+34h] [bp-D8h]@397
int v447; // [sp+34h] [bp-D8h]@403
unsigned int v448; // [sp+34h] [bp-D8h]@409
int v449; // [sp+34h] [bp-D8h]@414
int v450; // [sp+34h] [bp-D8h]@445
int v451; // [sp+34h] [bp-D8h]@481
int v452; // [sp+34h] [bp-D8h]@512
int v453; // [sp+34h] [bp-D8h]@560
int v454; // [sp+34h] [bp-D8h]@586
int v455; // [sp+34h] [bp-D8h]@630
int v456; // [sp+34h] [bp-D8h]@668
int melee_skill; // [sp+34h] [bp-D8h]@683
int cur_uniform; // [sp+34h] [bp-D8h]@699
int v459; // [sp+38h] [bp-D4h]@3
int v460; // [sp+38h] [bp-D4h]@27
int v461; // [sp+38h] [bp-D4h]@60
int v462; // [sp+38h] [bp-D4h]@99
signed int found_item; // [sp+38h] [bp-D4h]@133
signed int found_item; // [sp+38h] [bp-D4h]@182
int v465; // [sp+38h] [bp-D4h]@222
int v466; // [sp+38h] [bp-D4h]@242
int v467; // [sp+38h] [bp-D4h]@286
int v468; // [sp+38h] [bp-D4h]@410
unsigned int v469; // [sp+38h] [bp-D4h]@415
int item; // [sp+38h] [bp-D4h]@434
int v471; // [sp+38h] [bp-D4h]@481
int v472; // [sp+38h] [bp-D4h]@513
int v473; // [sp+38h] [bp-D4h]@560
int v474; // [sp+38h] [bp-D4h]@587
int v475; // [sp+38h] [bp-D4h]@629
int v476; // [sp+38h] [bp-D4h]@661
int v477; // [sp+38h] [bp-D4h]@791
int i; // [sp+3Ch] [bp-D0h]@4
unsigned int v479; // [sp+3Ch] [bp-D0h]@60
int unit; // [sp+3Ch] [bp-D0h]@100
int v481; // [sp+3Ch] [bp-D0h]@140
int v482; // [sp+3Ch] [bp-D0h]@189
int v483; // [sp+3Ch] [bp-D0h]@227
int unit; // [sp+3Ch] [bp-D0h]@240
int v485; // [sp+3Ch] [bp-D0h]@285
int v486; // [sp+3Ch] [bp-D0h]@390
int v487; // [sp+3Ch] [bp-D0h]@409
int v488; // [sp+3Ch] [bp-D0h]@486
int v489; // [sp+3Ch] [bp-D0h]@511
int v490; // [sp+3Ch] [bp-D0h]@565
int v491; // [sp+3Ch] [bp-D0h]@585
int v492; // [sp+3Ch] [bp-D0h]@765
int v493; // [sp+3Ch] [bp-D0h]@783
int v494; // [sp+3Ch] [bp-D0h]@797
int unf_vec_start; // [sp+40h] [bp-CCh]@3
unsigned int v496; // [sp+40h] [bp-CCh]@43
int item; // [sp+40h] [bp-CCh]@75
int v498; // [sp+40h] [bp-CCh]@142
int v499; // [sp+40h] [bp-CCh]@157
int v500; // [sp+40h] [bp-CCh]@167
int v501; // [sp+40h] [bp-CCh]@189
int v502; // [sp+40h] [bp-CCh]@241
int v503; // [sp+40h] [bp-CCh]@268
int v504; // [sp+40h] [bp-CCh]@382
int v505; // [sp+40h] [bp-CCh]@397
int v506; // [sp+40h] [bp-CCh]@416
signed int permit; // [sp+40h] [bp-CCh]@445
int v508; // [sp+40h] [bp-CCh]@476
int v509; // [sp+40h] [bp-CCh]@541
int v510; // [sp+40h] [bp-CCh]@555
int v511; // [sp+40h] [bp-CCh]@615
int v512; // [sp+40h] [bp-CCh]@637
int melee_skill; // [sp+40h] [bp-CCh]@656
int v514; // [sp+40h] [bp-CCh]@662
int *v515; // [sp+44h] [bp-C8h]@22
signed int v516; // [sp+44h] [bp-C8h]@34
int v517; // [sp+44h] [bp-C8h]@42
int v518; // [sp+44h] [bp-C8h]@100
int v519; // [sp+44h] [bp-C8h]@410
int v520; // [sp+44h] [bp-C8h]@414
int v521; // [sp+44h] [bp-C8h]@477
int v522; // [sp+44h] [bp-C8h]@556
int v523; // [sp+44h] [bp-C8h]@596
char v524; // [sp+44h] [bp-C8h]@662
int v525; // [sp+44h] [bp-C8h]@699
__int16 v526; // [sp+48h] [bp-C4h]@34
char is_hunter; // [sp+48h] [bp-C4h]@100
signed int min_dist; // [sp+48h] [bp-C4h]@133
signed int min_dist; // [sp+48h] [bp-C4h]@182
int v530; // [sp+48h] [bp-C4h]@239
__int16 size; // [sp+48h] [bp-C4h]@445
signed int v532; // [sp+48h] [bp-C4h]@477
signed int v533; // [sp+48h] [bp-C4h]@556
int v534; // [sp+48h] [bp-C4h]@700
int needs_ammo; // [sp+4Ch] [bp-C0h]@97
int position; // [sp+4Ch] [bp-C0h]@389
int v537; // [sp+4Ch] [bp-C0h]@492
int v538; // [sp+4Ch] [bp-C0h]@522
char v539; // [sp+50h] [bp-BCh]@34
int weapon_skill; // [sp+50h] [bp-BCh]@99
int v541; // [sp+50h] [bp-BCh]@222
int v542; // [sp+50h] [bp-BCh]@240
int v543; // [sp+50h] [bp-BCh]@496
int v544; // [sp+50h] [bp-BCh]@509
int v545; // [sp+50h] [bp-BCh]@571
int v546; // [sp+50h] [bp-BCh]@583
int item; // [sp+50h] [bp-BCh]@671
char needs_crossbow; // [sp+54h] [bp-B8h]@99
int v549; // [sp+54h] [bp-B8h]@240
char is_shaped; // [sp+54h] [bp-B8h]@445
int v551; // [sp+54h] [bp-B8h]@489
int v552; // [sp+54h] [bp-B8h]@510
int v553; // [sp+54h] [bp-B8h]@575
int v554; // [sp+54h] [bp-B8h]@584
int v555; // [sp+54h] [bp-B8h]@701
int v556; // [sp+54h] [bp-B8h]@728
char got_weapon; // [sp+58h] [bp-B4h]@100
int v558; // [sp+58h] [bp-B4h]@447
int v559; // [sp+58h] [bp-B4h]@489
int v560; // [sp+58h] [bp-B4h]@568
int v561; // [sp+58h] [bp-B4h]@584
int v562; // [sp+58h] [bp-B4h]@728
int v563; // [sp+58h] [bp-B4h]@745
int unf_vec; // [sp+5Ch] [bp-B0h]@3
int v565; // [sp+5Ch] [bp-B0h]@489
int v566; // [sp+5Ch] [bp-B0h]@510
int v567; // [sp+5Ch] [bp-B0h]@568
int v568; // [sp+5Ch] [bp-B0h]@745
int v569; // [sp+60h] [bp-ACh]@100
int v570; // [sp+60h] [bp-ACh]@477
int v571; // [sp+60h] [bp-ACh]@510
int unit; // [sp+60h] [bp-ACh]@568
int v573; // [sp+60h] [bp-ACh]@584
int v574; // [sp+64h] [bp-A8h]@477
int v575; // [sp+64h] [bp-A8h]@556
int v576; // [sp+68h] [bp-A4h]@477
int v577; // [sp+68h] [bp-A4h]@556
int v578; // [sp+6Ch] [bp-A0h]@556
void *in_inventory_vec; // [sp+70h] [bp-9Ch]@18
unsigned int in_inventory_vec.end; // [sp+74h] [bp-98h]@52
int v581; // [sp+78h] [bp-94h]@52
void *weapon_cnt; // [sp+80h] [bp-8Ch]@629
int weapon_cnt.end; // [sp+84h] [bp-88h]@629
int weapon_cnt.limit; // [sp+88h] [bp-84h]@629
void *weapon_cnt_skill; // [sp+90h] [bp-7Ch]@34
int weapon_cnt.end; // [sp+94h] [bp-78h]@34
int weapon_cnt_skill.limit; // [sp+98h] [bp-74h]@34
void *shaped_set.start; // [sp+A0h] [bp-6Ch]@38
unsigned int shaped_set.end; // [sp+A4h] [bp-68h]@390
int shaped_set.limit; // [sp+A8h] [bp-64h]@390
void *size_accum.start; // [sp+B0h] [bp-5Ch]@37
unsigned int size_accum.end; // [sp+B4h] [bp-58h]@390
int size_accum.limit; // [sp+B8h] [bp-54h]@390
int v594; // [sp+BCh] [bp-50h]@218
int item_z; // [sp+C0h] [bp-4Ch]@194
int item_y; // [sp+D0h] [bp-3Ch]@194
int item_x; // [sp+E0h] [bp-2Ch]@22
void removeCivilianAssignment(unit, item_id) {
unit->military.uniforms[0].erase(i);
if (binsearch(ui.equipment.work_weapons, item_id, &idx)) {
ui.equipment.work_weapons.erase(idx);
ui.equipment.work_units.erase(idx);
}
}
void insertIntoSortedVector(int item, std::vector<int> *vec);
void addCivilianAssignment(unit, item_id) {
v183 = insertIntoSortedVector(item_id, &ui.equipment.work_weapons);
if (v183 != -1) // inserted
{
if (v183 < ui.equipment.work_units.size())
ui.equipment.work_units.insert(ui.equipment.begin()+v183, unit->id);
else
ui.equipment.work_units.push_back(unit->id);
}
}
void addHunterAmmoAssignment(unit, item_id) {
v183 = insertIntoSortedVector(item_id, &ui.equipment.hunter_ammo);
if (v183 != -1) // inserted
{
if (v183 < ui.equipment.work_units.size())
ui.equipment.hunter_units.insert(ui.equipment.begin()+v183, unit->id);
else
ui.equipment.hunter_units.push_back(unit->id);
}
}
if (!(unit->military.pickup_equipment_bit & 1))
return;
int cur_uniform = unit->military.cur_uniform;
if (unit->military.cur_uniform == 0) // Civilian
{
std::vector<int32_t> *unf_vec = &unit->military.uniforms[0];
unf_vec_start = unf_vec->start;
// Kick out unassigned
for (int i = unf_vec->size()-1; i >= 0; i--)
{
item_id = unf_vec[i];
if (item_id != -1 &&
binsearch(world.items.all, item_id, &idx) &&
item = world.items.all[idx])
{
short type = item->vtable<0>();
if (type == 24 || type == 61) // WEAPON / QUIVER
{
if (item->id == -1 ||
!binsearch(ui.equipment.work_weapons, item->id, &idx) ||
ui.equipment.work_units[idx] != unit->id)
{
unf_vec->erase(item_id);
}
}
}
}
// Account for already present weapons
is_hunter = unit->status.labors[44/*HUNT*/];
needs_ammo = is_hunter ? 25 : 0;
weapon_skill = 38; // AXE
if (!unit->status.labors[10/*WOODCUT*/])
weapon_skill = unit->status.labors[0/*MINING*/] ? 0 : -1;
got_weapon = 0;
needs_quiver = is_hunter != 0;
needs_crossbow = is_hunter != 0;
for (int i = unf_vec->size()-1; i >= 0; i--)
{
item_id = unf_vec[i];
if (item_id != -1 &&
binsearch(world.items.all, item_id, &idx) &&
item = world.items_all[idx])
{
short type = item->vtable<0>();
if (type == 61) // QUIVER
{
if (needs_quiver)
{
needs_quiver = 0;
addCivilianAssignment(unit, item_id);
}
else {
unit->military.uniforms[0].erase(i);
removeCivilianAssignment(unit, item_id);
}
}
else if (type == 38) // AMMO
{
if ( needs_ammo <= 0 ) {
unit->military.uniforms[0].erase(i);
removeCivilianAssignment(unit, item_id);
}
else
needs_ammo -= item->vtable<0x214>();
}
else if (type == 24) // WEAPON
{
if (needs_crossbow)
{
if (item->vtable<0x2f4>()) {
got_weapon = 1;
addCivilianAssignment(unit, item_id);
} else {
unit->military.uniforms[0].erase(i);
removeCivilianAssignment(unit, item_id);
}
}
else
{
short v101 = item->vtable<0x254>();
if (v101 == -1)
v101 = item->vtable<0x250>();
if (weapon_skill == -1 || weapon_skill != v101) {
unit->military.uniforms[0].erase(i);
removeCivilianAssignment(unit, item_id);
} else {
got_weapon = 1;
addCivilianAssignment(unit, item_id);
}
}
}
}
}
// Provide quiver
if (needs_quiver) {
found_item = -1;
short min_dist = 2 * (world.map.z_count + world.map.x_count + world.map.y_count);
for (int i = world.items.other[11].size()-1; i >= 0; i--)
{
item = world.items.other[11][i];
item_type = item->vtable<0>();
if (!sub_88C2210(item_type, item->vtable<4>(), item->vtable<0x2a0>(), unit->race) &&
sub_85D8BF0(item) &&
!(item->flags & 0x2E90C32))
{
item_id = item->id;
if (item_id != -1 && binsearch(ui.equipment.work_weapons, item_id, NULL))
continue;
if (binsearch(ui.equipment.items_assigned[61], item_id, NULL))
continue;
sub_85D1880(item, &item_x, &item_y, &item_z);
if (item_x != -30000)
{
if (sub_88D67E0(unit, item_x, item_y, item_z, 1))
{
short dx = abs(item_x - unit_x);
short dy = abs(item_y - unit_y);
short dz = abs(item_z - unit_z);
if (dx > dz || dy > dz) {
dz = dy;
if (dx > dy)
dz = dx;
}
if (min_dist > dz)
{
min_dist = dz;
found_item = item_id;
}
}
}
}
} // CUT_1
if (found_item != -1)
{
item = world.items.other[11][found_item];
insertIntoSortedVector(item->id, unf_vec);
addCivilianAssignment(unit, item->id);
}
else {
setMiscTrait(unit, 43, 300); // retry pickup timeout?
}
} // needs_quiver
// Provide weapon
if (!got_weapon && (needs_crossbow || weapon_skill != -1)) {
found_item = -1;
short min_dist = 2 * (world.map.z_count + world.map.x_count + world.map.y_count);
for (int i = world.items.other[2].size()-1; i >= 0; i--)
{
item = world.items.other[2][i];
item_type = item->vtable<0>();
if (!sub_88C2210(item_type, item->vtable<4>(), item->vtable<0x2a0>(), unit->race))
{
if (needs_crossbow)
{
if (!item->vtable<0x2F4>())
continue
}
else
{
short v141 = item->vtable<0x254>();
if (v141 == -1)
v141 = item->vtable<0x250>();
if (weapon_skill != v141)
continue;
}
if (!sub_85D8BF0(item) || (item->flags & 0x2E90C32))
continue;
item_id = item->id;
if (item_id != -1 && binsearch(ui.equipment.work_weapons, item_id, NULL))
continue;
if (binsearch(ui.equipment.items_assigned[24], item_id, NULL))
continue;
sub_85D1880(item, &item_x, &item_y, &item_z);
if (item_x != -30000)
{
if (sub_88D67E0(unit, item_x, item_y, item_z, 1))
{
short dx = abs(item_x - unit_x);
short dy = abs(item_y - unit_y);
short dz = abs(item_z - unit_z);
if (dx > dz || dy > dz) {
dz = dy;
if (dx > dy)
dz = dx;
}
if (min_dist > dz)
{
min_dist = dz;
found_item = item_id;
}
}
}
}
}
if (found_item != -1)
{
item = world.items.other[2][found_item];
insertIntoSortedVector(item->id, unf_vec);
addCivilianAssignment(unit, item->id);
} else {
sub_88F3930(unit, 43, 300);
}
} // !got_weapon
// Provide hunting ammo
if (unit->status.labors[44/*HUNT*/])
{
for (int i = unit->inventory.size()-1; i >= 0; i--) {
item = unit->inventory[i]->item;
if (item->vtable<0>() != 61) continue;
for (int j = item->refs.size()-1; j >= 0; j--) {
if (item->refs[j]->vtable<8>() != 10) // contains
continue;
item *content = item->refs[j]->vtable<0xC>();
if (content && content->vtable<0>() == 38) { // AMMO
needs_ammo -= content->vtable<0x214>();
if (binsearch(ui.equipment.hunter_ammo, content->id, &idx)) {
if (ui.equipment.hunter_ammo_units[idx] == unit->id)
insertIntoSortedVector(content->id, &unit->military.uniforms[cur_uniform]);
} else {
insertIntoSortedVector(content->id, &unit->military.uniforms[cur_uniform]);
addHunterAmmoAssignment(unit, content->id);
}
}
}
}
if (needs_ammo > 0) {
for (int i = ui.equipment.hunter_ammunition.size()-1; i >= 0; i--) {
spec = ui.equipment.hunter_ammunition[i];
for (int j = spec->assigned.size()-1; j >= 0; j--) {
int item_id = spec->assigned[j];
if (item_id != -1 &&
(!binsearch(ui.equipment.hunter_ammo, item_id, &idx) ||
ui.equipment.hunter_units[idx] == unit->id) &&
binsearch(world.items.all, item_id, &idx) &&
item = world.items.all[idx] &&
(sub_85D1880(item, &item_x, &item_y, &item_z),
sub_88D67E0(unit, item_x, item_y, item_z, 1)))
{
needs_ammo -= item->vtable<0x214>();
insertIntoSortedVector(item_id, &unit->military.uniforms[cur_uniform]);
addHunterAmmoAssignment(unit, item_id);
if (needs_ammo <= 0)
break;
}
if (needs_ammo <= 0)
break;
}
}
}
}
goto DONE;
}
// ELSE MILITARY
squad_index = unit->squad_index;
squad_pos = unit->squad_pos;
unit->military.cur_uniform[cur_squad].clear();
if (!binsearch(world.squads.all, squad_index, &idx) ||
!(squad = world.squads.all[idx]) ||
squad_pos == -1 ||
!(position = squad.positions[squad_pos]))
goto DONE;
body_plan = unit->body_plan;
size_accum.start = 0;
size_accum.end = 0;
body_plan_size_b = *(_DWORD *)(body_plan + 4) - *(_DWORD *)body_plan;
size_accum.limit = 0;
shaped_set.start = 0;
shaped_set.end = 0;
shaped_set.limit = 0;
LOWORD(item_z) = 0;
sub_80525A0(&size_accum.start, 0, body_plan_size_b >> 2, &item_z);
body_plan_size_b = unit->body_plan->end - *unit->body_plan->start;
LOBYTE(item_x) = 0;
sub_80E92F0(&shaped_set.start, 0, body_plan_size_b >> 2, &item_x);
v218 = shaped_set.start;
v220 = size_accum.start;
v486 = size_accum.end;
if (size_accum.start < size_accum.end)
memset(size_accum.start, 0, 2*size_accum.size());
if (shaped_set.start < shaped_set.end)
memset(shaped_set.start, 0, shaped_set.size());
for (int i = 0; i < position->assigned_items.size(); i++) {
item_id = position->assigned_items[i];
if (binsearch(world.items.all, item_id, &idx) &&
(item = world.items.all[idx]))
{
switch (item->vtable<0>() - 25)
{
case 0u:
case 1u:
case 3u:
case 4u:
case 0xBu:
case 0xFu:
case 0x10u:
case 0x11u:
case 0x22u:
short permit = sub_829D850(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
size = sub_829D9A0(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
is_shaped = sub_829DC20(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
vector<short> part_vec;
sub_88F0F30(unit, item->vtable<0>(), item->vtable<0xac>(), &part_vec);
if ( is_shaped )
{
for (int j = part_vec.size(); j >= 0; j--) {
part_id = part_vec[j];
if (permit >= size_accum[j] && !shaped_set[j]) {
shaped_set[j] = 1;
size_accum[j] += size;
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
}
}
}
else
{
for (int j = part_vec.size(); j >= 0; j--) {
if (permit >= size_accum[j]) {
size_accum[j] += size;
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
}
}
}
if (part_vec.start)
operator delete(part_vec_start);
break;
default:
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
break;
}
}
}
if (!position->flags.replace_clothing)
{
for (int i = 0; i < unit->military.uniforms[0].size(); i++)
{
item_id = position->assigned_items[i];
if (binsearch(world.items.all, item_id, &idx) &&
(item = world.items.all[idx]))
{
switch (item->vtable<0>() - 25)
{
case 0u:
case 1u:
case 3u:
case 4u:
case 0xBu:
case 0xFu:
case 0x10u:
case 0x11u:
case 0x22u:
short permit = sub_829D850(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
size = sub_829D9A0(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
is_shaped = sub_829DC20(&world.raw.itemdefs.all, item->vtable<0>(), item->vtable<4>());
vector<short> part_vec;
sub_88F0F30(unit, item->vtable<0>(), item->vtable<0xac>(), &part_vec);
if ( is_shaped )
{
for (int j = part_vec.size(); j >= 0; j--) {
part_id = part_vec[j];
if (permit >= size_accum[j] && !shaped_set[j]) {
shaped_set[j] = 1;
size_accum[j] += size;
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
}
}
}
else
{
for (int j = part_vec.size(); j >= 0; j--) {
if (permit >= size_accum[j]) {
size_accum[j] += size;
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
}
}
}
if (part_vec.start)
operator delete(part_vec_start);
break;
default:
break;
}
}
}
}
cur_uniform = unit->military.cur_uniform;
if (unit->military.cur_uniform == 2) {
std::vector<short> weapon_cnt_skill;
std::vector<int> weapon_cnt;
for (int i = 0; i < position->uniform[WEAPON].size(); i++) {
v594 = 1;
spec = position->uniform[WEAPON][i];
if (!spec->assigned.empty()) {
item_id = spec->assigned[0];
if (binsearch(world.items.all, item_id, &idx) &&
(item = world.items.all[idx]))
{
if (!item->vtable<0x2f4>()) // not crossbow
{
melee_skill = item->vtable<0x250>(); // getMeleeSkill
if ( melee_skill <= 115)
{
if (binsearch(weapon_cnt_skill, melee_skill, &idx))
weapon_cnt[idx] += v594;
else {
v378 = sub_805D7E0(melee_skill, &weapon_cnt_skill);
if (v378 != -1)
weapon_cnt.insertAt(v378, v594);
}
}
}
}
} else {
item_subtype = *(_WORD *)(spec + 6);
if (item_subtype >= 0 && item_subtype < world.raws.itemdefs.weapons.size())
{
itemdef = world.raws.itemdefs.weapons[item_subtype];
if (itemdef->skill_ranged == -1 )
{
melee_skill = itemdef->skill_melee;
if ( melee_skill <= 115)
{
if (binsearch(weapon_cnt_skill, melee_skill, &idx))
weapon_cnt[idx] += 1;
else {
v378 = sub_805D7E0(melee_skill, &weapon_cnt_skill);
if (v378 != -1)
weapon_cnt.insertAt(v378, &v594);
}
}
}
}
}
}
found = 0;
for (int i = squad->unk_108.size()-1; i >= 0; i--) {
item_id = squad->unk_108[i];
if (binsearch(world.items.all, item_id, &idx) &&
(item = world.items.all[idx]))
{
if (item->vtable<0x254>() == -1) // getRangedSkill
{
melee_skill = item->vtable<0x250>();
if (melee_skill != -1 &&
binsearch(weapon_cnt_skill, melee_skill, &idx))
{
if (weapon_cnt[idx] <= 0)
continue;
weapon_cnt[idx]--;
if (!found) {
cur_uniform = unit->military.cur_uniform;
uniform_vec = unit->military.uniforms[cur_uniform];
for (int j = uniform_vec->size()-1; j >= 0; j--) {
id2 = uniform_vec->[j];
if (binsearch(world.items.all, id2, &idx) &&
(item2 = world.items.all[idx]))
{
if (item2->vtable<0>() == 24) // WEAPON
uniform_vec->erase(j);
}
}
found = 1;
}
insertIntoSortedVector(item->id, unit->military.uniforms[cur_uniform]);
insertIntoSortedVector(item->id, squad->unk_118);
squad->unk_108.erase(item->id);
}
}
} else {
squad->unk_108.erase(i);
}
}
if ( weapon_cnt )
operator delete(weapon_cnt);
if ( weapon_cnt_skill )
operator delete(weapon_cnt_skill);
}
if (cur_uniform == 1 && position->quiver != -1)
{
v319 = unit->inventory.start;
v320 = ((unit->inventory.end - v319) >> 2) - 1;
v510 = v320;
if ( v320 < 0 )
{
v533 = 25;
goto LABEL_583;
}
v522 = 4 * v320;
v321 = unit + 0xA8;
v533 = 25;
v578 = squad + 0xBC;
v575 = unit + 0xA8;
v577 = squad + 0xC8;
while ( 2 )
{
if ( (unsigned __int16)(****(int (__fastcall *****)(_DWORD))(v319 + v522))(v321) != 61
|| (v325 = **(_DWORD **)(unit->inventory.start + v522),
v321 = v325,
v473 = **(_DWORD **)(unit->inventory.start + v522),
v326 = *(_DWORD *)(v325 + 0x28),
v323 = *(_DWORD *)(v325 + 0x24),
v324 = ((v326 - v323) >> 2) - 1,
v453 = v324,
v324 < 0) )
goto LABEL_557;
v327 = 4 * v324;
while ( 2 )
{
if ( (*(int (__cdecl **)(_DWORD))(**(_DWORD **)(v323 + v327) + 8))(*(_DWORD *)(v323 + v327)) != 10
|| (v329 = (*(int (__cdecl **)(_DWORD))(**(_DWORD **)(*(_DWORD *)(v473 + 0x24) + v327) + 12))(*(_DWORD *)(*(_DWORD *)(v473 + 0x24) + v327)),
v490 = v329,
!v329)
|| (unsigned __int16)(**(int (__cdecl ***)(_DWORD))v329)(v329) != 38
|| (v331 = (*(int (__cdecl **)(int))(*(_DWORD *)v490 + 0x214))(v490),
v321 = *(_DWORD *)(squad + 0x98),
v533 -= v331,
v330 = ((*(_DWORD *)(squad + 0x9C) - v321) >> 2) - 1,
v330 < 0) )
goto LABEL_562;
v332 = 4 * v330;
v560 = v327;
v567 = squad;
unit = unit;
while ( 1 )
{
ammo_spec = *(_DWORD *)(v321 + v332);
if ( *(_BYTE *)(ammo_spec + 16) & 1 )
{
v545 = *(_DWORD *)(v490 + 20);
v334 = *(_DWORD *)(ammo_spec + 20);
v335 = (*(_DWORD *)(ammo_spec + 24) - v334) >> 2;
if ( v335 )
{
if ( v545 != -1 )
{
v336 = v335 - 1;
if ( v336 >= 0 )
break;
}
}
}
LABEL_569:
v332 -= 4;
--v330;
if ( v330 < 0 )
{
v327 = v560;
squad = v567;
unit = unit;
goto LABEL_562;
}
}
v337 = v336 >> 1;
v338 = *(_DWORD *)(v334 + 4 * (v336 >> 1));
if ( v545 != v338 )
{
v553 = 0;
do
{
if ( v545 < v338 )
v336 = v337 - 1;
else
v553 = v337 + 1;
if ( v336 < v553 )
goto LABEL_569;
v337 = (v336 + v553) >> 1;
v338 = *(_DWORD *)(v334 + 4 * v337);
}
while ( v545 != v338 );
}
squad = v567;
v327 = v560;
unit = unit;
v415 = *(_DWORD *)(v567 + 0xBC);
v414 = (*(_DWORD *)(v567 + 0xC0) - v415) >> 2;
if ( v414 )
{
v418 = v414 - 1;
v417 = 0;
v568 = v560;
v563 = v415;
while ( 1 )
{
if ( v417 > v418 )
{
v327 = v568;
goto LABEL_740;
}
v419 = (v418 + v417) >> 1;
v321 = *(_DWORD *)(v490 + 20);
if ( *(_DWORD *)(v563 + 4 * v419) == v545 )
break;
if ( *(_DWORD *)(v563 + 4 * v419) <= v545 )
v417 = v419 + 1;
else
v418 = v419 - 1;
}
v327 = v568;
if ( *(_DWORD *)(*(_DWORD *)(squad + 0xC8) + 4 * v419) == *(_DWORD *)(unit + 0xA8) )
insertIntoSortedVector(v545, unit + 12 * unit->military.cur_uniform + 0x114);
}
else
{
LABEL_740:
insertIntoSortedVector(v545, unit + 12 * unit->military.cur_uniform + 0x114);
v416 = insertIntoSortedVector(*(_DWORD *)(v490 + 20), v578);
if ( v416 >= (*(_DWORD *)(squad + 0xCC) - *(_DWORD *)(squad + 0xC8)) >> 2 )
{
sub_80E86D0(v577, v575);
}
else
{
if ( v416 != -1 )
sub_81374F0(v577, v416, v575);
}
}
LABEL_562:
v327 -= 4;
v328 = v453-- - 1 < 0;
if ( !v328 )
{
v323 = *(_DWORD *)(v473 + 0x24);
continue;
}
break;
}
LABEL_557:
v522 -= 4;
v322 = v510-- - 1 < 0;
if ( !v322 )
{
v319 = unit->inventory.start;
continue;
}
break;
}
if ( v533 <= 0 )
{
cur_uniform = unit->military.cur_uniform;
goto LABEL_46;
}
LABEL_583:
v339 = *(_DWORD *)(squad + 0x98);
v546 = ((*(_DWORD *)(squad + 0x9C) - v339) >> 2) - 1;
if ( v546 < 0 )
{
cur_uniform = unit->military.cur_uniform;
goto LABEL_46;
}
v340 = 4 * v546;
v554 = 4 * v546;
v561 = squad + 0xC8;
v573 = unit + 0xA8;
while ( 2 )
{
v341 = *(_DWORD *)(v339 + v340);
v491 = v341;
if ( *(_BYTE *)(v341 + 16) & 1 )
{
v344 = v341;
v342 = *(_DWORD *)(v341 + 20);
v343 = ((*(_DWORD *)(v344 + 24) - v342) >> 2) - 1;
v454 = v343;
if ( v343 >= 0 )
{
v474 = 4 * v343;
v345 = 4 * v343;
while ( 1 )
{
v347 = *(_DWORD *)(squad + 0xBC);
v346 = *(_DWORD *)(squad + 0xC0);
v348 = *(_DWORD *)(v342 + v345);
if ( v347 >= v346 )
goto LABEL_593;
v349 = *(_DWORD *)(squad + 0xBC);
if ( v348 != *(_DWORD *)v347 )
break;
v350 = 0;
LABEL_607:
if ( *(_DWORD *)(*(_DWORD *)(squad + 0xC8) + 4 * v350) == *(_DWORD *)(unit + 0xA8) )
goto LABEL_593;
v474 -= 4;
v356 = v454-- - 1 < 0;
if ( v356 )
goto LABEL_609;
LABEL_605:
v345 = v474;
v342 = *(_DWORD *)(v491 + 20);
}
while ( 1 )
{
v349 += 4;
if ( v346 <= v349 )
break;
if ( v348 == *(_DWORD *)v349 )
{
v350 = (signed int)(v349 - v347) >> 2;
if ( v350 == -1 )
break;
goto LABEL_607;
}
}
LABEL_593:
if ( (world.items.all.end - world.items.all.start) >> 2 )
{
if ( v348 != -1 )
{
v351 = ((world.items.all.end - world.items.all.start) >> 2) - 1;
if ( v351 >= 0 )
{
v352 = v351 >> 1;
v353 = *(_DWORD *)(*(_DWORD *)(world.items.all.start + 4 * (v351 >> 1)) + 20);
v523 = *(_DWORD *)(world.items.all.start + 4 * (v351 >> 1));
if ( v348 != v353 )
{
if ( (world.items.all.end - world.items.all.start) >> 2 == 1 )
goto LABEL_604;
v354 = 0;
while ( 1 )
{
if ( v348 < v353 )
{
v351 = v352 - 1;
if ( v354 > v352 - 1 )
goto LABEL_604;
}
else
{
v354 = v352 + 1;
if ( v352 + 1 > v351 )
goto LABEL_604;
}
v352 = (v351 + v354) >> 1;
v353 = *(_DWORD *)(*(_DWORD *)(world.items.all.start + 4 * v352) + 20);
if ( v348 == v353 )
break;
if ( v354 == v351 )
goto LABEL_604;
}
v523 = *(_DWORD *)(world.items.all.start + 4 * v352);
}
if ( v523 )
{
sub_85D1880(v523, &item_x, &item_y, &item_z);
if ( (unsigned __int8)sub_88D67E0(unit, item_x, item_y, item_z, 1) )
{
v511 = (*(int (__cdecl **)(int))(*(_DWORD *)v523 + 0x214))(v523);
insertIntoSortedVector(v348, unit + 12 * unit->military.cur_uniform + 276);
v358 = insertIntoSortedVector(v348, squad + 0xBC);
v359 = *(_DWORD *)(squad + 0xCC);
v360 = *(_DWORD *)(squad + 0xC8);
if ( v358 >= (*(_DWORD *)(squad + 0xCC) - v360) >> 2 )
{
if ( v359 == *(_DWORD *)(squad + 0xD0) )
{
sub_8052120(v561, *(_DWORD *)(squad + 0xCC), v573);
goto LABEL_620;
}
}
else
{
if ( v358 == -1 )
goto LABEL_620;
v361 = v360 + 4 * v358;
if ( v359 == *(_DWORD *)(squad + 0xD0) )
{
sub_8052120(v561, v361, v573);
goto LABEL_620;
}
if ( v359 != v361 )
{
v594 = *(_DWORD *)(unit + 0xA8);
sub_8053990(v561, v361, &v594);
goto LABEL_620;
}
}
if ( v359 )
*(_DWORD *)v359 = *(_DWORD *)(unit + 0xA8);
*(_DWORD *)(squad + 0xCC) = v359 + 4;
LABEL_620:
v533 -= v511;
if ( v533 <= 0 )
{
cur_uniform = unit->military.cur_uniform;
goto LABEL_46;
}
goto LABEL_604;
}
}
}
}
}
LABEL_604:
v474 -= 4;
v355 = v454-- - 1 < 0;
if ( v355 )
goto LABEL_609;
goto LABEL_605;
}
}
LABEL_609:
if ( v533 > 0 )
{
v554 -= 4;
v357 = v546-- - 1 < 0;
if ( v357 )
{
cur_uniform = unit->military.cur_uniform;
goto LABEL_46;
}
v339 = *(_DWORD *)(squad + 0x98);
v340 = v554;
continue;
}
break;
}
}
else if (cur_uniform == 3 && position->quiver != -1)
{
cur_uniform = unit->military.cur_uniform;
LABEL_46:
if ( cur_uniform != 3 )
{
LABEL_47:
v515 = &item_x;
goto LABEL_48;
}
if ( *(_DWORD *)(position + 0xA8) == 0xFFFFFFFF )
{
v515 = &item_x;
goto LABEL_48;
}
v273 = unit->inventory.start;
v274 = ((unit->inventory.end - v273) >> 2) - 1;
v508 = v274;
if ( v274 < 0 )
{
v532 = 25;
goto LABEL_509;
}
v275 = 4 * v274;
v276 = squad + 0xBC;
v521 = v275;
v532 = 25;
v576 = squad + 0xBC;
v570 = unit + 0xA8;
v574 = squad + 0xC8;
while ( 2 )
{
if ( (unsigned __int16)(****(int (__fastcall *****)(_DWORD))(v273 + v275))(v276) != 61
|| (v276 = v521,
v280 = **(_DWORD **)(unit->inventory.start + v521),
v471 = **(_DWORD **)(unit->inventory.start + v521),
v281 = *(_DWORD *)(v280 + 0x28),
v278 = *(_DWORD *)(v280 + 0x24),
v279 = ((v281 - v278) >> 2) - 1,
v451 = v279,
v279 < 0) )
goto LABEL_478;
v282 = 4 * v279;
while ( 2 )
{
if ( (*(int (__cdecl **)(_DWORD))(**(_DWORD **)(v278 + v282) + 8))(*(_DWORD *)(v278 + v282)) != 10
|| (v284 = (*(int (__cdecl **)(_DWORD))(**(_DWORD **)(*(_DWORD *)(v471 + 0x24) + v282) + 12))(*(_DWORD *)(*(_DWORD *)(v471 + 0x24) + v282)),
v488 = v284,
!v284)
|| (unsigned __int16)(**(int (__cdecl ***)(_DWORD))v284)(v284) != 38
|| (v286 = (*(int (__cdecl **)(int))(*(_DWORD *)v488 + 0x214))(v488),
v276 = *(_DWORD *)(squad + 0x98),
v532 -= v286,
v285 = ((*(_DWORD *)(squad + 156) - v276) >> 2) - 1,
v285 < 0) )
goto LABEL_483;
v287 = 4 * v285;
v551 = v282;
v559 = squad;
v565 = unit;
while ( 2 )
{
v288 = *(_DWORD *)(v276 + v287);
if ( !(*(_BYTE *)(v288 + 16) & 2)
|| (v289 = *(_DWORD *)(v288 + 20),
v537 = *(_DWORD *)(v488 + 20),
v290 = (*(_DWORD *)(v288 + 24) - v289) >> 2,
!v290)
|| v537 == -1
|| (v291 = v290 - 1, v291 < 0) )
{
LABEL_490:
v287 -= 4;
--v285;
if ( v285 < 0 )
{
v282 = v551;
squad = v559;
unit = v565;
goto LABEL_483;
}
continue;
}
break;
}
v292 = v291 >> 1;
v293 = *(_DWORD *)(v289 + 4 * (v291 >> 1));
if ( v537 != v293 )
{
v543 = 0;
do
{
if ( v537 < v293 )
v291 = v292 - 1;
else
v543 = v292 + 1;
if ( v543 > v291 )
goto LABEL_490;
v292 = (v291 + v543) >> 1;
v293 = *(_DWORD *)(v289 + 4 * v292);
}
while ( v537 != v293 );
}
squad = v559;
v282 = v551;
unit = v565;
v295 = *(_DWORD *)(v559 + 0xBC);
v294 = (*(_DWORD *)(v559 + 0xC0) - v295) >> 2;
if ( v294 )
{
v412 = v294 - 1;
v411 = 0;
v562 = v551;
v556 = v295;
while ( 1 )
{
if ( v411 > v412 )
{
v282 = v562;
goto LABEL_504;
}
v413 = (v412 + v411) >> 1;
v276 = *(_DWORD *)(v488 + 20);
if ( *(_DWORD *)(v556 + 4 * v413) == v537 )
break;
if ( *(_DWORD *)(v556 + 4 * v413) > v537 )
v412 = v413 - 1;
else
v411 = v413 + 1;
}
v282 = v562;
if ( *(_DWORD *)(*(_DWORD *)(squad + 0xC8) + 4 * v413) == *(_DWORD *)(v565 + 0xA8) )
insertIntoSortedVector(v537, v565 + 12 * *(_WORD *)(v565 + 0x110) + 0x114);
}
else
{
LABEL_504:
insertIntoSortedVector(v537, v565 + 12 * *(_WORD *)(v565 + 0x110) + 0x114);
v296 = insertIntoSortedVector(*(_DWORD *)(v488 + 0x14), v576);
if ( v296 >= (*(_DWORD *)(squad + 0xCC) - *(_DWORD *)(squad + 0xC8)) >> 2 )
{
sub_80E86D0(v574, v570);
}
else
{
if ( v296 != -1 )
sub_81374F0(v574, v296, v570);
}
}
LABEL_483:
v282 -= 4;
v283 = v451-- - 1 < 0;
if ( !v283 )
{
v278 = *(_DWORD *)(v471 + 0x24);
continue;
}
break;
}
LABEL_478:
v521 -= 4;
v277 = v508-- - 1 < 0;
if ( !v277 )
{
v273 = unit->inventory.start;
v275 = v521;
continue;
}
break;
}
if ( v532 <= 0 )
{
v515 = &item_x;
}
else
{
LABEL_509:
v297 = *(_DWORD *)(squad + 0x98);
v544 = ((*(_DWORD *)(squad + 0x9C) - v297) >> 2) - 1;
if ( v544 >= 0 )
{
v515 = &item_x;
v552 = 4 * v544;
v566 = squad + 0xC8;
v571 = unit + 0xA8;
while ( 1 )
{
v298 = *(_DWORD *)(v297 + v552);
v489 = v298;
if ( *(_BYTE *)(v298 + 16) & 2 )
{
v301 = v298;
v299 = *(_DWORD *)(v298 + 20);
v300 = ((*(_DWORD *)(v301 + 24) - v299) >> 2) - 1;
v452 = v300;
if ( v300 >= 0 )
break;
}
LABEL_535:
if ( v532 <= 0 || (v552 -= 4, v314 = v544 - 1 < 0, --v544, v314) )
goto LABEL_48;
v297 = *(_DWORD *)(squad + 0x98);
}
v472 = 4 * v300;
v302 = 4 * v300;
while ( 2 )
{
v304 = *(_DWORD *)(squad + 0xBC);
v303 = *(_DWORD *)(squad + 0xC0);
v305 = *(_DWORD *)(v299 + v302);
if ( v304 < v303 )
{
v306 = *(_DWORD *)(squad + 0xBC);
if ( v305 == *(_DWORD *)v304 )
{
v307 = 0;
LABEL_533:
if ( *(_DWORD *)(*(_DWORD *)(squad + 0xC8) + 4 * v307) != *(_DWORD *)(unit + 0xA8) )
{
v472 -= 4;
v313 = v452-- - 1 < 0;
if ( v313 )
goto LABEL_535;
goto LABEL_531;
}
}
else
{
while ( 1 )
{
v306 += 4;
if ( v303 <= v306 )
break;
if ( v305 == *(_DWORD *)v306 )
{
v307 = (signed int)(v306 - v304) >> 2;
if ( v307 == -1 )
break;
goto LABEL_533;
}
}
}
}
if ( (world.items.all.end - world.items.all.start) >> 2 )
{
if ( v305 != -1 )
{
v308 = ((world.items.all.end - world.items.all.start) >> 2) - 1;
if ( v308 >= 0 )
{
v309 = v308 >> 1;
v310 = *(_DWORD *)(*(_DWORD *)(world.items.all.start + 4 * (v308 >> 1)) + 20);
v538 = *(_DWORD *)(world.items.all.start + 4 * (v308 >> 1));
if ( v305 == v310 )
goto LABEL_539;
if ( (world.items.all.end - world.items.all.start) >> 2 != 1 )
{
v311 = 0;
while ( 1 )
{
if ( v305 < v310 )
{
v308 = v309 - 1;
if ( v311 > v309 - 1 )
goto LABEL_530;
}
else
{
v311 = v309 + 1;
if ( v309 + 1 > v308 )
goto LABEL_530;
}
v309 = (v308 + v311) >> 1;
v310 = *(_DWORD *)(*(_DWORD *)(world.items.all.start + 4 * v309) + 20);
if ( v305 == v310 )
break;
if ( v311 == v308 )
goto LABEL_530;
}
v538 = *(_DWORD *)(world.items.all.start + 4 * v309);
LABEL_539:
if ( v538 )
{
sub_85D1880(v538, &item_z, &item_y, &item_x);
if ( (unsigned __int8)sub_88D67E0(unit, item_z, item_y, item_x, 1) )
{
v509 = (*(int (__cdecl **)(int))(*(_DWORD *)v538 + 0x214))(v538);
insertIntoSortedVector(v305, unit + 12 * unit->military.cur_uniform + 0x114);
v315 = insertIntoSortedVector(v305, squad + 0xBC);
v316 = *(_DWORD *)(squad + 0xCC);
v317 = *(_DWORD *)(squad + 0xC8);
if ( v315 >= (*(_DWORD *)(squad + 0xCC) - v317) >> 2 )
{
if ( v316 == *(_DWORD *)(squad + 0xD0) )
{
sub_8052120(v566, *(_DWORD *)(squad + 0xCC), v571);
goto LABEL_546;
}
goto LABEL_548;
}
if ( v315 != -1 )
{
v318 = v317 + 4 * v315;
if ( v316 == *(_DWORD *)(squad + 0xD0) )
{
sub_8052120(v566, v318, v571);
goto LABEL_546;
}
if ( v316 != v318 )
{
v594 = *(_DWORD *)(unit + 0xA8);
sub_8053990(v566, v318, &v594);
goto LABEL_546;
}
LABEL_548:
if ( v316 )
*(_DWORD *)v316 = *(_DWORD *)(unit + 0xA8);
*(_DWORD *)(squad + 0xCC) = v316 + 4;
}
LABEL_546:
v532 -= v509;
if ( v532 <= 0 )
goto LABEL_48;
}
}
}
}
}
}
LABEL_530:
v472 -= 4;
v312 = v452-- - 1 < 0;
if ( v312 )
goto LABEL_535;
LABEL_531:
v302 = v472;
v299 = *(_DWORD *)(v489 + 20);
continue;
}
}
v515 = &item_x;
}
}
LABEL_48:
if ( shaped_set.start )
operator delete(shaped_set.start);
if ( size_accum.start )
{
operator delete(size_accum.start);
cur_uniform = unit->military.cur_uniform;
}
else
{
LABEL_262:
cur_uniform = unit->military.cur_uniform;
}
DONE:
// scan current inventory
v36 = *(_DWORD *)(unit->military.uniform_pending);
v581 = 0;
in_inventory_vec = 0;
in_inventory_vec.end = 0;
*(_DWORD *)(unit->military.uniform_pending.end) = v36;
unit->military.uniform_pending.clear();
unit->military.uniform_alien.clear();
cur_uniform_start = *(_DWORD *)(unit + 12 * cur_uniform + 0x114);
cur_uniform_end = *(_DWORD *)(unit + 12 * cur_uniform + 0x118);
in_inventory_vec.resize((cur_uniform_end - cur_uniform_start) >> 2);
v37 = in_inventory_vec.end;
v38 = in_inventory_vec;
v439 = in_inventory_vec.end - (_DWORD)in_inventory_vec;
if (!in_inventory_vec.empty())
memset(in_inventory_vec.start, 0, in_inventory_vec.size());
for (i = unit->inventory.size()-1; i >= 0; i--)
{
inv_item = unit->inventory[i];
inv_mode = inv_item->mode;
if (inv_mode == 6 || !inv_item->mode || inv_mode == 9)
continue;
if (inv_item->item->vtable<0>() == 81 && inv_item->mode == 2) // splint
continue;
if ( inv_item->item->vtable<0>() == 57 && inv_item->mode == 5 // cloth
|| inv_item->item->vtable<0>() == 82 && inv_item->mode == 1 // crutch
|| inv_item->item->vtable<0>() == 84 && inv_item->mode == 5 ) // cast
continue;
if (inv_item->item->vtable<0>() == 61) // quiver
{
for (int j = inv_item->item->refs.size()-1; j >= 0; j--)
{
if (inv_item->item->refs[j]->vtable<8>() != 10)
continue;
item *ammo = inv_item->item->refs[j]->vtable<0xc>();
if (ammo && ammo->vtable<0>() == 38) { // ammo
if (binsearch(unit->military.uniforms[cur_uniform], ammo->id, &idx))
in_inventory_vec[idx] = 1;
}
}
}
if (binsearch(unit->military.uniforms[cur_uniform], inv_info->item->id, &idx))
in_inventory_vec[idx] = 1;
else
insertIntoSortedVector(inv_info->item->id, unit->military.uniform_alien);
}
// Build the pending list
if ( v439 <= 0 )
{
in_inventory_vec = in_inventory_vec;
}
else
{
in_inventory_vec = in_inventory_vec;
v59 = 0;
do
{
if ( !*((_BYTE *)in_inventory_vec + v59) )
{
v60 = *(_DWORD *)(unit->military.uniform_pending.end);
if ( v60 == *(_DWORD *)(unit->military.uniform_pending.limit) )
{
needs_pickup_id_vec = *(_DWORD *)(unit + 12 * unit->military.cur_uniform + 0x114);
sub_8052120(unit->military.uniform_pending, v60, needs_pickup_id_vec + 4 * v59);
in_inventory_vec = in_inventory_vec;
}
else
{
if ( v60 )
*(_DWORD *)v60 = *(_DWORD *)(needs_pickup_id_vec + 4 * v59);
*(_DWORD *)(unit->military.uniform_pending.end) = v60 + 4;
}
}
++v59;
}
while ( v59 < v439 );
}
unit->military.pickup_equipment_bit &= 0xFFFFFFFEu;
if ( in_inventory_vec )
operator delete(in_inventory_vec);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment