home *** CD-ROM | disk | FTP | other *** search
/ WarCraft 2000 - Nuclear Epidemic / W2000.nrg / SOURCE.War2000 / stRecog.cpp < prev    next >
C/C++ Source or Header  |  1998-09-29  |  65KB  |  2,772 lines

  1. #include "ddini.h"
  2. #include "ResFile.h"
  3. #include "FastDraw.h"
  4. #include "mgraph.h"
  5. #include "mouse.h"
  6. #include "menu.h"
  7. #include "MapDiscr.h"
  8. #include "weaponID.h"
  9. #include <assert.h>
  10. extern int DHAPROB;
  11. extern int DRECLPROB;
  12. extern int DDIVPROB;
  13. extern int HANSWPROB;
  14. extern int HREQRADIUS;
  15. extern int CROWDMIN;
  16. extern int HCPROB;
  17. extern int CMC1;
  18. extern int CMC2;
  19. extern int CMC3;
  20. Weapon* WPLIST[1024];
  21. extern int NUCLUSE[4];
  22. extern Nation WEP;
  23. char* mbm[1024];
  24. int    nmbm=0;
  25. void NLine(FILE* f){
  26.     char tt[8];
  27.     int zz;
  28.     do{
  29.         zz=fscanf(f,"%lc",tt);\
  30.     }while(tt[0]!=10&&zz!=EOF);
  31. };
  32. void Errx(LPCSTR s)
  33. {
  34.     MessageBox(hwnd,s,"Nation loading failed...",MB_ICONWARNING|MB_OK);
  35.     assert(false);
  36. };
  37. int GetCIndex(char* s){
  38.     char gx[128];
  39.     if(!strcmp(s,"NUCLUSE"))
  40.         return 1;
  41.     sprintf(gx,"Unknown constant : %s",s);
  42.     Errx(gx);
  43.     return -1;
  44. };
  45. void GetMode(char* s,int* mode,int line){
  46.     char gx[128];
  47.     if(!strcmp(s,"[MEMBERS]")){
  48.         *mode=1;
  49.         return;
  50.     };
  51.     if(!strcmp(s,"[REFERENCE]")){
  52.         *mode=2;
  53.         return;
  54.     };
  55.     if(!strcmp(s,"[WEAPON]")){
  56.         *mode=3;
  57.         return;
  58.     };
  59.     if(!strcmp(s,"[BUILDINGS]")){
  60.         *mode=4;
  61.         return;
  62.     };
  63.     if(!strcmp(s,"[PRODUCE]")){
  64.         *mode=5;
  65.         return;
  66.     };
  67.     if(!strcmp(s,"[MORERES]")){
  68.         *mode=6;
  69.         return;
  70.     };
  71.     if(!strcmp(s,"[UPGRADE]")){
  72.         *mode=7;
  73.         return;
  74.     };
  75.     if(!strcmp(s,"[UPGRADESTART]")){
  76.         *mode=8;
  77.         return;
  78.     };
  79.     if(!strcmp(s,"[UPGRADELINKS]")){
  80.         *mode=9;
  81.         return;
  82.     };
  83.     if(!strcmp(s,"[DELAYTIME]")){
  84.         *mode=10;
  85.         return;
  86.     };
  87.     if(!strcmp(s,"[WEAPONCENTER]")){
  88.         *mode=11;
  89.         return;
  90.     };
  91.     if(!strcmp(s,"[CHILDWEAPON]")){
  92.         *mode=12;
  93.         return;
  94.     };
  95.     if(!strcmp(s,"[NUCLI]")){
  96.         *mode=13;
  97.         return;
  98.     };
  99.     if(!strcmp(s,"[CONSTANT]")){
  100.         *mode=14;
  101.         return;
  102.     };
  103.     if(!strcmp(s,"[CHILDMONSTER]")){
  104.         *mode=15;
  105.         return;
  106.     };
  107.     if(!strcmp(s,"[VISIBILITY]")){
  108.         *mode=16;
  109.         return;
  110.     };
  111.     if(!strcmp(s,"[LIGHTPOINTS]")){
  112.         *mode=17;
  113.         return;
  114.     };
  115.     if(!strcmp(s,"[DANGERZONE]")){
  116.         *mode=18;
  117.         return;
  118.     };
  119.     if(!strcmp(s,"[NOSEARCHVICTIM]")){
  120.         *mode=19;
  121.         return;
  122.     };
  123.     if(!strcmp(s,"[NOANSWER]")){
  124.         *mode=20;
  125.         return;
  126.     };
  127.     if(!strcmp(s,"[NEEDNOHELP]")){
  128.         *mode=21;
  129.         return;
  130.     };
  131.     if(!strcmp(s,"[LIFESHOTLOST]")){
  132.         *mode=22;
  133.         return;
  134.     };
  135.     if(!strcmp(s,"[ONWATER]")){
  136.         *mode=24;
  137.         return;
  138.     };
  139.     if(!strcmp(s,"[ONCOST]")){
  140.         *mode=25;
  141.         return;
  142.     };
  143.     if(!strcmp(s,"[ONOIL]")){
  144.         *mode=26;
  145.         return;
  146.     };
  147.     if(!strcmp(s,"[CANBUILD]")){
  148.         *mode=27;
  149.         return;
  150.     };
  151.     if(!strcmp(s,"[USEFUL_FOR_DEFENSE]")){
  152.         *mode=28;
  153.         return;
  154.     };
  155.     if(!strcmp(s,"[USEFUL_FOR_ATTACK]")){
  156.         *mode=29;
  157.         return;
  158.     };
  159.     if(!strcmp(s,"[USEFUL_FOR_SCIENCE]")){
  160.         *mode=30;
  161.         return;
  162.     };
  163.     if(!strcmp(s,"[USEFUL_FOR_NARXOZ]")){
  164.         *mode=31;
  165.         return;
  166.     };
  167.     if(!strcmp(s,"[ABSOLUTELYNEED]")){
  168.         *mode=32;
  169.         return;
  170.     };
  171.     if(!strcmp(s,"[BRANCHPERCENT]")){
  172.         *mode=33;
  173.         return;
  174.     };
  175.     if(!strcmp(s,"[AICOEFFICIENTS]")){
  176.         *mode=34;
  177.         return;
  178.     };
  179.     if(!strcmp(s,"[MAXAUTOAMOUNT]")){
  180.         *mode=35;
  181.         return;
  182.     };
  183.     if(!strcmp(s,"[WARRIORS]")){
  184.         *mode=36;
  185.         return;
  186.     };
  187.     if(!strcmp(s,"[AIR]")){
  188.         *mode=37;
  189.         return;
  190.     };
  191.     if(!strcmp(s,"[WEAPONCENTER8]")){
  192.         *mode=38;
  193.         return;
  194.     };
  195.     if(!strcmp(s,"[TELEPORT]")){
  196.         *mode=39;
  197.         return;
  198.     };
  199.     if(!strcmp(s,"[ENABLED]")){
  200.         *mode=40;
  201.         return;
  202.     };
  203.     if(!strcmp(s,"[AUTO_PERFORM_UPGRADE]")){
  204.         *mode=41;
  205.         return;
  206.     };
  207.     if(!strcmp(s,"[ICONS]")){
  208.         *mode=42;
  209.         return;
  210.     };
  211.     if(!strcmp(s,"[UNITS_INTERFACE]")){
  212.         *mode=43;
  213.         return;
  214.     };
  215.     if(!strcmp(s,"[MOREWEAPON]")){
  216.         *mode=44;
  217.         return;
  218.     };
  219.     if(!strcmp(s,"[IDWEAPON]")){
  220.         *mode=45;
  221.         return;
  222.     };
  223.     if(!strcmp(s,"[TRANSPORT]")){
  224.         *mode=46;
  225.         return;
  226.     };
  227.     if(!strcmp(s,"[COMMONMENU]")){
  228.         *mode=47;
  229.         return;
  230.     };
  231.     if(!strcmp(s,"[FUNCTIONALITY]")){
  232.         *mode=48;
  233.         return;
  234.     };
  235.     if(!strcmp(s,"[MAGICREQUEST]")){
  236.         *mode=49;
  237.         return;
  238.     };
  239.     if(!strcmp(s,"[ACCESSCONTROL]")){
  240.         *mode=50;
  241.         return;
  242.     };
  243.     if(!strcmp(s,"[MAGICCONTROL]")){
  244.         *mode=51;
  245.         return;
  246.     };
  247.     if(!strcmp(s,"[RESOURCEABSORBERS]")){
  248.         *mode=52;
  249.         return;
  250.     };
  251.     if(!strcmp(s,"[CANFLYUP]")){
  252.         *mode=53;
  253.         return;
  254.     };
  255.     if(!strcmp(s,"[WALLKILLER]")){
  256.         *mode=54;
  257.         return;
  258.     };
  259.     if(!strcmp(s,"[FEAR]")){
  260.         *mode=55;
  261.         return;
  262.     };
  263.     if(!strcmp(s,"[USEMAGIC]")){
  264.         *mode=56;
  265.         return;
  266.     };
  267.     if(!strcmp(s,"[NUCLEAR]")){
  268.         *mode=57;
  269.         return;
  270.     };
  271.     if(!strcmp(s,"[ANTINUCLEAR]")){
  272.         *mode=58;
  273.         return;
  274.     };
  275.     if(!strcmp(s,"[UFO]")){
  276.         *mode=59;
  277.         return;
  278.     };
  279.     if(!strcmp(s,"[UFOTRANSFORM]")){
  280.         *mode=60;
  281.         return;
  282.     };
  283.     if(!strcmp(s,"[MAGACTOR]")){
  284.         *mode=61;
  285.         return;
  286.     };
  287.     if(!strcmp(s,"[ON_HIT_SOUND]")){
  288.         *mode=62;
  289.         return;
  290.     };
  291.     if(!strcmp(s,"[ON_CLICK_SOUND]")){
  292.         *mode=63;
  293.         return;
  294.     };
  295.     if(!strcmp(s,"[SOUND]")){
  296.         *mode=64;
  297.         return;
  298.     };
  299.     if(!strcmp(s,"[ON_ORDER_SOUND]")){
  300.         *mode=65;
  301.         return;
  302.     };
  303.     if(!strcmp(s,"[ON_ATTACK_SOUND]")){
  304.         *mode=66;
  305.         return;
  306.     };
  307.     if(!strcmp(s,"[ON_DEATH_SOUND]")){
  308.         *mode=67;
  309.         return;
  310.     };
  311.     if(!strcmp(s,"[ON_BORN_SOUND]")){
  312.         *mode=68;
  313.         return;
  314.     };
  315.     if(!strcmp(s,"[ON_TREE_SOUND]")){
  316.         *mode=69;
  317.         return;
  318.     };
  319.     if(!strcmp(s,"[ON_GOLD_SOUND]")){
  320.         *mode=70;
  321.         return;
  322.     };
  323.     if(!strcmp(s,"[SOUNDEFFECTS]")){
  324.         *mode=71;
  325.         return;
  326.     };
  327.     if(!strcmp(s,"[CANREPAIR]")){
  328.         *mode=72;
  329.         return;
  330.     };
  331.     if(!strcmp(s,"[CANSETDEST]")){
  332.         *mode=73;
  333.         return;
  334.     };
  335.     if(!strcmp(s,"[EXTMENU]")){
  336.         *mode=74;
  337.         return;
  338.     };
  339.     if(!strcmp(s,"[RESOURCEUPGRADE]")){
  340.         *mode=75;
  341.         return;
  342.     };
  343.     if(!strcmp(s,"[UNITLOCK]")){
  344.         *mode=76;
  345.         return;
  346.     };
  347.     if(!strcmp(s,"[END]")){
  348.         *mode=255;
  349.         return;
  350.     };
  351.     if(s[0]=='['){
  352.         sprintf(gx,"Unrecognised command in line %d",line);
  353.         Errx(gx);
  354.     };
  355. };
  356.  
  357. int SearchStr(char** Res,char* s,int count){
  358.     for(int i=0;i<count;i++)
  359.         if(!strcmp(Res[i],s))return i;
  360.     return -1;
  361. };
  362. extern char* SoundID[512];
  363. extern word NSounds;
  364. void LoadWeapon(){
  365.     char gg[128];
  366.     char gx[128],gx1[128],gx2[128],gx3[128];
  367.     char gy[128];
  368.     int    mode=0;
  369.     int line=0;
  370.     int wid=0;
  371.     int cam,zz1,zz2;
  372.     int mindam,maxdam;
  373.     memset(&WPLIST,0,sizeof WPLIST);
  374.     FILE* f=fopen("weapon.nds","rt");
  375.     if(!int(f)){
  376.         Errx("Could not find WEAPON.NDS");
  377.         return;
  378.     };
  379.     do{
  380.         if(fscanf(f,"%s",gg)==EOF){
  381.             Errx("No information found in WEAPON.NDS");
  382.         };
  383.         NLine(f);
  384.         line++;
  385.         if(gg[0]!='/'&&gg[0]!=' '&&gg[0]!=0)break;
  386.     }while(true);
  387.     WEP.CreateNation(gg,255,9);
  388.     int z=0;
  389.     do{
  390.         switch(mode){
  391.         case 0:
  392.             z=fscanf(f,"%s",gg);
  393.             NLine(f);
  394.             line++;
  395.             GetMode(gg,&mode,line);
  396.             break;
  397.         case 1:
  398.             //[MEMBERS]
  399.             z=fscanf(f,"%s",gg);
  400.             GetMode(gg,&mode,line);
  401.             if(mode==1)
  402.                 z=fscanf(f,"%d%d%d%d",&cam,&wid,&mindam,&maxdam);
  403.             NLine(f);
  404.             line++;
  405.             if(mode==1&&gg[0]!='/'&&gg[0]!=0){
  406.                 mbm[nmbm]=new char[strlen(gg)+1];
  407.                 strcpy(mbm[nmbm],gg);
  408.                 WEP.Mon[nmbm]->cpbMoving=cam&1;
  409.                 WPLIST[nmbm]=new Weapon;
  410.                 WPLIST[nmbm]->CreateWeapon(&WEP,nmbm,wid,0);
  411.                 WPLIST[nmbm]->MinDamage=mindam;
  412.                 WPLIST[nmbm]->MaxDamage=maxdam;
  413.                 WPLIST[nmbm]->Transparent=cam&(2+4);
  414.                 WPLIST[nmbm]->SoundID=-1;
  415.                 nmbm++;
  416.             };
  417.             break;
  418.         case 2:
  419.             //[REFERENCE]
  420.             z=fscanf(f,"%s",gg);
  421.             GetMode(gg,&mode,line);
  422.             if(mode==2)
  423.                 z=fscanf(f,"%s",gx);
  424.             NLine(f);
  425.             line++;
  426.             if(mode==2&&gg[0]!='/'&&gg[0]!=0){
  427.                 int zz1=SearchStr(mbm,gg,nmbm);
  428.                 if(zz1==-1){
  429.                     sprintf(gy,"Identifier %s not found.",gg);
  430.                     Errx(gy);
  431.                 };
  432.                 int zz2=SearchStr(mbm,gx,nmbm);
  433.                 if(zz2==-1){
  434.                     sprintf(gy,"Identifier %s not found.",gx);
  435.                     Errx(gy);
  436.                 };
  437.                 WPLIST[zz1]->NextWeapon=WPLIST[zz2];
  438.             };
  439.             break;
  440.         case 12://[CHILDWEAPON]
  441.             z=fscanf(f,"%s",gg);
  442.             GetMode(gg,&mode,line);
  443.             if(mode==12)
  444.                 z=fscanf(f,"%s%d%d%d",gx,&wid,&mindam,&maxdam);
  445.             NLine(f);
  446.             line++;
  447.             if(mode==12&&gg[0]!='/'&&gg[0]!=0){
  448.                 zz1=SearchStr(mbm,gx,nmbm);
  449.                 if(zz1==-1){
  450.                     sprintf(gy,"%d (WEAPON.NDS) : Unknown parent weapon : %s",line,gx);
  451.                     Errx(gy);
  452.                 };
  453.  
  454.                 mbm[nmbm]=new char[strlen(gg)+1];
  455.                 strcpy(mbm[nmbm],gg);
  456.                 WPLIST[nmbm]=new Weapon;
  457.                 WPLIST[nmbm]->CreateWeapon(&WEP,zz1,wid,0);
  458.                 WPLIST[nmbm]->MinDamage=mindam;
  459.                 WPLIST[nmbm]->MaxDamage=maxdam;
  460.                 nmbm++;
  461.             };
  462.             break;
  463.         case 13://[NUCLI]
  464.             z=fscanf(f,"%s",gg);
  465.             GetMode(gg,&mode,line);
  466.             if(mode==13)
  467.                 z=fscanf(f,"%d%d%d",&wid,&mindam,&maxdam);
  468.             NLine(f);
  469.             line++;
  470.             if(mode==13&&gg[0]!='/'&&gg[0]!=0){
  471.                 mbm[nmbm]=new char[strlen(gg)+1];
  472.                 strcpy(mbm[nmbm],gg);
  473.                 WPLIST[nmbm]=new Weapon;
  474.                 WPLIST[nmbm]->CreateNWeapon(wid,mindam,maxdam);
  475.                 //WPLIST[nmbm]->MinDamage=mindam;
  476.                 //WPLIST[nmbm]->MaxDamage=maxdam;
  477.                 nmbm++;
  478.             };
  479.             break;
  480.         case 14://[CONSTANT]
  481.             z=fscanf(f,"%s",gg);
  482.             GetMode(gg,&mode,line);
  483.             if(mode==14)
  484.                 z=fscanf(f,"%s%s%s%s",gx,gx1,gx2,gx3);
  485.             NLine(f);
  486.             line++;
  487.             if(mode==14&&gg[0]!='/'&&gg[0]!=0){
  488.                 zz1=GetCIndex(gg);
  489.                 if(zz1==1){
  490.                     zz1=SearchStr(mbm,gx,nmbm);
  491.                     if(zz1==-1){
  492.                         sprintf(gy,"Illegal value for NUCLUSE : %s",gx);
  493.                         Errx(gy);
  494.                     };
  495.                     NUCLUSE[0]=zz1;
  496.                     zz1=SearchStr(mbm,gx1,nmbm);
  497.                     if(zz1==-1){
  498.                         sprintf(gy,"Illegal value for NUCLUSE : %s",gx1);
  499.                         Errx(gy);
  500.                     };
  501.                     NUCLUSE[1]=zz1;
  502.                     zz1=SearchStr(mbm,gx2,nmbm);
  503.                     if(zz1==-1){
  504.                         sprintf(gy,"Illegal value for NUCLUSE : %s",gx2);
  505.                         Errx(gy);
  506.                     };
  507.                     NUCLUSE[2]=zz1;
  508.                     zz1=SearchStr(mbm,gx3,nmbm);
  509.                     if(zz1==-1){
  510.                         sprintf(gy,"Illegal value for NUCLUSE : %s",gx);
  511.                         Errx(gy);
  512.                     };
  513.                     NUCLUSE[3]=zz1;
  514.                 };
  515.             };
  516.             break;
  517.         case 45://[IDWEAPON]
  518.             z=fscanf(f,"%s",gg);
  519.             GetMode(gg,&mode,line);
  520.             if(mode==45)
  521.                 z=fscanf(f,"%s",gx);
  522.             NLine(f);
  523.             line++;
  524.             if(mode==45&&gg[0]!='/'&&gg[0]!=0){
  525.                 int zz1=SearchStr(mbm,gx,nmbm);
  526.                 if(zz1==-1){
  527.                     sprintf(gy,"Identifier %s not found.",gg);
  528.                     Errx(gy);
  529.                 };
  530.                 if(!strcmp(gg,"ID_FIRE"))ID_FIRE=zz1;else
  531.                 if(!strcmp(gg,"ID_FIRE1"))ID_FIRE1=zz1;else
  532.                 if(!strcmp(gg,"ID_MAGW"))ID_MAGW=zz1;else
  533.                 if(!strcmp(gg,"ID_EXPL1"))ID_EXPL1=zz1;else
  534.                 if(!strcmp(gg,"ID_EXPL2"))ID_EXPL2=zz1;else
  535.                 if(!strcmp(gg,"ID_GLASSFLY"))ID_GLASSFLY=zz1;else
  536.                 if(!strcmp(gg,"ID_GLASSBROKEN"))ID_GLASSBROKEN=zz1;else
  537.                 if(!strcmp(gg,"ID_MAGEXP"))ID_MAGEXP=zz1;else
  538.                 if(!strcmp(gg,"ID_FOG"))ID_FOG=zz1;else
  539.                 if(!strcmp(gg,"ID_FOG1"))ID_FOG1=zz1;else
  540.                 if(!strcmp(gg,"ID_FIREX"))ID_FIREX=zz1;else{
  541.                     sprintf(gx,"[IDWEAPON] %d :Unknown constant: %s",line,gg);
  542.                     Errx(gx);
  543.                 };
  544.             };
  545.             break;
  546.         case 64://[SOUND}
  547.             z=fscanf(f,"%s",gg);
  548.             GetMode(gg,&mode,line);
  549.             if(mode==64)
  550.                 z=fscanf(f,"%s",gx);
  551.             NLine(f);
  552.             line++;
  553.             if(mode==64&&gg[0]!='/'&&gg[0]!=0){
  554.                 zz1=SearchStr(mbm,gg,nmbm);
  555.                 if(zz1==-1){
  556.                     sprintf(gy,"Unknown weapon ID: %s",gg);
  557.                     Errx(gy);
  558.                 };
  559.                 zz2=SearchStr(SoundID,gx,NSounds);
  560.                 if(zz2==-1){
  561.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  562.                     Errx(gy);
  563.                 };
  564.                 WPLIST[zz1]->SoundID=zz2;
  565.             };
  566.             break;
  567.         case 255:
  568.             z=EOF;
  569.             break;
  570.         };
  571.     }while(z!=EOF);
  572.     if(mode==0)Errx("[MEMBERS] not found in WEAPON.NDS");
  573. };
  574. void normstr(char* str){
  575.     for(int i=0;str[i]!=0;i++)if(str[i]=='_')str[i]=' ';
  576. };
  577. void InitFlags(GeneralObject* GO){
  578.     GO->OnAir=false;
  579.     GO->delay=8;
  580.     GO->wepX=0;
  581.     GO->wepY=0;
  582.     GO->VisRadius=10;
  583.     GO->VisSpots=3;
  584.     GO->SpotType=1;
  585.     GO->SpotSize=3;
  586.     GO->DangerZone=0;
  587.     GO->NoSearchVictim=false;
  588.     GO->NoAnswer=false;
  589.     GO->LifeShotLost=0;
  590.     GO->Enabled=false;
  591.     GO->OnWater=false;
  592.     GO->OnCost=false;
  593.     GO->OnOil=false;
  594.     GO->cpbBuild=false;
  595.     GO->Teleport=false;
  596.     GO->cpbMoving=true;
  597.     GO->capMagic=false;
  598.     GO->Submarine=false;
  599.     GO->UATT=false;
  600.     GO->SATT=false;
  601.     GO->WATT=false;
  602.     GO->AATT=false;
  603.     GO->P100=false;
  604.     GO->T3X3=false;
  605.     GO->WepSpeed=64;
  606.     GO->WepDelay=16;
  607.     GO->AGold=false;
  608.     GO->AWood=false;
  609.     for(int i=0;i<NBRANCH;i++){
  610.         GO->Useful[i]=0;
  611.         GO->SpUsef[i]=0;
  612.     };
  613.     GO->AbsNeedPrio=0;
  614.     GO->AbsNeedCount=0;
  615.     GO->MaxAutoAmount=2048;
  616.     GO->Warrior=true;
  617.     GO->NIcons=0;
  618.     GO->NWeap=0;
  619.     GO->Transport=false;
  620.     GO->FWEAP=false;
  621.     GO->RefreshLife=false;
  622.     GO->CanFly=false;
  623.     GO->CanAttWall=false;
  624.     GO->UseMagic=false;
  625.     GO->CanFear=false;
  626.     GO->NeedNoHelp=false;
  627.     GO->AntiNuc=false;
  628.     GO->canNucAttack=false;
  629.     GO->UFO=false;
  630.     GO->UFOTrans=false;
  631.     for(i=0;i<12;i++){
  632.         GO->MWeap[i]=NULL;
  633.         GO->SWPIndex[i]=255;
  634.     };
  635.     GO->MagAgainst=0;
  636.     GO->MagWith=0;
  637.     GO->HitSound=-1;
  638.     GO->ClickSound=-1;
  639.     GO->DeathSound=-1;
  640.     GO->OrderSound=-1;
  641.     GO->AttackSound=-1;
  642.     GO->TreeSound=-1;
  643.     GO->GoldSound=-1;
  644.     GO->BornSound=-1;
  645.     GO->CanRepair=false;
  646.     GO->ExtMenu=false;
  647.     GO->CanDest=false;
  648.     GO->LockID=0xFFFF;
  649.     GO->NLockUnits=0;
  650.     memset(GO->Wdx,0,8);
  651.     memset(GO->Wdy,0,8);
  652. };
  653. void LoadAI(char* fn,Nation* NT,char** Mon,word NMon,char** Upg,word NUpg);
  654. void LoadNation(char* fn,byte msk,byte NIndex){
  655.     char gg[128];
  656.     char gx[128];
  657.     char gy[128];
  658.     char gz[128],gg1[128];
  659.     char* mnm [1024];
  660.     int    nmnm=0;
  661.     char* upg [1024];
  662.     char* ico [1024];
  663.     int nico=0;
  664.     int nupg=0;
  665.     int    mode=0;
  666.     int line=0;
  667.     int wid=0;
  668.     int    zz1,knd;
  669.     int parm0,parm1,parm2,parm3,parm4,parm5,parm6;
  670.     int parm7,parm8,parm9,parm10,parm11;
  671.     int mindam,maxdam,gold;
  672.     FILE* f1=fopen(fn,"rt");
  673.     if(!int(f1)){
  674.         sprintf(gg,"Could not open %s",fn);
  675.         Errx(gg);
  676.         return;
  677.     };
  678.     do{
  679.         if(fscanf(f1,"%s",gg)==EOF){
  680.             sprintf(gg,"%s : No information found.",fn);
  681.             Errx(gg);
  682.         };
  683.         NLine(f1);
  684.         line++;
  685.         if(gg[0]!='/'&&gg[0]!=' '&&gg[0]!=0)break;
  686.     }while(true);
  687.     Nation* nat=&NATIONS[NIndex];
  688.     nat->MagicDelay=0;
  689.     nat->CreateNation(gg,msk,NIndex);
  690.     strcpy(nat->SCRIPT,fn);
  691.     nat->NNUM=NIndex;
  692.     nat->UPG.NUpgrades=0;
  693.     nat->DangerSound=-1;
  694.     nat->VictorySound=-1;
  695.     nat->ConstructSound=-1;
  696.     nat->BuildDieSound=-1;
  697.     nat->UnitDieSound=-1;
  698.     nat->LastAttackTime=0;
  699.     nat->MagicDelay=0;
  700.     int z=0;
  701.     do{
  702.         switch(mode){
  703.         case 0:
  704.             z=fscanf(f1,"%s",gg);
  705.             NLine(f1);
  706.             line++;
  707.             GetMode(gg,&mode,line);
  708.             break;
  709.         case 1:
  710.             //[MEMBERS]
  711.             z=fscanf(f1,"%s",gg);
  712.             GetMode(gg,&mode,line);
  713.             if(mode==1)
  714.                 z=fscanf(f1,"%s%d%d%d%d%d%d%d%d%d%d%d%d",gx,&parm0,&parm1,&parm2,&parm3,&parm4,&parm5,&parm6,&parm7,&parm8,&parm9,&parm10,&parm11);
  715.             NLine(f1);
  716.             line++;
  717.             GetMode(gg,&mode,line);
  718.             if(mode==1&&gg[0]!='/'&&gg[0]!=0){
  719.                 if(nmnm>=nat->NMon){
  720.                     sprintf(gy,"%s : Too many members.",fn);
  721.                     Errx(gy);
  722.                 };
  723.                 for(int j=1;j<4;j++){
  724.                     nat->Mon[nmnm]->ResourceID[j]=255;
  725.                     nat->Mon[nmnm]->ResAmount[j]=0;
  726.                 };
  727.                 InitFlags(nat->Mon[nmnm]);
  728.                 nat->Mon[nmnm]->Message=new char[strlen(gx)+1];
  729.                 normstr(gx);
  730.                 strcpy(nat->Mon[nmnm]->Message,gx);
  731.                 nat->Mon[nmnm]->NStages=parm4;
  732.                 nat->Mon[nmnm]->cost=parm5;
  733.                 nat->Mon[nmnm]->Kind=parm0;
  734.                 nat->Mon[nmnm]->cpbBase=false;
  735.                 nat->Mon[nmnm]->cpbFarm=false;
  736.                 nat->Mon[nmnm]->ResourceID[0]=1;
  737.                 nat->Mon[nmnm]->ResAmount[0]=parm5;
  738.                 if(parm6){
  739.                     nat->Mon[nmnm]->ResourceID[1]=2;
  740.                     nat->Mon[nmnm]->ResAmount[1]=parm6;
  741.                 };
  742.                 if(parm7){
  743.                     nat->Mon[nmnm]->ResourceID[2]=3;
  744.                     nat->Mon[nmnm]->ResAmount[2]=parm7;
  745.                 };
  746.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MinDamage=parm11;
  747.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxDamage=parm10;
  748.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxLife=parm2;
  749.                 nat->Mon[nmnm]->capMagic=parm3;
  750.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.AttackRange=parm8;
  751.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxShield=parm9;
  752.                 nat->Mon[nmnm]->VisRadius=parm8;
  753.                 nat->Mon[nmnm]->SpotSize=parm1;
  754.                 nat->Mon[nmnm]->SpotType=1;
  755.                 if(parm1>2){
  756.                     nat->Mon[nmnm]->SpotType=2;
  757.                 };
  758.                 mnm[nmnm]=new char[strlen(gg)+1];
  759.                 strcpy(mnm[nmnm],gg);
  760.                 nmnm++;
  761.             };
  762.             break;
  763.         case 2:
  764.             //[REFERENCE]
  765.             sprintf(gg,"%s : Unexpected section [REFERENCE]",gg);
  766.             Errx(gg);
  767.             break;
  768.         case 3:
  769.             //[WEAPON]
  770.             z=fscanf(f1,"%s",gg);
  771.             GetMode(gg,&mode,line);
  772.             if(mode==3)z=fscanf(f1,"%d%d%s%s",&parm1,&parm2,gz,gx);
  773.             NLine(f1);
  774.             line++;
  775.             if(mode==3){
  776.                 if(gg[0]!='/'&&gg[0]!=0){
  777.                     int zz1=SearchStr(mnm,gg,nmnm);
  778.                     if(zz1==-1){
  779.                         sprintf(gy,"%s : Identifier %s not found.",fn,gg);
  780.                         Errx(gy);
  781.                     };
  782.                     int zz2=SearchStr(mbm,gx,nmbm);
  783.                     if(zz2==-1){
  784.                         sprintf(gy,"%s : Identifier %s not found.",fn,gy);
  785.                         Errx(gy);
  786.                     };
  787.                     GeneralObject* GO=nat->Mon[zz1];
  788.                     if(strchr(gz,'S'))GO->SATT=true;
  789.                     if(strchr(gz,'U'))GO->UATT=true;
  790.                     if(strchr(gz,'W'))GO->WATT=true;
  791.                     if(strchr(gz,'A'))GO->AATT=true;
  792.                     if(strchr(gz,'P'))GO->P100=true;
  793.                     if(strchr(gz,'T'))GO->T3X3=true;
  794.                     if(strchr(gz,'F'))GO->FWEAP=true;
  795.                     GO->WepSpeed=parm1;
  796.                     GO->WepDelay=parm2;
  797.                     nat->AssignWeapon(WPLIST[zz2],zz1);
  798.                 };
  799.             };
  800.             break;
  801.         case 4:
  802.             //[BUILDINGS]
  803.             z=fscanf(f1,"%s",gg);
  804.             NLine(f1);
  805.             GetMode(gg,&mode,line);
  806.             line++;
  807.             if(gg[0]=='/'||gg[0]==0)break;
  808.             if(mode==4){
  809.                 int zz1=SearchStr(mnm,gg,nmnm);
  810.                 if(zz1==-1){
  811.                     sprintf(gy,"%s : Undefined identifier %s at line %d",fn,gg,line);
  812.                     Errx(gy);
  813.                 };
  814.                 nat->Mon[zz1]->cpbBuilding=true;
  815.                 nat->Mon[zz1]->cpbMoving=false;
  816.                 if(!strcmp(gg,"TOWN"))
  817.                     nat->Mon[zz1]->cpbBase=true;
  818.                 if(!strcmp(gg,"FARM"))
  819.                     nat->Mon[zz1]->cpbFarm=true;
  820.         };
  821.             break;
  822.         case 5:
  823.             //[PRODUCE]
  824.             z=fscanf(f1,"%s",gg);
  825.             GetMode(gg,&mode,line);
  826.             if(gg[0]=='/'||gg[0]==0){
  827.                 NLine(f1);
  828.                 line++;
  829.                 break;
  830.             };
  831.             if(mode==5)
  832.                 z=fscanf(f1,"%d",&wid);
  833.             NLine(f1);
  834.             line++;
  835.             if(mode==5){
  836.                 int zz1=SearchStr(mnm,gg,nmnm);
  837.                 if(zz1==-1){
  838.                     sprintf(gy,"%s : Undefined identifier %s at line %d",fn,gg,line);
  839.                     Errx(gy);
  840.                 };
  841.                 nat->PACount[zz1]=wid;
  842.                 nat->PAble[zz1]=new word[wid];
  843.                 for(int j=0;j<wid;j++){
  844.                     z=fscanf(f1,"%s",gg);
  845.                     int    zz2=SearchStr(mnm,gg,nmnm);
  846.                     if(zz2==-1){
  847.                         sprintf(gy,"%s : Undefined identifier %s at line %d",fn,gg,line);
  848.                         Errx(gy);
  849.                     };
  850.                     nat->PAble[zz1][j]=zz2;
  851.                     line++;
  852.                 };
  853.             };
  854.             break;
  855.         case 6://MORERES
  856.             z=fscanf(f1,"%s",gg);
  857.             GetMode(gg,&mode,line);
  858.             line++;
  859.             if(gg[0]=='/'||gg[0]==0){
  860.                 NLine(f1);
  861.                 break;
  862.             };
  863.             if(mode==6){
  864.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  865.                 NLine(f1);
  866.                 int zz1=SearchStr(mnm,gg,nmnm);
  867.                 if(zz1==-1){
  868.                     sprintf(gy,"%s : Undefined identifier %s at line %d",fn,gg,line);
  869.                     Errx(gy);
  870.                 };
  871.                 for(int op=1;op<4&&nat->Mon[zz1]->ResourceID[0]==255;op++);
  872.                 nat->Mon[zz1]->ResourceID[op]=parm1;
  873.                 nat->Mon[zz1]->ResAmount[op]=parm2;
  874.             };
  875.             break;
  876.         case 7://UPGRADE
  877.             z=fscanf(f1,"%s",gg);
  878.             GetMode(gg,&mode,line);
  879.             line++;
  880.             if(gg[0]=='/'||gg[0]==0){
  881.                 NLine(f1);    
  882.                 break;
  883.             };
  884.             if(mode==7){
  885.                 z=fscanf(f1,"%s%d%d%d%d%d%d%d%s",gz,&parm1,&parm2,&parm3,&parm4,&parm5,&parm6,&wid,gy);
  886.                 //NLine(f1);
  887.                 zz1=SearchStr(upg,gg,nupg);
  888.                 if(zz1!=-1){
  889.                     sprintf(gx,"( %s ) %d : Duplicate identifier: %s",fn,line,gg);
  890.                     Errx(gx);
  891.                 };
  892.                 upg[nupg]=new char[strlen(gg)+1];
  893.                 strcpy(upg[nupg],gg);
  894.                 switch(wid){
  895.                 case 1:
  896.                     nat->UPG.utp1[nupg]=new UTP1;
  897.                     z=fscanf(f1,"%d%d",&parm5,&parm6);
  898.                     nat->UPG.utp1[nupg]->ResType=byte(parm5);
  899.                     nat->UPG.utp1[nupg]->AddVal=byte(parm6);
  900.                     nat->UPG.utp1[nupg]->OneTime=true;
  901.                     break;
  902.                 case 2:
  903.                     nat->UPG.utp2[nupg]=new UTP2;
  904.                     z=fscanf(f1,"%s%d%d",gx,&parm5,&parm6);
  905.                     zz1=SearchStr(mnm,gx,nmnm);
  906.                     if(zz1==-1){
  907.                         sprintf(gz,"( %s ) %d :Unknown identifier : %s",fn,line,gx);
  908.                         Errx(gz);
  909.                     };
  910.                     nat->UPG.utp2[nupg]->MID=zz1;
  911.                     nat->UPG.utp2[nupg]->CharID=parm5;
  912.                     nat->UPG.utp2[nupg]->AddVal=parm6;
  913.                     nat->UPG.utp1[nupg]->OneTime=true;
  914.                     break;
  915.                 case 3:
  916.                     nat->UPG.utp3[nupg]=new UTP3;
  917.                     z=fscanf(f1,"%s",gx);
  918.                     zz1=SearchStr(mnm,gx,nmnm);
  919.                     if(zz1==-1){
  920.                         sprintf(gz,"( %s ) %d :Unknown identifier : %s",fn,line,gx);
  921.                         Errx(gz);
  922.                     };
  923.                     nat->UPG.utp3[nupg]->FinalMID=zz1;
  924.                     nat->UPG.utp1[nupg]->OneTime=false;
  925.                     break;
  926.                 case 4://Enable strange weapon
  927.                     nat->UPG.utp3[nupg]=new UTP3;
  928.                     z=fscanf(f1,"%d",&parm5);
  929.                     nat->UPG.utp3[nupg]->FinalMID=parm5;
  930.                     nat->UPG.utp1[nupg]->OneTime=true;
  931.                     break;
  932.                 default:
  933.                     sprintf(gx,"( %s ) %d :Unknuwn upgrade type.",fn,line);
  934.                     Errx(gx);
  935.                 };
  936.                 zz1=SearchStr(mnm,gz,nmnm);
  937.                 if(zz1==-1){
  938.                     sprintf(gx,"( %s ) %d :Undeclared identifier : %s",fn,line,gz);
  939.                     Errx(gx);
  940.                 };
  941.                 nat->UPG.NUpgrades++;
  942.                 nat->UPG.utp[nupg]->MonsterID=zz1;
  943.                 nat->UPG.utp[nupg]->IFileID=parm1;
  944.                 nat->UPG.utp[nupg]->IFIndex=parm2;
  945.                 nat->UPG.utp[nupg]->Time=parm3;
  946.                 nat->UPG.utp[nupg]->Cost=parm4;
  947.                 nat->UPG.utp[nupg]->Wood=parm5;
  948.                 nat->UPG.utp[nupg]->Oil=parm6;
  949.                 nat->UPG.utp[nupg]->Enabled=false;
  950.                 nat->UPG.utp[nupg]->Stage=0;
  951.                 nat->UPG.utp[nupg]->Message=new char[strlen(gy)+1];
  952.                 nat->UPG.utp[nupg]->NLinks=0;
  953.                 nat->UPG.utp[nupg]->NAuto=0;
  954.                 nat->UPG.utp[nupg]->Kind=wid;
  955.                 nat->UPG.utp[nupg]->Done=false;
  956.                 nat->UPG.utp1[nupg]->Finished=false;
  957.                 for(int rr=0;gy[rr]!=0;rr++)if(gy[rr]=='_')gy[rr]=' ';
  958.                 strcpy(nat->UPG.utp[nupg]->Message,gy);
  959.                 nupg++;
  960.             };
  961.             break;
  962.         case 8://[UPGRADESTART]
  963.             z=fscanf(f1,"%s",gg);
  964.             GetMode(gg,&mode,line);
  965.             line++;
  966.             NLine(f1);
  967.             if(mode!=8)break;
  968.             if(gg[0]=='/'||gg[0]==0)break;
  969.             zz1=SearchStr(upg,gg,nupg);
  970.             if(zz1==-1){
  971.                 sprintf(gx,"( %s ) %d :Undefined upgrade name : %s",fn,line,gg);
  972.                 Errx(gx);
  973.             };
  974.             nat->UPG.utp[zz1]->Enabled=true;
  975.             break;
  976.         case 9://[UPGRADELINKS]
  977.             z=fscanf(f1,"%s",gg);
  978.             GetMode(gg,&mode,line);
  979.             line++;
  980.             //NLine(f1);
  981.             if(mode!=9){
  982.                 NLine(f1);
  983.                 break;
  984.             };
  985.             if(gg[0]=='/'||gg[0]==0){
  986.                 NLine(f1);
  987.                 break;
  988.             };
  989.             z=fscanf(f1,"%d",&parm1);
  990.             zz1=SearchStr(upg,gg,nupg);
  991.             if(zz1==-1){
  992.                 sprintf(gz,"( %s ) %d :Undefined upgrade name : %s",fn,line,gg);
  993.                 Errx(gz);
  994.             };
  995.             nat->UPG.utp[zz1]->NLinks=parm1;
  996.             nat->UPG.utp[zz1]->Links=new int[parm1];
  997.             for(wid=0;wid<parm1;wid++){
  998.                 z=fscanf(f1,"%s",gx);
  999.                 parm3=SearchStr(upg,gx,nupg);
  1000.                 if(parm3==-1){
  1001.                     sprintf(gz,"( %s ) %d :Undefined identifier : %s",fn,line,gx);
  1002.                     Errx(gz);
  1003.                 };
  1004.                 nat->UPG.utp[zz1]->Links[wid]=parm3;
  1005.             };
  1006.             NLine(f1);
  1007.             break;
  1008.         case 10://[DELAYTIME]
  1009.             z=fscanf(f1,"%s",gg);
  1010.             GetMode(gg,&mode,line);
  1011.             line++;
  1012.             if(gg[0]=='/'||gg[0]==0){
  1013.                 NLine(f1);
  1014.                 break;
  1015.             };
  1016.             if(mode==10){
  1017.                 zz1=SearchStr(mnm,gg,nmnm);
  1018.                 if(zz1==-1){
  1019.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1020.                     Errx(gz);
  1021.                 };
  1022.                 z=fscanf(f1,"%d",&parm1);
  1023.                 NLine(f1);
  1024.                 nat->Mon[zz1]->delay=parm1;
  1025.             };
  1026.             break;
  1027.         case 11://[WEAPONCENTER]
  1028.             z=fscanf(f1,"%s",gg);
  1029.             GetMode(gg,&mode,line);
  1030.             line++;
  1031.             if(gg[0]=='/'||gg[0]==0){
  1032.                 NLine(f1);
  1033.                 break;
  1034.             };
  1035.             if(mode==11){
  1036.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1037.                 zz1=SearchStr(mnm,gg,nmnm);
  1038.                 if(zz1==-1){
  1039.                     sprintf(gx,"%d ( %s ) : Unknuwn monster ID : %s",line,fn,gg);
  1040.                     Errx(gx);
  1041.                 };
  1042.                 NLine(f1);
  1043.                 nat->Mon[zz1]->wepX=parm1;
  1044.                 nat->Mon[zz1]->wepY=parm2;
  1045.             };
  1046.             break;
  1047.         case 15://[CHILDMONSTER]
  1048.             z=fscanf(f1,"%s",gg);
  1049.             GetMode(gg,&mode,line);
  1050.             if(mode==15)
  1051.                 z=fscanf(f1,"%s%s%d%d%d%d%d%d%d",gg1,gx,&knd,&gold,&wid,&mindam,&maxdam,&parm1,&parm2);
  1052.             NLine(f1);
  1053.             line++;
  1054.             GetMode(gg,&mode,line);
  1055.             if(mode==15&&gg[0]!='/'&&gg[0]!=0){
  1056.                 nat->Mon[nmnm]=new Visuals;
  1057.                 zz1=SearchStr(mnm,gg1,nmnm);
  1058.                 if(zz1==-1){
  1059.                     sprintf(gz,"%d ( %s ) : Unknown parent monster : %s",line,fn,gg1);
  1060.                     Errx(gz);
  1061.                 };
  1062.                 *nat->Mon[nmnm]=*nat->Mon[zz1];
  1063.                 for(int j=1;j<4;j++){
  1064.                     nat->Mon[nmnm]->ResourceID[j]=255;
  1065.                     nat->Mon[nmnm]->ResAmount[j]=0;
  1066.                 };
  1067.                 InitFlags(nat->Mon[nmnm]);
  1068.                 nat->Mon[nmnm]->Message=new char[strlen(gx)+1];
  1069.                 normstr(gx);
  1070.                 strcpy(nat->Mon[nmnm]->Message,gx);
  1071.                 nat->Mon[nmnm]->cost=gold;
  1072.                 nat->Mon[nmnm]->Kind=knd;
  1073.                 nat->Mon[nmnm]->cpbBase=false;
  1074.                 nat->Mon[nmnm]->cpbFarm=false;
  1075.                 nat->Mon[nmnm]->ResourceID[0]=1;
  1076.                 nat->Mon[nmnm]->ResAmount[0]=gold;
  1077.                 nat->Mon[nmnm]->OnWater=false;
  1078.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MinDamage=mindam;
  1079.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxDamage=maxdam;
  1080.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxLife=wid;
  1081.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.AttackRange=parm1;
  1082.                 ((Visuals*)(nat->Mon[nmnm]))->info.Basic.MaxShield=parm2;
  1083.                 mnm[nmnm]=new char[strlen(gg)+1];
  1084.                 strcpy(mnm[nmnm],gg);
  1085.                 nmnm++;
  1086.                 nat->NMon=nmnm;
  1087.  
  1088.             };
  1089.             break;
  1090.         case 16://[VISIBILITY]
  1091.             z=fscanf(f1,"%s",gg);
  1092.             GetMode(gg,&mode,line);
  1093.             line++;
  1094.             if(gg[0]=='/'||gg[0]==0){
  1095.                 NLine(f1);
  1096.                 break;
  1097.             };
  1098.             if(mode==16){
  1099.                 zz1=SearchStr(mnm,gg,nmnm);
  1100.                 if(zz1==-1){
  1101.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1102.                     Errx(gz);
  1103.                 };
  1104.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1105.                 NLine(f1);
  1106.                 nat->Mon[zz1]->VisRadius=parm1;
  1107.                 nat->Mon[zz1]->VisSpots=parm2;
  1108.             };
  1109.             break;
  1110.         case 17://[LIGHTPOINTS]
  1111.             z=fscanf(f1,"%s",gg);
  1112.             GetMode(gg,&mode,line);
  1113.             line++;
  1114.             if(gg[0]=='/'||gg[0]==0){
  1115.                 NLine(f1);
  1116.                 break;
  1117.             };
  1118.             if(mode==17){
  1119.                 zz1=SearchStr(mnm,gg,nmnm);
  1120.                 if(zz1==-1){
  1121.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1122.                     Errx(gz);
  1123.                 };
  1124.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1125.                 NLine(f1);
  1126.                 nat->Mon[zz1]->SpotType=parm1;
  1127.                 nat->Mon[zz1]->SpotSize=parm2;
  1128.             };
  1129.             break;
  1130.         case 18://[DANGERZONE]
  1131.             z=fscanf(f1,"%s",gg);
  1132.             GetMode(gg,&mode,line);
  1133.             line++;
  1134.             if(gg[0]=='/'||gg[0]==0){
  1135.                 NLine(f1);
  1136.                 break;
  1137.             };
  1138.             if(mode==18){
  1139.                 zz1=SearchStr(mnm,gg,nmnm);
  1140.                 if(zz1==-1){
  1141.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1142.                     Errx(gz);
  1143.                 };
  1144.                 z=fscanf(f1,"%d",&parm1);
  1145.                 NLine(f1);
  1146.                 nat->Mon[zz1]->DangerZone=parm1;
  1147.             };
  1148.             break;
  1149.         case 19://[NOSEARCHVICTIM]
  1150.             z=fscanf(f1,"%s",gg);
  1151.             GetMode(gg,&mode,line);
  1152.             line++;
  1153.             if(gg[0]=='/'||gg[0]==0){
  1154.                 NLine(f1);
  1155.                 break;
  1156.             };
  1157.             if(mode==19){
  1158.                 zz1=SearchStr(mnm,gg,nmnm);
  1159.                 if(zz1==-1){
  1160.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1161.                     Errx(gz);
  1162.                 };
  1163.                 NLine(f1);
  1164.                 nat->Mon[zz1]->NoSearchVictim=true;
  1165.             };
  1166.             break;
  1167.         case 20://[NOANSWER]
  1168.             z=fscanf(f1,"%s",gg);
  1169.             GetMode(gg,&mode,line);
  1170.             line++;
  1171.             if(gg[0]=='/'||gg[0]==0){
  1172.                 NLine(f1);
  1173.                 break;
  1174.             };
  1175.             if(mode==20){
  1176.                 zz1=SearchStr(mnm,gg,nmnm);
  1177.                 if(zz1==-1){
  1178.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1179.                     Errx(gz);
  1180.                 };
  1181.                 NLine(f1);
  1182.                 nat->Mon[zz1]->NoAnswer=true;
  1183.             };
  1184.             break;
  1185.         case 21://[NEEDNOHELP]
  1186.             z=fscanf(f1,"%s",gg);
  1187.             GetMode(gg,&mode,line);
  1188.             line++;
  1189.             if(gg[0]=='/'||gg[0]==0){
  1190.                 NLine(f1);
  1191.                 break;
  1192.             };
  1193.             if(mode==21){
  1194.                 zz1=SearchStr(mnm,gg,nmnm);
  1195.                 if(zz1==-1){
  1196.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1197.                     Errx(gz);
  1198.                 };
  1199.                 NLine(f1);
  1200.                 nat->Mon[zz1]->NeedNoHelp=true;
  1201.             };
  1202.             break;
  1203.         case 22://[LIFESHOTLOST]
  1204.             z=fscanf(f1,"%s",gg);
  1205.             GetMode(gg,&mode,line);
  1206.             line++;
  1207.             if(gg[0]=='/'||gg[0]==0){
  1208.                 NLine(f1);
  1209.                 break;
  1210.             };
  1211.             if(mode==22){
  1212.                 zz1=SearchStr(mnm,gg,nmnm);
  1213.                 if(zz1==-1){
  1214.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1215.                     Errx(gz);
  1216.                 };
  1217.                 z=fscanf(f1,"%d",&parm1);
  1218.                 NLine(f1);
  1219.                 nat->Mon[zz1]->LifeShotLost=parm1;
  1220.             };
  1221.             break;
  1222.         case 23://[STARTACCESS]
  1223.             z=fscanf(f1,"%s",gg);
  1224.             GetMode(gg,&mode,line);
  1225.             line++;
  1226.             if(gg[0]=='/'||gg[0]==0){
  1227.                 NLine(f1);
  1228.                 break;
  1229.             };
  1230.             if(mode==23){
  1231.                 zz1=SearchStr(mnm,gg,nmnm);
  1232.                 if(zz1==-1){
  1233.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1234.                     Errx(gz);
  1235.                 };
  1236.                 NLine(f1);
  1237.                 nat->Mon[zz1]->Enabled=true;
  1238.             };
  1239.             break;
  1240.         case 24://[ONWATER]
  1241.             z=fscanf(f1,"%s",gg);
  1242.             GetMode(gg,&mode,line);
  1243.             line++;
  1244.             if(gg[0]=='/'||gg[0]==0){
  1245.                 NLine(f1);
  1246.                 break;
  1247.             };
  1248.             if(mode==24){
  1249.                 zz1=SearchStr(mnm,gg,nmnm);
  1250.                 if(zz1==-1){
  1251.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1252.                     Errx(gz);
  1253.                 };
  1254.                 NLine(f1);
  1255.                 nat->Mon[zz1]->OnWater=true;
  1256.             };
  1257.             break;
  1258.         case 25://[ONCOST]
  1259.             z=fscanf(f1,"%s",gg);
  1260.             GetMode(gg,&mode,line);
  1261.             line++;
  1262.             if(gg[0]=='/'||gg[0]==0){
  1263.                 NLine(f1);
  1264.                 break;
  1265.             };
  1266.             if(mode==25){
  1267.                 zz1=SearchStr(mnm,gg,nmnm);
  1268.                 if(zz1==-1){
  1269.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1270.                     Errx(gz);
  1271.                 };
  1272.                 NLine(f1);
  1273.                 nat->Mon[zz1]->OnCost=true;
  1274.             };
  1275.             break;
  1276.         case 26://[ONOIL]
  1277.             z=fscanf(f1,"%s",gg);
  1278.             GetMode(gg,&mode,line);
  1279.             line++;
  1280.             if(gg[0]=='/'||gg[0]==0){
  1281.                 NLine(f1);
  1282.                 break;
  1283.             };
  1284.             if(mode==26){
  1285.                 zz1=SearchStr(mnm,gg,nmnm);
  1286.                 if(zz1==-1){
  1287.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1288.                     Errx(gz);
  1289.                 };
  1290.                 NLine(f1);
  1291.                 nat->Mon[zz1]->OnOil=true;
  1292.             };
  1293.             break;
  1294.         case 27://[CANBUILD]
  1295.             z=fscanf(f1,"%s",gg);
  1296.             GetMode(gg,&mode,line);
  1297.             line++;
  1298.             if(gg[0]=='/'||gg[0]==0){
  1299.                 NLine(f1);
  1300.                 break;
  1301.             };
  1302.             if(mode==27){
  1303.                 zz1=SearchStr(mnm,gg,nmnm);
  1304.                 if(zz1==-1){
  1305.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1306.                     Errx(gz);
  1307.                 };
  1308.                 NLine(f1);
  1309.                 nat->Mon[zz1]->cpbBuild=true;
  1310.             };
  1311.             break;
  1312.         case 28://[USEFUL_FOR_DEFENSE
  1313.             z=fscanf(f1,"%s",gg);
  1314.             GetMode(gg,&mode,line);
  1315.             line++;
  1316.             if(gg[0]=='/'||gg[0]==0){
  1317.                 NLine(f1);
  1318.                 break;
  1319.             };
  1320.             if(mode==28){
  1321.                 zz1=SearchStr(mnm,gg,nmnm);
  1322.                 if(zz1==-1){
  1323.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1324.                     Errx(gz);
  1325.                 };
  1326.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1327.                 NLine(f1);
  1328.                 nat->Mon[zz1]->Useful[0]=parm1;
  1329.                 nat->Mon[zz1]->SpUsef[0]=parm2;
  1330.             };
  1331.             break;
  1332.         case 29://[USEFUL_FOR_ATTACK]
  1333.             z=fscanf(f1,"%s",gg);
  1334.             GetMode(gg,&mode,line);
  1335.             line++;
  1336.             if(gg[0]=='/'||gg[0]==0){
  1337.                 NLine(f1);
  1338.                 break;
  1339.             };
  1340.             if(mode==29){
  1341.                 zz1=SearchStr(mnm,gg,nmnm);
  1342.                 if(zz1==-1){
  1343.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1344.                     Errx(gz);
  1345.                 };
  1346.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1347.                 NLine(f1);
  1348.                 nat->Mon[zz1]->Useful[1]=parm1;
  1349.                 nat->Mon[zz1]->SpUsef[1]=parm2;
  1350.             };
  1351.             break;
  1352.         case 30://[USEFUL_FOR_SCIENCE]
  1353.             z=fscanf(f1,"%s",gg);
  1354.             GetMode(gg,&mode,line);
  1355.             line++;
  1356.             if(gg[0]=='/'||gg[0]==0){
  1357.                 NLine(f1);
  1358.                 break;
  1359.             };
  1360.             if(mode==30){
  1361.                 zz1=SearchStr(mnm,gg,nmnm);
  1362.                 if(zz1==-1){
  1363.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1364.                     Errx(gz);
  1365.                 };
  1366.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1367.                 NLine(f1);
  1368.                 nat->Mon[zz1]->Useful[2]=parm1;
  1369.                 nat->Mon[zz1]->SpUsef[2]=parm2;
  1370.             };
  1371.             break;
  1372.         case 31://[USEFUL_FOR_NARHOZ}
  1373.             z=fscanf(f1,"%s",gg);
  1374.             GetMode(gg,&mode,line);
  1375.             line++;
  1376.             if(gg[0]=='/'||gg[0]==0){
  1377.                 NLine(f1);
  1378.                 break;
  1379.             };
  1380.             if(mode==31){
  1381.                 zz1=SearchStr(mnm,gg,nmnm);
  1382.                 if(zz1==-1){
  1383.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1384.                     Errx(gz);
  1385.                 };
  1386.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  1387.                 NLine(f1);
  1388.                 nat->Mon[zz1]->Useful[3]=parm1;
  1389.                 nat->Mon[zz1]->SpUsef[3]=parm2;
  1390.             };
  1391.             break;
  1392.         case 32://[ABSOLUTELYNEED]
  1393.             z=fscanf(f1,"%s",gg);
  1394.             GetMode(gg,&mode,line);
  1395.             line++;
  1396.             if(gg[0]=='/'||gg[0]==0){
  1397.                 NLine(f1);
  1398.                 break;
  1399.             };
  1400.             if(mode==32){
  1401.                 zz1=SearchStr(mnm,gg,nmnm);
  1402.                 int zz2=SearchStr(upg,gg,nupg);
  1403.                 if(zz1==-1&&zz2==-1){
  1404.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1405.                     Errx(gz);
  1406.                 };
  1407.                 z=fscanf(f1,"%d%d%d%d",&parm1,&parm2,&parm3,&parm4);
  1408.                 NLine(f1);
  1409.                 int NAND=nat->NNeed;
  1410.                 Needness* NDN=&nat->NEED[NAND];
  1411.                 if(zz1!=-1)NDN->NeedType=0;
  1412.                 else{
  1413.                     NDN->NeedType=1;//upgrade
  1414.                     zz1=zz2;
  1415.                 };
  1416.                 NDN->MonID=zz1;
  1417.                 NDN->GroupSize=parm1;
  1418.                 NDN->Amount=parm2;
  1419.                 NDN->Probability=div(32768*parm3,100).quot;
  1420.                 NDN->MoneyPercent=div(parm4<<8,100).quot;
  1421.                 //nat->Mon[zz1]->AbsNeedPrio=parm1;
  1422.                 //nat->Mon[zz1]->AbsNeedCount=parm2;
  1423.                 nat->NNeed++;
  1424.             };
  1425.             break;
  1426.         case 33://[BRANCHPERCENT]
  1427.             z=fscanf(f1,"%s",gg);
  1428.             GetMode(gg,&mode,line);
  1429.             line++;
  1430.             if(gg[0]=='/'||gg[0]==0){
  1431.                 NLine(f1);
  1432.                 break;
  1433.             };
  1434.             if(mode==33){
  1435.                 for(int k=0;k<NBRANCH;k++)
  1436.                     fscanf(f1,"%d",&nat->BranchPercent[k]);
  1437.                 NLine(f1);
  1438.             };
  1439.             break;
  1440.         case 34://[AICOEFFICIENTS]
  1441.             z=fscanf(f1,"%s",gg);
  1442.             GetMode(gg,&mode,line);
  1443.             line++;
  1444.             if(gg[0]=='/'||gg[0]==0){
  1445.                 NLine(f1);
  1446.                 break;
  1447.             };
  1448.             if(mode==34){
  1449.                 fscanf(f1,"%d",&parm1);
  1450.                 if(!strcmp(gg,"CASH_PUSH_PROBABILITY")){
  1451.                     nat->CASH_PUSH_PROBABILITY=parm1;
  1452.                 }else
  1453.                 if(!strcmp(gg,"TAX_PERCENT")){
  1454.                     nat->TAX_PERCENT=parm1;
  1455.                 }else
  1456.                 if(!strcmp(gg,"DEFENCE_HANDLE_ATTACK_PROBABILITY")){
  1457.                     DHAPROB=parm1;
  1458.                 }else
  1459.                 if(!strcmp(gg,"DEFENCE_RECALL_PROBABILITY")){
  1460.                     DRECLPROB=parm1;
  1461.                 }else
  1462.                 if(!strcmp(gg,"DEFENCE_DIVISION_PROBABILITY")){
  1463.                     DDIVPROB=parm1;
  1464.                 }else
  1465.                 if(!strcmp(gg,"HELP_REQUEST_ANSWER_PROBABILITY")){
  1466.                     HANSWPROB=parm1;
  1467.                 }else
  1468.                 if(!strcmp(gg,"HELP_REQUEST_RADIUS")){
  1469.                     HREQRADIUS=parm1;
  1470.                 }else
  1471.                 if(!strcmp(gg,"CROWD_MIN_MEMBERS")){
  1472.                     CROWDMIN=parm1;
  1473.                 }else
  1474.                 if(!strcmp(gg,"HANDLE_CROWD_PROBABILITY")){
  1475.                     HCPROB=parm1;
  1476.                 }else
  1477.                 if(!strcmp(gg,"CROWD_MOVEMENT_C1")){
  1478.                     CMC1=parm1;
  1479.                 }else
  1480.                 if(!strcmp(gg,"CROWD_MOVEMENT_C2")){
  1481.                     CMC2=parm1;
  1482.                 }else
  1483.                 if(!strcmp(gg,"CROWD_MOVEMENT_C3")){
  1484.                     CMC3=parm1;
  1485.                 }else
  1486.                 if(!strcmp(gg,"AI_LEVEL_MIN")){
  1487.                     nat->AI_Level_MIN=div(parm1*32768,100).quot;
  1488.                     nat->NationalAI=nat->AI_Level_MIN;
  1489.                 }else
  1490.                 if(!strcmp(gg,"AI_LEVEL_MAX")){
  1491.                     nat->AI_Level_MAX=div(parm1*32768,100).quot;
  1492.                 }else 
  1493.                 if(!strcmp(gg,"AI_FORWARD_MULTIPLY")){
  1494.                     nat->AI_Forward=div(parm1*256,100).quot;
  1495.                 }else{
  1496.                     sprintf(gx,"%d ( %s ) : Unknown AI coefficient : %s",line,fn,gg);
  1497.                     Errx(gx);
  1498.                 };
  1499.                 NLine(f1);
  1500.             };
  1501.             break;
  1502.         case 35://[MAXAUTOAMOUNT]
  1503.             z=fscanf(f1,"%s",gg);
  1504.             GetMode(gg,&mode,line);
  1505.             line++;
  1506.             if(gg[0]=='/'||gg[0]==0){
  1507.                 NLine(f1);
  1508.                 break;
  1509.             };
  1510.             if(mode==35){
  1511.                 zz1=SearchStr(mnm,gg,nmnm);
  1512.                 if(zz1==-1){
  1513.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1514.                     Errx(gz);
  1515.                 };
  1516.                 z=fscanf(f1,"%d",&parm1);
  1517.                 NLine(f1);
  1518.                 nat->Mon[zz1]->MaxAutoAmount=parm1;
  1519.             };
  1520.             break;
  1521.         case 36://[WARRIORS]
  1522.             z=fscanf(f1,"%s",gg);
  1523.             GetMode(gg,&mode,line);
  1524.             line++;
  1525.             if(gg[0]=='/'||gg[0]==0){
  1526.                 NLine(f1);
  1527.                 break;
  1528.             };
  1529.             if(mode==36){
  1530.                 zz1=SearchStr(mnm,gg,nmnm);
  1531.                 if(zz1==-1){
  1532.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1533.                     Errx(gz);
  1534.                 };
  1535.                 nat->Mon[zz1]->Warrior=true;
  1536.             };
  1537.             break;
  1538.         case 37://[AIR]
  1539.             z=fscanf(f1,"%s",gg);
  1540.             GetMode(gg,&mode,line);
  1541.             line++;
  1542.             if(gg[0]=='/'||gg[0]==0){
  1543.                 NLine(f1);
  1544.                 break;
  1545.             };
  1546.             if(mode==37){
  1547.                 zz1=SearchStr(mnm,gg,nmnm);
  1548.                 if(zz1==-1){
  1549.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1550.                     Errx(gz);
  1551.                 };
  1552.                 nat->Mon[zz1]->OnAir=true;
  1553.             };
  1554.             break;
  1555.         case 38://[WEAPONCENTER8]
  1556.             z=fscanf(f1,"%s",gg);
  1557.             GetMode(gg,&mode,line);
  1558.             line++;
  1559.             if(gg[0]=='/'||gg[0]==0){
  1560.                 NLine(f1);
  1561.                 break;
  1562.             };
  1563.             if(mode==38){
  1564.                 zz1=SearchStr(mnm,gg,nmnm);
  1565.                 if(zz1==-1){
  1566.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1567.                     Errx(gz);
  1568.                 };
  1569.                 z=fscanf(f1,"%d%d%d%d",
  1570.                     &parm1,&parm2,&parm3,&parm4);
  1571.                 nat->Mon[zz1]->Wdx[0]=parm1;
  1572.                 nat->Mon[zz1]->Wdy[0]=parm2;
  1573.                 nat->Mon[zz1]->Wdx[1]=parm3;
  1574.                 nat->Mon[zz1]->Wdy[1]=parm4;
  1575.                 z=fscanf(f1,"%d%d%d%d",
  1576.                     &parm1,&parm2,&parm3,&parm4);
  1577.                 nat->Mon[zz1]->Wdx[2]=parm1;
  1578.                 nat->Mon[zz1]->Wdy[2]=parm2;
  1579.                 nat->Mon[zz1]->Wdx[3]=parm3;
  1580.                 nat->Mon[zz1]->Wdy[3]=parm4;
  1581.                 z=fscanf(f1,"%d%d%d%d",
  1582.                     &parm1,&parm2,&parm3,&parm4);
  1583.                 nat->Mon[zz1]->Wdx[4]=parm1;
  1584.                 nat->Mon[zz1]->Wdy[4]=parm2;
  1585.                 nat->Mon[zz1]->Wdx[5]=parm3;
  1586.                 nat->Mon[zz1]->Wdy[5]=parm4;
  1587.                 z=fscanf(f1,"%d%d%d%d",
  1588.                     &parm1,&parm2,&parm3,&parm4);
  1589.                 nat->Mon[zz1]->Wdx[6]=parm1;
  1590.                 nat->Mon[zz1]->Wdy[6]=parm2;
  1591.                 nat->Mon[zz1]->Wdx[7]=parm3;
  1592.                 nat->Mon[zz1]->Wdy[7]=parm4;
  1593.                 NLine(f1);
  1594.             };
  1595.             break;
  1596.         case 39://[TELEPORT]
  1597.             z=fscanf(f1,"%s",gg);
  1598.             GetMode(gg,&mode,line);
  1599.             line++;
  1600.             if(gg[0]=='/'||gg[0]==0){
  1601.                 NLine(f1);
  1602.                 break;
  1603.             };
  1604.             if(mode==39){
  1605.                 zz1=SearchStr(mnm,gg,nmnm);
  1606.                 if(zz1==-1){
  1607.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1608.                     Errx(gz);
  1609.                 };
  1610.                 NLine(f1);
  1611.                 nat->Mon[zz1]->Teleport=true;
  1612.             };
  1613.             break;
  1614.         case 40://[ENABLED]
  1615.             z=fscanf(f1,"%s",gg);
  1616.             GetMode(gg,&mode,line);
  1617.             line++;
  1618.             if(gg[0]=='/'||gg[0]==0){
  1619.                 NLine(f1);
  1620.                 break;
  1621.             };
  1622.             if(mode==40){
  1623.                 zz1=SearchStr(mnm,gg,nmnm);
  1624.                 if(zz1==-1){
  1625.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1626.                     Errx(gz);
  1627.                 };
  1628.                 NLine(f1);
  1629.                 nat->Mon[zz1]->Enabled=true;
  1630.             };
  1631.             break;
  1632.         case 41://[AUTO_PERFORM_UPGRADE]
  1633.             z=fscanf(f1,"%s",gg);
  1634.             GetMode(gg,&mode,line);
  1635.             line++;
  1636.             //NLine(f1);
  1637.             if(mode!=41){
  1638.                 NLine(f1);
  1639.                 break;
  1640.             };
  1641.             if(gg[0]=='/'||gg[0]==0){
  1642.                 NLine(f1);
  1643.                 break;
  1644.             };
  1645.             z=fscanf(f1,"%d",&parm1);
  1646.             zz1=SearchStr(upg,gg,nupg);
  1647.             if(zz1==-1){
  1648.                 sprintf(gz,"( %s ) %d :Undefined upgrade name : %s",fn,line,gg);
  1649.                 Errx(gz);
  1650.             };
  1651.             nat->UPG.utp[zz1]->NAuto=parm1;
  1652.             nat->UPG.utp[zz1]->AutoPerf=new int[parm1];
  1653.             for(wid=0;wid<parm1;wid++){
  1654.                 z=fscanf(f1,"%s",gx);
  1655.                 parm3=SearchStr(upg,gx,nupg);
  1656.                 if(parm3==-1){
  1657.                     sprintf(gz,"( %s ) %d :Undefined identifier : %s",fn,line,gx);
  1658.                     Errx(gz);
  1659.                 };
  1660.                 nat->UPG.utp[zz1]->AutoPerf[wid]=parm3;
  1661.             };
  1662.             NLine(f1);
  1663.             break;
  1664.         case 42: //[ICONS]
  1665.             z=fscanf(f1,"%s",gg);
  1666.             GetMode(gg,&mode,line);
  1667.             line++;
  1668.             if(gg[0]=='/'||gg[0]==0){
  1669.                 NLine(f1);    
  1670.                 break;
  1671.             };
  1672.             if(mode==42){
  1673.                 WIcon* icc=new WIcon;
  1674.                 nat->wIcons[nico]=icc;
  1675.                 nat->NIcons=nico+1;
  1676.                 z=fscanf(f1,"%s%d%d%d",gg,&parm1,&parm2,&parm3);
  1677.                 icc->FileID=parm1;
  1678.                 icc->Spr=parm2;
  1679.                 icc->Param1=parm3;
  1680.                 if(parm3>1){
  1681.                     icc->SubList=new word [parm3];
  1682.                     for(int i=0;i<parm3;i++){
  1683.                         z=fscanf(f1,"%d",&parm2);
  1684.                         icc->SubList[i]=parm2;
  1685.                     };
  1686.                 }else icc->SubList=NULL;
  1687.                 z=fscanf(f1,"%s",gz);
  1688.                 if(gz[1]=='w'){
  1689.                     z=fscanf(f1,"%d",&parm6);
  1690.                 };
  1691.                 z=fscanf(f1,"%s",gy);
  1692.                 zz1=SearchStr(ico,gg,nico);
  1693.                 icc->Message=new char [strlen(gy)+1];
  1694.                 if(zz1!=-1){
  1695.                     sprintf(gx,"( %s ) %d : Duplicate icon identifier: %s",fn,line,gg);
  1696.                     Errx(gx);
  1697.                 };
  1698.                 ico[nico]=new char[strlen(gg)+1];
  1699.                 strcpy(ico[nico],gg);
  1700.                 if(gz[0]=='/'){
  1701.                     if(gz[1]=='n'){
  1702.                         icc->Kind=1;
  1703.                         sscanf(gz+2,"%d",&parm3);
  1704.                         icc->Param2=parm3;
  1705.                     }else
  1706.                     if(gz[1]=='p'){
  1707.                         icc->Kind=2;
  1708.                         z=sscanf(gz+2,"%d",&parm3);
  1709.                         icc->Param2=parm3;
  1710.                     }else
  1711.                     if(gz[1]=='w'){
  1712.                         icc->Kind=5;
  1713.                         z=sscanf(gz+2,"%d",&parm3);
  1714.                         icc->Param2=parm3;
  1715.                         icc->Param1=parm6;
  1716.                     }else
  1717.                     if(gz[1]=='d'){
  1718.                         icc->Kind=0;
  1719.                         sscanf(gz+2,"%d",&parm3);
  1720.                         icc->Param2=parm3;
  1721.                     }else
  1722.                     if(gz[1]=='e'){
  1723.                         icc->Kind=0;
  1724.                         //scanf(gz+2,"%d",&parm3);
  1725.                         icc->Param2=0xFFFF;
  1726.                     }else{
  1727.                         sprintf(gx,"(%s) %d :Incorrect icon definition, unknown identifier: %s",fn,line,gz);
  1728.                         Errx(gx);    
  1729.                     };
  1730.                 }else{
  1731.                     //upgrade?
  1732.                     zz1=SearchStr(upg,gz,nupg);
  1733.                     if(zz1!=-1){
  1734.                         icc->Kind=3;
  1735.                         icc->Param2=zz1;
  1736.                     }else{
  1737.                         zz1=SearchStr(mnm,gz,nmnm);
  1738.                         if(zz1!=-1){
  1739.                             icc->Kind=4;
  1740.                             icc->Param2=zz1;
  1741.                         }else{
  1742.                             sprintf(gx,"(%s) %d :Incorrect icon definition, unknown identifier: %s",fn,line,gz);
  1743.                             Errx(gx);    
  1744.                         };
  1745.                     };
  1746.                 };
  1747.                 for(int rr=0;gy[rr]!=0;rr++)if(gy[rr]=='_')gy[rr]=' ';
  1748.                 strcpy(icc->Message,gy);
  1749.                 icc->MagReq=0;
  1750.                 nico++;
  1751.             };
  1752.             break;
  1753.         case 43: //[UNITS_INTERFACE]
  1754.             z=fscanf(f1,"%s",gg);
  1755.             GetMode(gg,&mode,line);
  1756.             line++;
  1757.             if(gg[0]=='/'||gg[0]==0){
  1758.                 NLine(f1);
  1759.                 break;
  1760.             };
  1761.             if(mode==43){
  1762.                 z=fscanf(f1,"%d",&wid);
  1763.                 zz1=SearchStr(mnm,gg,nmnm);
  1764.                 if(zz1==-1){
  1765.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1766.                     Errx(gz);
  1767.                 };
  1768.                 GeneralObject* GO=nat->Mon[zz1];
  1769.                 GO->IRefs=new word[wid];
  1770.                 GO->NIcons=wid;
  1771.                 for(int i=0;i<wid;i++){
  1772.                     z=fscanf(f1,"%s",gz);
  1773.                     zz1=SearchStr(ico,gz,nico);
  1774.                     if(zz1!=-1){
  1775.                         GO->IRefs[i]=zz1;
  1776.                         WIcon* ico=nat->wIcons[zz1];
  1777.                         if(ico->Kind==5){
  1778.                             GO->SWPIndex[ico->Param2]=ico->Param1;
  1779.                         };
  1780.                     }else{
  1781.                         sprintf(gx,"(%s)%d :Unknown identifier :%s",fn,line,gz);
  1782.                         Errx(gx);
  1783.                     };
  1784.                 };
  1785.                 NLine(f1);
  1786.             };
  1787.             break;
  1788.         case 44://[MOREWEAPON]
  1789.             z=fscanf(f1,"%s",gg);
  1790.             GetMode(gg,&mode,line);
  1791.             if(mode==44){
  1792.                 if(gg[0]!='/'&&gg[0]!=0){
  1793.                     int zz1=SearchStr(mnm,gg,nmnm);
  1794.                     if(zz1==-1){
  1795.                         sprintf(gy,"%s : Identifier %s not found.",fn,gg);
  1796.                         Errx(gy);
  1797.                     };
  1798.                     z=fscanf(f1,"%d",&parm1);
  1799.                     if(!z){
  1800.                         sprintf(gy,"(%s) %d : Invalid amount of additional weapon.",fn,line);
  1801.                         Errx(gy);
  1802.                     };
  1803.                     GeneralObject* GO=nat->Mon[zz1];
  1804.                     GO->NWeap=parm1;
  1805.                     for(int i=0;i<parm1;i++){
  1806.                         z=fscanf(f1,"%s",gx);
  1807.                         int zz2=SearchStr(mbm,gx,nmbm);
  1808.                         if(zz2==-1){
  1809.                             sprintf(gy,"%s : Identifier %s not found.",fn,gx);
  1810.                             Errx(gy);
  1811.                         };
  1812.                         GO->MWeap[i]=WPLIST[zz2];
  1813.                     };
  1814.                     NLine(f1);
  1815.                     line++;
  1816.                 };
  1817.             };
  1818.             break;
  1819.         case 46://[TRANSPORT]
  1820.             z=fscanf(f1,"%s",gg);
  1821.             GetMode(gg,&mode,line);
  1822.             line++;
  1823.             if(gg[0]=='/'||gg[0]==0){
  1824.                 NLine(f1);
  1825.                 break;
  1826.             };
  1827.             if(mode==46){
  1828.                 zz1=SearchStr(mnm,gg,nmnm);
  1829.                 if(zz1==-1){
  1830.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  1831.                     Errx(gz);
  1832.                 };
  1833.                 NLine(f1);
  1834.                 nat->Mon[zz1]->Transport=true;
  1835.             };
  1836.             break;
  1837.         case 47://[COMMONMENU]
  1838.             z=fscanf(f1,"%s",gg);
  1839.             GetMode(gg,&mode,line);
  1840.             line++;
  1841.             if(gg[0]=='/'||gg[0]==0){
  1842.                 NLine(f1);
  1843.                 break;
  1844.             };
  1845.             if(mode==47){
  1846.                 if(!strcmp(gg,"COMMON")){
  1847.                     z=fscanf(f1,"%d",&wid);
  1848.                     nat->NCmenus=wid;
  1849.                     nat->Cmenus=new word[wid];
  1850.                     for(int i=0;i<wid;i++){
  1851.                         z=fscanf(f1,"%s",gz);
  1852.                         zz1=SearchStr(ico,gz,nico);
  1853.                         if(zz1==-1){
  1854.                             sprintf(gx,"(%s)%d :Unknown identifier :%s",fn,line,gz);
  1855.                             Errx(gx);
  1856.                         }else nat->Cmenus[i]=zz1;
  1857.                     };
  1858.                 }else
  1859.                 if(!strcmp(gg,"LAND")){
  1860.                     z=fscanf(f1,"%d",&wid);
  1861.                     nat->NLmenus=wid;
  1862.                     nat->Lmenus=new word[wid];
  1863.                     for(int i=0;i<wid;i++){
  1864.                         z=fscanf(f1,"%s",gz);
  1865.                         zz1=SearchStr(ico,gz,nico);
  1866.                         if(zz1==-1){
  1867.                             sprintf(gx,"(%s)%d :Unknown identifier :%s",fn,line,gz);
  1868.                             Errx(gx);
  1869.                         }else nat->Lmenus[i]=zz1;
  1870.                     };
  1871.                 }else
  1872.                 if(!strcmp(gg,"AIR")){
  1873.                     z=fscanf(f1,"%d",&wid);
  1874.                     nat->NAmenus=wid;
  1875.                     nat->Amenus=new word[wid];
  1876.                     for(int i=0;i<wid;i++){
  1877.                         z=fscanf(f1,"%s",gz);
  1878.                         zz1=SearchStr(ico,gz,nico);
  1879.                         if(zz1==-1){
  1880.                             sprintf(gx,"(%s)%d :Unknown identifier :%s",fn,line,gz);
  1881.                             Errx(gx);
  1882.                         }else nat->Amenus[i]=zz1;
  1883.                     };
  1884.                 }else 
  1885.                 if(!strcmp(gg,"WATER")){
  1886.                     z=fscanf(f1,"%d",&wid);
  1887.                     nat->NWmenus=wid;
  1888.                     nat->Wmenus=new word[wid];
  1889.                     for(int i=0;i<wid;i++){
  1890.                         z=fscanf(f1,"%s",gz);
  1891.                         zz1=SearchStr(ico,gz,nico);
  1892.                         if(zz1==-1){
  1893.                             sprintf(gx,"(%s)%d :Unknown identifier :%s",fn,line,gz);
  1894.                             Errx(gx);
  1895.                         }else nat->Wmenus[i]=zz1;
  1896.                     }
  1897.                 }else{
  1898.                     sprintf(gx,"%d (%s) :Unknown [COMMONMENU] section : %s",line,fn,gg);
  1899.                     Errx(gx);
  1900.                 };
  1901.                 NLine(f1);
  1902.             };
  1903.             break;
  1904.         case 48://[FUNCTIONALITY]
  1905.             z=fscanf(f1,"%s",gg);
  1906.             GetMode(gg,&mode,line);
  1907.             line++;
  1908.             if(gg[0]=='/'||gg[0]==0){
  1909.                 NLine(f1);
  1910.                 break;
  1911.             };
  1912.             if(mode==48){
  1913.                 z=fscanf(f1,"%s",gy);
  1914.                 zz1=SearchStr(mnm,gy,nmnm);
  1915.                 if(zz1==-1){
  1916.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gy);
  1917.                     Errx(gz);
  1918.                 };
  1919.                 if(!strcmp(gg,"TOWN0"))nat->TOWN0ID=zz1;
  1920.                 else 
  1921.                 if(!strcmp(gg,"TOWN1"))nat->TOWN1ID=zz1;
  1922.                 else 
  1923.                 if(!strcmp(gg,"TOWN2"))nat->TOWN2ID=zz1;
  1924.                 else 
  1925.                 if(!strcmp(gg,"PORT"))nat->PortID=zz1;
  1926.                 else 
  1927.                 if(!strcmp(gg,"REFINERY"))nat->RefineryID=zz1;
  1928.                 else 
  1929.                 if(!strcmp(gg,"TANKER"))nat->TankerID=zz1;
  1930.                 else 
  1931.                 if(!strcmp(gg,"OILBASE"))nat->OilBaseID=zz1;
  1932.                 else 
  1933.                 if(!strcmp(gg,"SUBMARINE")){
  1934.                     nat->SubmID=zz1;
  1935.                     nat->Mon[zz1]->Submarine=true;
  1936.                 }else 
  1937.                 if(!strcmp(gg,"FOUNDARY"))nat->FoundaryID=zz1;
  1938.                 else{
  1939.                     sprintf(gx,"%d (%s) :Unknown reference name in section [FUNCTIONALITY]: %s",line,fn,gg);
  1940.                     Errx(gx);
  1941.                 };
  1942.                 NLine(f1);
  1943.             };
  1944.             break;
  1945.         case 49://[MAGICREQUEST]
  1946.             z=fscanf(f1,"%s",gg);
  1947.             GetMode(gg,&mode,line);
  1948.             line++;
  1949.             if(gg[0]=='/'||gg[0]==0){
  1950.                 NLine(f1);
  1951.                 break;
  1952.             };
  1953.             if(mode==49){
  1954.                 z=fscanf(f1,"%d%d%s%s",&parm1,&parm2,gx,gy);
  1955.                 NLine(f1);
  1956.                 zz1=SearchStr(ico,gg,nico);
  1957.                 if(zz1==-1){
  1958.                     sprintf(gz,"%d ( %s ) : Unknown icon identifier : %s",line,fn,gg);
  1959.                     Errx(gz);
  1960.                 };
  1961.                 WIcon* icc=nat->wIcons[zz1];
  1962.                 icc->MagReq=parm1;
  1963.                 if(icc->Kind==5){
  1964.                     nat->WMagic[icc->Param2]=parm1;
  1965.                 };
  1966.                 SWPAR* SWX=&nat->SWP[icc->Param1];
  1967.                 SWX->MinMagic=parm1;
  1968.                 SWX->Range=parm2;
  1969.                 if(!strcmp(gx,"ENABLED"))SWX->Enabled=true;
  1970.                 else if(!strcmp(gx,"DISABLED"))SWX->Enabled=false;
  1971.                 else{
  1972.                     sprintf(gz,"%d ( %s ) : Unknown Weapon status : %s",line,fn,gx);
  1973.                     Errx(gz);
  1974.                 };
  1975.                 if(!strcmp(gy,"FLY"))SWX->Fly=true;
  1976.                 else if(!strcmp(gy,"DIRECT"))SWX->Fly=false;
  1977.                 else{
  1978.                     sprintf(gz,"%d ( %s ) : Unknown Weapon status : %s",line,fn,gy);
  1979.                     Errx(gz);
  1980.                 };
  1981.             };
  1982.             break;
  1983.         case 50://[ACCESSCONTROL]
  1984.             z=fscanf(f1,"%s",gg);
  1985.             GetMode(gg,&mode,line);
  1986.             line++;
  1987.             if(gg[0]=='/'||gg[0]==0){
  1988.                 NLine(f1);
  1989.                 break;
  1990.             };
  1991.             if(mode==50){
  1992.                 zz1=SearchStr(mnm,gg,nmnm);
  1993.                 if(zz1==-1){
  1994.                     zz1=SearchStr(upg,gg,nupg);
  1995.                     if(zz1==-1){
  1996.                         sprintf(gx,"%d ( %s ) : Unknown monster/upgrade identifief in [ACCESSCONTROL]: %s",line,fn,gg);
  1997.                         Errx(gx);
  1998.                     }else zz1+=8192;
  1999.                 };
  2000.                 z=fscanf(f1,"%d",&parm1);
  2001.                 word nc=nat->NCOND;
  2002.                 nat->NCOND++;
  2003.                 nat->CLSize[nc]=parm1;
  2004.                 nat->CLRef[nc]=new word [parm1+1];
  2005.                 word* CRF=nat->CLRef[nc];
  2006.                 CRF[0]=zz1;
  2007.                 for(int i=0;i<parm1;i++){
  2008.                     z=fscanf(f1,"%s",gy);
  2009.                     zz1=SearchStr(mnm,gy,nmnm);
  2010.                     if(zz1==-1){
  2011.                         sprintf(gx,"%d ( %s ) : Unknown monster ID in [ACCESSCONTROL] : %s",line,fn,gy);
  2012.                         Errx(gx);
  2013.                     };
  2014.                     CRF[i+1]=zz1;
  2015.                 };
  2016.                 NLine(f1);
  2017.             };
  2018.             break;
  2019.         case 51://[MAGICCONTROL]
  2020.             z=fscanf(f1,"%s",gg);
  2021.             GetMode(gg,&mode,line);
  2022.             line++;
  2023.             if(gg[0]=='/'||gg[0]==0){
  2024.                 NLine(f1);
  2025.                 break;
  2026.             };
  2027.             if(mode==51){
  2028.                 z=fscanf(f1,"%d%d%d%s%s",&parm1,&parm2,&parm3,gx,gy);
  2029.                 SWPAR* SWX=&nat->SWP[parm1];
  2030.                 SWX->MinMagic=parm2;
  2031.                 SWX->Range=parm3;
  2032.                 if(!strcmp(gx,"ENABLED"))SWX->Enabled=true;
  2033.                 else if(!strcmp(gx,"DISABLED"))SWX->Enabled=false;
  2034.                 else{
  2035.                     sprintf(gz,"%d ( %s ) : Unknown Weapon status : %s",line,fn,gx);
  2036.                     Errx(gz);
  2037.                 };
  2038.                 if(!strcmp(gy,"FLY"))SWX->Fly=true;
  2039.                 else if(!strcmp(gy,"DIRECT"))SWX->Fly=false;
  2040.                 else{
  2041.                     sprintf(gz,"%d ( %s ) : Unknown Weapon status : %s",line,fn,gy);
  2042.                     Errx(gz);
  2043.                 };
  2044.             };
  2045.             break;
  2046.         case 52://[RESOURCEABSORBERS]
  2047.             z=fscanf(f1,"%s",gg);
  2048.             GetMode(gg,&mode,line);
  2049.             line++;
  2050.             if(gg[0]=='/'||gg[0]==0){
  2051.                 NLine(f1);
  2052.                 break;
  2053.             };
  2054.             if(mode==52){
  2055.                 zz1=SearchStr(mnm,gg,nmnm);
  2056.                 if(zz1==-1){
  2057.                     sprintf(gy,"%d ( %s ) : Unknown monster ID : %s",line,fn,gg);
  2058.                     Errx(gy);
  2059.                 };
  2060.                 z=fscanf(f1,"%s",gx);
  2061.                 if(!strcmp(gx,"GOLD"))nat->Mon[zz1]->AGold=true;
  2062.                 if(!strcmp(gx,"WOOD"))nat->Mon[zz1]->AWood=true;
  2063.                 NLine(f1);
  2064.             };
  2065.             break;
  2066.         case 53://[CANFLYUP]
  2067.             z=fscanf(f1,"%s",gg);
  2068.             GetMode(gg,&mode,line);
  2069.             line++;
  2070.             if(gg[0]=='/'||gg[0]==0){
  2071.                 NLine(f1);
  2072.                 break;
  2073.             };
  2074.             if(mode==53){
  2075.                 zz1=SearchStr(mnm,gg,nmnm);
  2076.                 if(zz1==-1){
  2077.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2078.                     Errx(gz);
  2079.                 };
  2080.                 NLine(f1);
  2081.                 nat->Mon[zz1]->CanFly=true;
  2082.             };
  2083.             break;
  2084.         case 54://[WALLKILLER]
  2085.             z=fscanf(f1,"%s",gg);
  2086.             GetMode(gg,&mode,line);
  2087.             line++;
  2088.             if(gg[0]=='/'||gg[0]==0){
  2089.                 NLine(f1);
  2090.                 break;
  2091.             };
  2092.             if(mode==54){
  2093.                 zz1=SearchStr(mnm,gg,nmnm);
  2094.                 if(zz1==-1){
  2095.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2096.                     Errx(gz);
  2097.                 };
  2098.                 NLine(f1);
  2099.                 nat->Mon[zz1]->CanAttWall=true;
  2100.             };
  2101.             break;
  2102.         case 55://[FEAR]
  2103.             z=fscanf(f1,"%s",gg);
  2104.             GetMode(gg,&mode,line);
  2105.             line++;
  2106.             if(gg[0]=='/'||gg[0]==0){
  2107.                 NLine(f1);
  2108.                 break;
  2109.             };
  2110.             if(mode==55){
  2111.                 zz1=SearchStr(mnm,gg,nmnm);
  2112.                 if(zz1==-1){
  2113.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2114.                     Errx(gz);
  2115.                 };
  2116.                 NLine(f1);
  2117.                 nat->Mon[zz1]->CanFear=true;
  2118.             };
  2119.             break;
  2120.         case 56://[USEMAGIC]
  2121.             z=fscanf(f1,"%s",gg);
  2122.             GetMode(gg,&mode,line);
  2123.             line++;
  2124.             if(gg[0]=='/'||gg[0]==0){
  2125.                 NLine(f1);
  2126.                 break;
  2127.             };
  2128.             if(mode==56){
  2129.                 zz1=SearchStr(mnm,gg,nmnm);
  2130.                 if(zz1==-1){
  2131.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2132.                     Errx(gz);
  2133.                 };
  2134.                 NLine(f1);
  2135.                 nat->Mon[zz1]->UseMagic=true;
  2136.             };
  2137.             break;
  2138.         case 57://[NUCLEAR]
  2139.             z=fscanf(f1,"%s",gg);
  2140.             GetMode(gg,&mode,line);
  2141.             line++;
  2142.             if(gg[0]=='/'||gg[0]==0){
  2143.                 NLine(f1);
  2144.                 break;
  2145.             };
  2146.             if(mode==57){
  2147.                 zz1=SearchStr(mnm,gg,nmnm);
  2148.                 if(zz1==-1){
  2149.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2150.                     Errx(gz);
  2151.                 };
  2152.                 NLine(f1);
  2153.                 nat->Mon[zz1]->canNucAttack=true;
  2154.             };
  2155.             break;
  2156.         case 58://[ANTINUCLEAR]
  2157.             z=fscanf(f1,"%s",gg);
  2158.             GetMode(gg,&mode,line);
  2159.             line++;
  2160.             if(gg[0]=='/'||gg[0]==0){
  2161.                 NLine(f1);
  2162.                 break;
  2163.             };
  2164.             if(mode==58){
  2165.                 zz1=SearchStr(mnm,gg,nmnm);
  2166.                 if(zz1==-1){
  2167.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2168.                     Errx(gz);
  2169.                 };
  2170.                 NLine(f1);
  2171.                 nat->Mon[zz1]->AntiNuc=true;
  2172.             };
  2173.             break;
  2174.         case 59://[UFO]
  2175.             z=fscanf(f1,"%s",gg);
  2176.             GetMode(gg,&mode,line);
  2177.             line++;
  2178.             if(gg[0]=='/'||gg[0]==0){
  2179.                 NLine(f1);
  2180.                 break;
  2181.             };
  2182.             if(mode==59){
  2183.                 zz1=SearchStr(mnm,gg,nmnm);
  2184.                 if(zz1==-1){
  2185.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2186.                     Errx(gz);
  2187.                 };
  2188.                 NLine(f1);
  2189.                 nat->Mon[zz1]->UFO=true;
  2190.             };
  2191.             break;
  2192.         case 60://[UFOTRANSFORM]
  2193.             z=fscanf(f1,"%s",gg);
  2194.             GetMode(gg,&mode,line);
  2195.             line++;
  2196.             if(gg[0]=='/'||gg[0]==0){
  2197.                 NLine(f1);
  2198.                 break;
  2199.             };
  2200.             if(mode==60){
  2201.                 zz1=SearchStr(mnm,gg,nmnm);
  2202.                 if(zz1==-1){
  2203.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2204.                     Errx(gz);
  2205.                 };
  2206.                 z=fscanf(f1,"%s",gg);
  2207.                 parm1=SearchStr(mnm,gg,nmnm);
  2208.                 if(zz1==-1){
  2209.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2210.                     Errx(gz);
  2211.                 };
  2212.                 NLine(f1);
  2213.                 nat->Mon[zz1]->UFOTrans=true;
  2214.                 nat->Mon[zz1]->IDforUFO=parm1;
  2215.             };
  2216.             break;
  2217.         case 61://[MAGACTOR]
  2218.             z=fscanf(f1,"%s",gg);
  2219.             GetMode(gg,&mode,line);
  2220.             line++;
  2221.             if(gg[0]=='/'||gg[0]==0){
  2222.                 NLine(f1);
  2223.                 break;
  2224.             };
  2225.             if(mode==61){
  2226.                 zz1=SearchStr(mnm,gg,nmnm);
  2227.                 if(zz1==-1){
  2228.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2229.                     Errx(gz);
  2230.                 };
  2231.                 z=fscanf(f1,"%d%d",&parm1,&parm2);
  2232.                 nat->Mon[zz1]->MagAgainst=parm1;
  2233.                 nat->Mon[zz1]->MagWith=parm2;
  2234.                 parm1=SearchStr(mnm,gg,nmnm);
  2235.                 if(zz1==-1){
  2236.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2237.                     Errx(gz);
  2238.                 };
  2239.                 NLine(f1);
  2240.             };
  2241.             break;
  2242.         case 62://[ON_HIT_SOUND]
  2243.             z=fscanf(f1,"%s",gg);
  2244.             GetMode(gg,&mode,line);
  2245.             line++;
  2246.             if(gg[0]=='/'||gg[0]==0){
  2247.                 NLine(f1);
  2248.                 break;
  2249.             };
  2250.             if(mode==62){
  2251.                 zz1=SearchStr(mnm,gg,nmnm);
  2252.                 if(zz1==-1){
  2253.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2254.                     Errx(gz);
  2255.                 };
  2256.                 z=fscanf(f1,"%s",&gx);
  2257.                 parm1=SearchStr(SoundID,gx,NSounds);
  2258.                 if(parm1==-1){
  2259.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2260.                     Errx(gy);
  2261.                 };
  2262.                 nat->Mon[zz1]->HitSound=parm1;
  2263.                 NLine(f1);
  2264.             };
  2265.             break;
  2266.         case 63://[ON_CLICK_SOUND]
  2267.             z=fscanf(f1,"%s",gg);
  2268.             GetMode(gg,&mode,line);
  2269.             line++;
  2270.             if(gg[0]=='/'||gg[0]==0){
  2271.                 NLine(f1);
  2272.                 break;
  2273.             };
  2274.             if(mode==63){
  2275.                 zz1=SearchStr(mnm,gg,nmnm);
  2276.                 if(zz1==-1){
  2277.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2278.                     Errx(gz);
  2279.                 };
  2280.                 z=fscanf(f1,"%s",&gx);
  2281.                 parm1=SearchStr(SoundID,gx,NSounds);
  2282.                 if(parm1==-1){
  2283.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2284.                     Errx(gy);
  2285.                 };
  2286.                 nat->Mon[zz1]->ClickSound=parm1;
  2287.                 NLine(f1);
  2288.             };
  2289.             break;
  2290.         case 65://[ON_ORDER_SOUND]
  2291.             z=fscanf(f1,"%s",gg);
  2292.             GetMode(gg,&mode,line);
  2293.             line++;
  2294.             if(gg[0]=='/'||gg[0]==0){
  2295.                 NLine(f1);
  2296.                 break;
  2297.             };
  2298.             if(mode==65){
  2299.                 zz1=SearchStr(mnm,gg,nmnm);
  2300.                 if(zz1==-1){
  2301.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2302.                     Errx(gz);
  2303.                 };
  2304.                 z=fscanf(f1,"%s",&gx);
  2305.                 parm1=SearchStr(SoundID,gx,NSounds);
  2306.                 if(parm1==-1){
  2307.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2308.                     Errx(gy);
  2309.                 };
  2310.                 nat->Mon[zz1]->OrderSound=parm1;
  2311.                 NLine(f1);
  2312.             };
  2313.             break;
  2314.         case 66://[ON_ATTACK_SOUND]
  2315.             z=fscanf(f1,"%s",gg);
  2316.             GetMode(gg,&mode,line);
  2317.             line++;
  2318.             if(gg[0]=='/'||gg[0]==0){
  2319.                 NLine(f1);
  2320.                 break;
  2321.             };
  2322.             if(mode==66){
  2323.                 zz1=SearchStr(mnm,gg,nmnm);
  2324.                 if(zz1==-1){
  2325.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2326.                     Errx(gz);
  2327.                 };
  2328.                 z=fscanf(f1,"%s",&gx);
  2329.                 parm1=SearchStr(SoundID,gx,NSounds);
  2330.                 if(parm1==-1){
  2331.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2332.                     Errx(gy);
  2333.                 };
  2334.                 nat->Mon[zz1]->AttackSound=parm1;
  2335.                 NLine(f1);
  2336.             };
  2337.             break;
  2338.         case 67://[ON_DEATH_SOUND]
  2339.             z=fscanf(f1,"%s",gg);
  2340.             GetMode(gg,&mode,line);
  2341.             line++;
  2342.             if(gg[0]=='/'||gg[0]==0){
  2343.                 NLine(f1);
  2344.                 break;
  2345.             };
  2346.             if(mode==67){
  2347.                 zz1=SearchStr(mnm,gg,nmnm);
  2348.                 if(zz1==-1){
  2349.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2350.                     Errx(gz);
  2351.                 };
  2352.                 z=fscanf(f1,"%s",&gx);
  2353.                 parm1=SearchStr(SoundID,gx,NSounds);
  2354.                 if(parm1==-1){
  2355.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2356.                     Errx(gy);
  2357.                 };
  2358.                 nat->Mon[zz1]->DeathSound=parm1;
  2359.                 NLine(f1);
  2360.             };
  2361.             break;
  2362.         case 68://[ON_BORN_SOUND]
  2363.             z=fscanf(f1,"%s",gg);
  2364.             GetMode(gg,&mode,line);
  2365.             line++;
  2366.             if(gg[0]=='/'||gg[0]==0){
  2367.                 NLine(f1);
  2368.                 break;
  2369.             };
  2370.             if(mode==68){
  2371.                 zz1=SearchStr(mnm,gg,nmnm);
  2372.                 if(zz1==-1){
  2373.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2374.                     Errx(gz);
  2375.                 };
  2376.                 z=fscanf(f1,"%s",&gx);
  2377.                 parm1=SearchStr(SoundID,gx,NSounds);
  2378.                 if(parm1==-1){
  2379.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2380.                     Errx(gy);
  2381.                 };
  2382.                 nat->Mon[zz1]->BornSound=parm1;
  2383.                 NLine(f1);
  2384.             };
  2385.             break;
  2386.         case 69://[ON_TREE_SOUND]
  2387.             z=fscanf(f1,"%s",gg);
  2388.             GetMode(gg,&mode,line);
  2389.             line++;
  2390.             if(gg[0]=='/'||gg[0]==0){
  2391.                 NLine(f1);
  2392.                 break;
  2393.             };
  2394.             if(mode==69){
  2395.                 zz1=SearchStr(mnm,gg,nmnm);
  2396.                 if(zz1==-1){
  2397.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2398.                     Errx(gz);
  2399.                 };
  2400.                 z=fscanf(f1,"%s",&gx);
  2401.                 parm1=SearchStr(SoundID,gx,NSounds);
  2402.                 if(parm1==-1){
  2403.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2404.                     Errx(gy);
  2405.                 };
  2406.                 nat->Mon[zz1]->TreeSound=parm1;
  2407.                 NLine(f1);
  2408.             };
  2409.             break;
  2410.         case 70://[ON_GOLD_SOUND]
  2411.             z=fscanf(f1,"%s",gg);
  2412.             GetMode(gg,&mode,line);
  2413.             line++;
  2414.             if(gg[0]=='/'||gg[0]==0){
  2415.                 NLine(f1);
  2416.                 break;
  2417.             };
  2418.             if(mode==70){
  2419.                 zz1=SearchStr(mnm,gg,nmnm);
  2420.                 if(zz1==-1){
  2421.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2422.                     Errx(gz);
  2423.                 };
  2424.                 z=fscanf(f1,"%s",&gx);
  2425.                 parm1=SearchStr(SoundID,gx,NSounds);
  2426.                 if(parm1==-1){
  2427.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2428.                     Errx(gy);
  2429.                 };
  2430.                 nat->Mon[zz1]->GoldSound=parm1;
  2431.                 NLine(f1);
  2432.             };
  2433.             break;
  2434.         case 71://[SOUNDEFFECTS]
  2435.             z=fscanf(f1,"%s",gg);
  2436.             GetMode(gg,&mode,line);
  2437.             line++;
  2438.             if(gg[0]=='/'||gg[0]==0){
  2439.                 NLine(f1);
  2440.                 break;
  2441.             };
  2442.             if(mode==71){
  2443.                 z=fscanf(f1,"%s",&gx);
  2444.                 parm1=SearchStr(SoundID,gx,NSounds);
  2445.                 if(parm1==-1){
  2446.                     sprintf(gy,"Unknown Sound ID: %s",gx);
  2447.                     Errx(gy);
  2448.                 };
  2449.                 if(!strcmp(gg,"ATTACK")){
  2450.                     nat->DangerSound=parm1;
  2451.                 }else
  2452.                 if(!strcmp(gg,"VICTORY")){
  2453.                     nat->VictorySound=parm1;
  2454.                 }else
  2455.                 if(!strcmp(gg,"CONSTRUCT")){
  2456.                     nat->ConstructSound=parm1;
  2457.                 }else
  2458.                 if(!strcmp(gg,"BUILDDIE")){
  2459.                     nat->BuildDieSound=parm1;
  2460.                 }else
  2461.                 if(!strcmp(gg,"UNITDIE")){
  2462.                     nat->UnitDieSound=parm1;
  2463.                 }else{
  2464.                     sprintf(gx,"(%s) %d :Unknown sound function : %s",fn,line,gg);
  2465.                 };
  2466.                 NLine(f1);
  2467.             };
  2468.             break;
  2469.         case 72://[CANREPAIR]
  2470.             z=fscanf(f1,"%s",gg);
  2471.             GetMode(gg,&mode,line);
  2472.             line++;
  2473.             if(gg[0]=='/'||gg[0]==0){
  2474.                 NLine(f1);
  2475.                 break;
  2476.             };
  2477.             if(mode==72){
  2478.                 zz1=SearchStr(mnm,gg,nmnm);
  2479.                 if(zz1==-1){
  2480.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2481.                     Errx(gz);
  2482.                 };
  2483.                 NLine(f1);
  2484.                 nat->Mon[zz1]->CanRepair=true;
  2485.             };
  2486.             break;
  2487.         case 73://[CANSETDEST]
  2488.             z=fscanf(f1,"%s",gg);
  2489.             GetMode(gg,&mode,line);
  2490.             line++;
  2491.             if(gg[0]=='/'||gg[0]==0){
  2492.                 NLine(f1);
  2493.                 break;
  2494.             };
  2495.             if(mode==73){
  2496.                 zz1=SearchStr(mnm,gg,nmnm);
  2497.                 if(zz1==-1){
  2498.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2499.                     Errx(gz);
  2500.                 };
  2501.                 NLine(f1);
  2502.                 nat->Mon[zz1]->CanDest=true;
  2503.             };
  2504.             break;
  2505.         case 74://[EXTMENU]
  2506.             z=fscanf(f1,"%s",gg);
  2507.             GetMode(gg,&mode,line);
  2508.             line++;
  2509.             if(gg[0]=='/'||gg[0]==0){
  2510.                 NLine(f1);
  2511.                 break;
  2512.             };
  2513.             if(mode==74){
  2514.                 zz1=SearchStr(mnm,gg,nmnm);
  2515.                 if(zz1==-1){
  2516.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2517.                     Errx(gz);
  2518.                 };
  2519.                 NLine(f1);
  2520.                 nat->Mon[zz1]->ExtMenu=true;
  2521.             };
  2522.             break;
  2523.         case 75://[RESOURCEUPGRADE]
  2524.             z=fscanf(f1,"%s",gg);
  2525.             GetMode(gg,&mode,line);
  2526.             line++;
  2527.             if(gg[0]=='/'||gg[0]==0){
  2528.                 NLine(f1);
  2529.                 break;
  2530.             };
  2531.             if(mode==75){
  2532.                 z=fscanf(f1,"%s",gx);
  2533.                 zz1=SearchStr(mnm,gx,nmnm);
  2534.                 if(zz1==-1){
  2535.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2536.                     Errx(gz);
  2537.                 };
  2538.                 NLine(f1);
  2539.                 if(!strcmp(gg,"TOWNHALL1")){
  2540.                     nat->TOWNHALL1=zz1;
  2541.                 }else
  2542.                 if(!strcmp(gg,"TOWNHALL2")){
  2543.                     nat->TOWNHALL2=zz1;
  2544.                 }else
  2545.                 if(!strcmp(gg,"LUMBERMILL")){
  2546.                     nat->LUMBERMILL=zz1;
  2547.                 }else{
  2548.                     sprintf(gz,"( %s ) %d :Invalid [RESOURCEUPGRADE] ID: %s",fn,line,gg);
  2549.                     Errx(gz);
  2550.                 };
  2551.             };
  2552.             break;
  2553.         case 76://[LOCKUNIT]
  2554.             z=fscanf(f1,"%s",gg);
  2555.             GetMode(gg,&mode,line);
  2556.             line++;
  2557.             if(gg[0]=='/'||gg[0]==0){
  2558.                 NLine(f1);
  2559.                 break;
  2560.             };
  2561.             if(mode==76){
  2562.                 z=fscanf(f1,"%s%d",gx,&parm1);
  2563.                 zz1=SearchStr(mnm,gg,nmnm);
  2564.                 if(zz1==-1){
  2565.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gg);
  2566.                     Errx(gz);
  2567.                 };
  2568.                 parm3=SearchStr(mnm,gx,nmnm);
  2569.                 if(zz1==-1){
  2570.                     sprintf(gz,"( %s ) %d :Undefined monster : %s",fn,line,gx);
  2571.                     Errx(gz);
  2572.                 };
  2573.                 NLine(f1);
  2574.                 nat->Mon[zz1]->LockID=parm3;
  2575.                 nat->Mon[zz1]->NLockUnits=parm1;
  2576.             };
  2577.             break;
  2578.         case 255://[END]
  2579.             z=EOF;
  2580.             break;
  2581.         };
  2582.     }while(z!=EOF);
  2583.     LoadAI("Default.ai",nat,mnm,nmnm,upg,nupg);
  2584.     for(int i=0;i<nmnm;i++)
  2585.         free(mnm[i]);
  2586.     for(i=0;i<nupg;i++)
  2587.         free(upg[i]);
  2588.     for(i=0;i<nico;i++)
  2589.         free(ico[i]);
  2590.     //Upgrade calculating
  2591.     for(i=0;i<nmnm;i++){
  2592.         nat->Mon[i]->NUpgrades=0;
  2593.         nat->Mon[i]->Upg=NULL;
  2594.         int nu=0;
  2595.         for(int j=0;j<nupg;j++)
  2596.             if(nat->UPG.utp[j]->MonsterID==i)nu++;
  2597.         if(nu>0){
  2598.             nat->Mon[i]->Upg=new word[nu];
  2599.             nat->Mon[i]->NUpgrades=nu;
  2600.             nu=0;
  2601.             for(int j=0;j<nupg;j++)
  2602.                 if(nat->UPG.utp[j]->MonsterID==i){
  2603.                     nat->Mon[i]->Upg[nu]=j;
  2604.                     nu++;
  2605.                 };
  2606.         };
  2607.     };
  2608. }
  2609. void LoadAI(char* fn,Nation* NT,char** Mon,word NMon,char** Upg,word NUpg){
  2610.     char gg[128];
  2611.     char gx[128];
  2612.     char gy[128];
  2613.     FILE* f1=fopen(fn,"rt");
  2614.     if(!int(f1)){
  2615.         sprintf(gg,"Could not open %s",fn);
  2616.         Errx(gg);
  2617.         return;
  2618.     };
  2619.     int i,j,zz1,z,parm1,parm2,parm3;
  2620.     char* grp[32];
  2621.     int ngrp=0;
  2622.     NT->NGrp=0;
  2623.     memset(NT->GRSize,0,sizeof NT->GRSize);
  2624.     memset(NT->GRRef,0,sizeof NT->GRRef);
  2625.     memset(NT->GAmount,0,sizeof NT->GAmount);
  2626.     NT->N_AI_Levels=0;
  2627.     memset(NT->N_AI_Req,0,sizeof NT->N_AI_Req);
  2628.     memset(NT->N_AI_Devlp,0,sizeof NT->N_AI_Devlp);
  2629.     memset(NT->AI_Req,0,sizeof NT->AI_Req);
  2630.     memset(NT->AI_Devlp,0,sizeof NT->AI_Devlp);
  2631.     int line=1;
  2632.     int mode=0;
  2633.     do{
  2634.         z=fscanf(f1,"%s",gg);
  2635.         if(z!=EOF){
  2636.             if(gg[0]=='#'){
  2637.                 if(!strcmp(gg,"#DEFGRP"))mode=1;
  2638.                 else
  2639.                 if(!strcmp(gg,"#REQ"))mode=2;
  2640.                 else
  2641.                 if(!strcmp(gg,"#TODO"))mode=3;
  2642.                 else
  2643.                 if(!strcmp(gg,"#ENDREQ")){
  2644.                         mode=4;
  2645.                         NT->N_AI_Levels++;
  2646.                 }else
  2647.                 if(!strcmp(gg,"#END"))mode=255;
  2648.                 else{
  2649.                     sprintf(gx,"%s, line %d :Undefined AI directive : %s",fn,line,gg);
  2650.                     Errx(gx);
  2651.                 };
  2652.             }else{
  2653.                 if(gg[0]!='/'){
  2654.                     switch(mode){
  2655.                     case 1:        //#DEFGRP
  2656.                         grp[ngrp]=new char[strlen(gg)+1];
  2657.                         strcpy(grp[ngrp],gg);
  2658.                         ngrp++;
  2659.                         z=fscanf(f1,"%d",&parm1);
  2660.                         NT->GRSize[NT->NGrp]=parm1;
  2661.                         NT->GRRef[NT->NGrp]=new word[parm1];
  2662.                         for(i=0;i<parm1;i++){
  2663.                             z=fscanf(f1,"%s",gy);
  2664.                             zz1=SearchStr(Mon,gy,NMon);
  2665.                             if(zz1!=-1)    NT->GRRef[NT->NGrp][i]=zz1;    
  2666.                             else{
  2667.                                 sprintf(gx,"%s, line %d :Unknown monster ID in #DEFGRP: %s",fn,line,gy);
  2668.                                 Errx(gx);
  2669.                             };
  2670.                         };
  2671.                         NLine(f1);
  2672.                         line++;
  2673.                         NT->NGrp++;
  2674.                         break;
  2675.                     case 2:
  2676.                         {//#REQ
  2677.                             int kind=0;
  2678.                             zz1=SearchStr(Mon,gg,NMon);
  2679.                             if(zz1==-1){
  2680.                                 zz1=SearchStr(Upg,gg,NUpg);
  2681.                                 if(zz1==-1){
  2682.                                     zz1=SearchStr(grp,gg,ngrp);
  2683.                                     if(zz1==-1){
  2684.                                         sprintf(gx,"%s, line %d :Unknown ID: %s",fn,line,gg);
  2685.                                         Errx(gx);
  2686.                                     }else kind=2;
  2687.                                 }else kind=1;
  2688.                             };
  2689.                             z=fscanf(f1,"%d",&parm1);
  2690.                             int nai=NT->N_AI_Levels;
  2691.                             int nar=NT->N_AI_Req[nai];
  2692.                             if(nar){
  2693.                                 sAI_Req* sar=NT->AI_Req[nai];
  2694.                                 NT->AI_Req[nai]=new sAI_Req[nar+1];
  2695.                                 memcpy(NT->AI_Req[nai],sar,nar*sizeof sAI_Req);
  2696.                                 free(sar);
  2697.                                 NT->N_AI_Req[nai]++;
  2698.                             }else{
  2699.                                 NT->AI_Req[nai]=new sAI_Req[nar+1];
  2700.                                 NT->N_AI_Req[nai]++;
  2701.                             };
  2702.                             sAI_Req* ARE=&NT->AI_Req[nai][nar];
  2703.                             ARE->Kind=kind;
  2704.                             ARE->ObjID=zz1;
  2705.                             ARE->Amount=parm1;
  2706.                             NLine(f1);
  2707.                             line++;
  2708.                         };
  2709.                         break;
  2710.                     case 3:
  2711.                         {//#TODO
  2712.                             int kind=0;
  2713.                             int CKind=0;
  2714.                             word CID;
  2715.                             zz1=SearchStr(grp,gg,ngrp);
  2716.                             if(zz1!=-1){
  2717.                                 CKind=2;
  2718.                                 CID=zz1;
  2719.                                 z=fscanf(f1,"%s",gg);
  2720.                             };
  2721.                             zz1=SearchStr(Mon,gg,NMon);
  2722.                             if(zz1==-1){
  2723.                                 zz1=SearchStr(Upg,gg,NUpg);
  2724.                                 if(zz1==-1){
  2725.                                     sprintf(gx,"%s, line %d :Unknown ID: %s",fn,line,gg);
  2726.                                     Errx(gx);
  2727.                                 }else kind=1;
  2728.                             };
  2729.                             z=fscanf(f1,"%d%d%d",&parm1,&parm2,&parm3);
  2730.                             int nai=NT->N_AI_Levels;
  2731.                             int ndr=NT->N_AI_Devlp[nai];
  2732.                             if(ndr){
  2733.                                 sAI_Devlp* sar=NT->AI_Devlp[nai];
  2734.                                 NT->AI_Devlp[nai]=new sAI_Devlp[ndr+1];
  2735.                                 memcpy(NT->AI_Devlp[nai],sar,ndr*sizeof sAI_Devlp);
  2736.                                 free(sar);
  2737.                                 NT->N_AI_Devlp[nai]++;
  2738.                             }else{
  2739.                                 NT->AI_Devlp[nai]=new sAI_Devlp[ndr+1];
  2740.                                 NT->N_AI_Devlp[nai]++;
  2741.                             };
  2742.                             sAI_Devlp* ARE=&NT->AI_Devlp[nai][ndr];
  2743.                             ARE->Kind=kind;
  2744.                             ARE->ObjID=zz1; 
  2745.                             ARE->Amount=parm1;
  2746.                             ARE->GoldPercent=div(parm2<<8,100).quot;
  2747.                             ARE->AtnPercent=div(parm3*32768,100).quot;
  2748.                             if(CKind){
  2749.                                 ARE->ConID=CID;
  2750.                                 ARE->ConKind=2;
  2751.                             }else{
  2752.                                 ARE->ConID=zz1;
  2753.                                 ARE->ConKind=0;
  2754.                             };
  2755.                             NLine(f1);
  2756.                             line++;
  2757.                         };
  2758.                         break;
  2759.                     };
  2760.                 }else{
  2761.                     NLine(f1);
  2762.                     line++;
  2763.                 };
  2764.             };
  2765.             
  2766.         };
  2767.     }while(z!=EOF&&mode!=255);
  2768.     for(int p=0;p<ngrp;p++)free(grp[p]);
  2769. };
  2770. //void LoadAllNations(){
  2771. //    
  2772. //};