- 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);
- }