001: /*bltype 002: 7 root 003: 8 trunk 004: 9 treetop 005: 10 branch 006: 11 branchEndingLeft 007: 12 branchEndingRight 008: 13 branchEndingLeftStop 009: 14 branchEndingRightStop 010: 15 treeLeaves 011: 16 treeLeavesEnding 012: 17 arcon 013: 014: int defaultStoneBlockWeight=11; 015: int defaultWoodBlockWeight=5; 016: int defaultWoodBondStrength=100; 017: const int maxTreeHeight=13; 018: const int minTreeBranchSpacing=1; 019: const int treeBranchGrowthChance=12; 020: const int minTreeBranchSpacingFromGround=1; 021: const int minTreeBranchLenght=0; 022: const int maxTreeBranchLenght=4; 023: const int treeBranchEndingChance=4; 024: const int maxTreeLeavesThick=4; 025: const int treeLeafGrowthChance=7; 026: const int treeLeafEndingChance=4; 027: const int arconGrowthChance=25; 028: 029: */ 030: 031: #define jindex x+y*width 032: int bltype[width*height]; 033: int weight[height*width]; 034: int bond_ver[height*width]; 035: int bond_hor[height*width]; 036: int architecture[height*width]; 037: 038: class architecture_bit_t 039: { 040: public: 041: static const int stationary=1; 042: static const int dynamic=2; 043: static const int bond_down=4; 044: static const int bond_right=8; 045: static const int temporary_unstable=16; 046: }; 047: architecture_bit_t architecture_bit; 048: 049: //================================================= 050: // process trees 051: for(int y=0;y<height;y++) 052: for(int x=0;x<width;x++){ 053: if(bltype[jindex]==7){ // tree root 054: // cycle through height 055: int heightReached=0; 056: for(int he=1;he<maxTreeHeight;he++){ 057: if(y-he<0)break; 058: if((bltype[x+(y-he)*width]==0 )|| 059: (bltype[x+(y-he)*width]==15)|| 060: (bltype[x+(y-he)*width]==16)|| 061: (bltype[x+(y-he)*width]==17)|| 062: (bltype[x+(y-he)*width]==11)|| 063: (bltype[x+(y-he)*width]==12)|| 064: (bltype[x+(y-he)*width]==13)|| 065: (bltype[x+(y-he)*width]==14)|| 066: (bltype[x+(y-he)*width]==10)){ 067: // free space (or leaves), need to grow 068: if(he>1){ 069: // there is Trunk and old top below 070: bltype[x+(y-he+1)*width]=8; //turn old top to trunk 071: } 072: //place treeTop 073: bltype[x+(y-he)*width]=9; 074: architecture[x+(y-he)*width]=architecture_bit.dynamic | architecture_bit.bond_down; 075: bond_ver[x+(y-he)*width]=defaultWoodBondStrength; 076: weight[x+(y-he)*width]=defaultStoneBlockWeight; 077: 078: heightReached++; 079: break; 080: }else{ 081: if((bltype[x+(y-he)*width]==8)||(bltype[x+(y-he)*width]==9)&& 082: ( (architecture[x+(y-he)*width] & architecture_bit.bond_down)!=0 ) 083: ){ // this is still tree 084: heightReached++; 085: continue; 086: }else{ // this is not tree any more 087: break; 088: } 089: } 090: } 091: int newBranchThisMove=0; 092: if(heightReached> minTreeBranchSpacingFromGround){ 093: int sideBranchFreeSpaceCounter=0; 094: int zoneStartIndex=y-minTreeBranchSpacingFromGround-1; 095: int zoneStopIndex=zoneStartIndex; 096: if(x+1<width){ 097: for(int trunkIndex=minTreeBranchSpacingFromGround+1; trunkIndex<heightReached; trunkIndex++){ 098: //find growth zone 099: 100: if((bltype[x+1+(y-trunkIndex)*width]!=10)&&(bltype[x+1+(y-trunkIndex)*width]!=12)){ 101: // TODO: add hor-bond check 102: if(sideBranchFreeSpaceCounter>0){ 103: zoneStopIndex--; 104: } 105: if(sideBranchFreeSpaceCounter==0){ 106: zoneStartIndex=y-trunkIndex; 107: zoneStopIndex=zoneStartIndex; 108: } 109: sideBranchFreeSpaceCounter++; 110: }else{ 111: sideBranchFreeSpaceCounter=0-minTreeBranchSpacing; 112: } 113: } 114: if(sideBranchFreeSpaceCounter>0){ 115: // branch-free space, can try to create branch 116: for(int branchTryIndex=zoneStartIndex;branchTryIndex>zoneStopIndex;branchTryIndex--) 117: if((rand()%treeBranchGrowthChance)==0){ 118: // create new branch 119: if((bltype[x+1+(branchTryIndex)*width]==0 )|| 120: (bltype[x+1+(branchTryIndex)*width]==15)|| 121: (bltype[x+1+(branchTryIndex)*width]==16)|| 122: (bltype[x+1+(branchTryIndex)*width]==17)) 123: { 124: bltype[x+1+(branchTryIndex)*width]=12; 125: architecture[x+1+(branchTryIndex)*width]=architecture_bit.dynamic; 126: architecture[x+(branchTryIndex)*width] |= architecture_bit.bond_right; 127: bond_hor[x+(branchTryIndex)*width]=defaultWoodBondStrength; 128: weight[x+1+(branchTryIndex)*width]=defaultStoneBlockWeight; 129: newBranchThisMove=1; 130: break; 131: } 132: } 133: }} 134: // now the same for left side 135: sideBranchFreeSpaceCounter=0; 136: zoneStartIndex=y-minTreeBranchSpacingFromGround-1; 137: zoneStopIndex=zoneStartIndex; 138: if(x-1>0){ 139: for(int trunkIndex=minTreeBranchSpacingFromGround+1; trunkIndex<heightReached; trunkIndex++){ 140: //find growth zone 141: 142: if((bltype[x-1+(y-trunkIndex)*width]!=10)&&(bltype[x-1+(y-trunkIndex)*width]!=11)){ 143: if(sideBranchFreeSpaceCounter>0){ 144: zoneStopIndex--; 145: } 146: if(sideBranchFreeSpaceCounter==0){ 147: zoneStartIndex=y-trunkIndex; 148: zoneStopIndex=zoneStartIndex; 149: } 150: sideBranchFreeSpaceCounter++; 151: }else{ 152: sideBranchFreeSpaceCounter=0-minTreeBranchSpacing; 153: } 154: } 155: if(sideBranchFreeSpaceCounter>0){ 156: // branch-free space, can try to create branch 157: for(int branchTryIndex=zoneStartIndex;branchTryIndex>zoneStopIndex;branchTryIndex--) 158: if((rand()%treeBranchGrowthChance)==0){ 159: // create new branch 160: if((bltype[x-1+(branchTryIndex)*width]==0 )|| 161: (bltype[x-1+(branchTryIndex)*width]==15)|| 162: (bltype[x-1+(branchTryIndex)*width]==16)|| 163: (bltype[x-1+(branchTryIndex)*width]==17)) 164: { 165: bltype[x-1+(branchTryIndex)*width]=11; 166: architecture[x-1+(branchTryIndex)*width]=architecture_bit.dynamic; 167: architecture[x-1+(branchTryIndex)*width] |= architecture_bit.bond_right; 168: bond_hor[x-1+(branchTryIndex)*width]=defaultWoodBondStrength; 169: weight[x-1+(branchTryIndex)*width]=defaultStoneBlockWeight; 170: newBranchThisMove=1; 171: break; 172: } 173: } 174: }} 175: } 176: if(newBranchThisMove==0){ 177: //right side 178: if(x+1<width) 179: for(int onHeight=1;onHeight<=heightReached; onHeight++){ 180: if(((bltype[x+1+(y-onHeight)*width]==10)||(bltype[x+1+(y-onHeight)*width]==12))&& 181: ((architecture[x+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 182: // if branch on this height 183: for(int branchLenght=1;branchLenght<=maxTreeBranchLenght; branchLenght++){ 184: if(x+1+branchLenght>=width)break; 185: if(((bltype[x+1+branchLenght+(y-onHeight)*width]==10)||(bltype[x+1+branchLenght+(y-onHeight)*width]==12))&& 186: ((architecture[x+branchLenght+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 187: }else{ 188: // branch end - can try to grow 189: if(!((bltype[x+1+branchLenght+(y-onHeight)*width]==0 )|| 190: (bltype[x+1+branchLenght+(y-onHeight)*width]==15)|| 191: (bltype[x+1+branchLenght+(y-onHeight)*width]==16)|| 192: (bltype[x+1+branchLenght+(y-onHeight)*width]==17) 193: ))break; 194: 195: //branch grows! 196: bltype[x+branchLenght+(y-onHeight)*width]=10; 197: bltype[x+1+branchLenght+(y-onHeight)*width]=12; 198: architecture[x+1+branchLenght+(y-onHeight)*width]=architecture_bit.dynamic; 199: architecture[x+branchLenght+(y-onHeight)*width] |= architecture_bit.bond_right; 200: bond_hor[x+branchLenght+(y-onHeight)*width]=defaultWoodBondStrength; 201: weight[x+1+branchLenght+(y-onHeight)*width]=defaultStoneBlockWeight; 202: 203: if(branchLenght>minTreeBranchLenght){ 204: if((rand()%treeBranchEndingChance)==0){ 205: bltype[x+1+branchLenght+(y-onHeight)*width]=14; 206: } 207: } 208: break; //enough for this branch 209: } 210: } 211: } 212: } 213: //left side 214: if(x-1>=0) 215: for(int onHeight=1;onHeight<=heightReached; onHeight++){ 216: if(((bltype[x-1+(y-onHeight)*width]==10)||(bltype[x-1+(y-onHeight)*width]==11))&& 217: ((architecture[x-1+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 218: // if branch on this height 219: for(int branchLenght=1;branchLenght<=maxTreeBranchLenght; branchLenght++){ 220: if(x-1-branchLenght<0)break; 221: if(((bltype[x-1-branchLenght+(y-onHeight)*width]==10)||(bltype[x-1-branchLenght+(y-onHeight)*width]==11))&& 222: ((architecture[x-1-branchLenght+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 223: }else{ 224: // branch end - can try to grow 225: if(!((bltype[x-1-branchLenght+(y-onHeight)*width]==0 )|| 226: (bltype[x-1-branchLenght+(y-onHeight)*width]==15)|| 227: (bltype[x-1-branchLenght+(y-onHeight)*width]==16)|| 228: (bltype[x-1-branchLenght+(y-onHeight)*width]==17) 229: ))break; 230: 231: //branch grows! 232: bltype[x-branchLenght+(y-onHeight)*width]=10; 233: bltype[x-1-branchLenght+(y-onHeight)*width]=11; 234: architecture[x-1-branchLenght+(y-onHeight)*width]=architecture_bit.dynamic; 235: architecture[x-1-branchLenght+(y-onHeight)*width] |= architecture_bit.bond_right; 236: bond_hor[x-1-branchLenght+(y-onHeight)*width]=defaultWoodBondStrength; 237: weight[x-1-branchLenght+(y-onHeight)*width]=defaultStoneBlockWeight; 238: 239: if(branchLenght>minTreeBranchLenght){ 240: if((rand()%treeBranchEndingChance)==0){ 241: bltype[x-1-branchLenght+(y-onHeight)*width]=13; 242: } 243: } 244: break; //enough for this branch 245: } 246: } 247: } 248: } 249: } 250: // grow leaves on trunk, to right 251: if(x+1<width) 252: for(int onHeight=2;onHeight<=heightReached; onHeight++){ 253: if(bltype[x+1+(y-onHeight)*width]==0){ 254: if((rand()%treeLeafGrowthChance)==0){ 255: if((rand()%treeLeafEndingChance)==0){ 256: bltype[x+1+(y-onHeight)*width]=16; 257: }else{ 258: bltype[x+1+(y-onHeight)*width]=15; 259: } 260: architecture[x+1+(y-onHeight)*width]=architecture_bit.dynamic; 261: architecture[x+ (y-onHeight)*width] |= architecture_bit.bond_right; 262: bond_hor [x+ (y-onHeight)*width]=defaultWoodBondStrength; 263: weight [x+1+(y-onHeight)*width]=defaultWoodBlockWeight; 264: if((y-onHeight)>0) 265: if( 266: (bltype[x+1+(y-onHeight-1)*width]==15)|| 267: (bltype[x+1+(y-onHeight-1)*width]==16)|| 268: (bltype[x+1+(y-onHeight-1)*width]==10)|| 269: (bltype[x+1+(y-onHeight-1)*width]==11)|| 270: (bltype[x+1+(y-onHeight-1)*width]==12)|| 271: (bltype[x+1+(y-onHeight-1)*width]==13)|| 272: (bltype[x+1+(y-onHeight-1)*width]==14) 273: ){ 274: architecture[x+1+(y-onHeight-1)*width] |= architecture_bit.bond_down; 275: bond_ver[x+1+(y-onHeight-1)*width]=defaultWoodBondStrength; 276: } 277: if( 278: (bltype[x+1+(y-onHeight+1)*width]==15)|| 279: (bltype[x+1+(y-onHeight+1)*width]==16)|| 280: (bltype[x+1+(y-onHeight+1)*width]==10)|| 281: (bltype[x+1+(y-onHeight+1)*width]==11)|| 282: (bltype[x+1+(y-onHeight+1)*width]==12)|| 283: (bltype[x+1+(y-onHeight+1)*width]==13)|| 284: (bltype[x+1+(y-onHeight+1)*width]==14) 285: ){ 286: architecture[x+1+(y-onHeight)*width] |= architecture_bit.bond_down; 287: bond_ver[x+1+(y-onHeight)*width]=defaultWoodBondStrength; 288: } 289: } 290: continue; 291: } 292: if((bltype[x+1+(y-onHeight)*width]==15)&& 293: ((architecture[x+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 294: // if there are leaves on this height, then grow more leaves on that side 295: for(int leavesLayer=1;leavesLayer<=maxTreeLeavesThick;leavesLayer++){ 296: if(x+leavesLayer>width)break; 297: if(bltype[x+leavesLayer+(y-onHeight)*width]!=15){ 298: if(bltype[x+leavesLayer+(y-onHeight)*width]==0) 299: if((rand()%treeLeafGrowthChance)==0){ 300: // add one more leaf block 301: if((rand()%treeLeafEndingChance)==0){ 302: bltype[x+leavesLayer+(y-onHeight)*width]=16; 303: }else{ 304: bltype[x+leavesLayer+(y-onHeight)*width]=15; 305: } 306: architecture[x+leavesLayer +(y-onHeight)*width]=architecture_bit.dynamic; 307: architecture[x+leavesLayer-1+(y-onHeight)*width] |= architecture_bit.bond_right; 308: bond_hor [x+leavesLayer-1+(y-onHeight)*width]=defaultWoodBondStrength; 309: weight [x+leavesLayer +(y-onHeight)*width]=defaultWoodBlockWeight; 310: if((y-onHeight)>0) 311: if( 312: (bltype[x+leavesLayer+(y-onHeight-1)*width]==15)|| 313: (bltype[x+leavesLayer+(y-onHeight-1)*width]==16)|| 314: (bltype[x+leavesLayer+(y-onHeight-1)*width]==10)|| 315: (bltype[x+leavesLayer+(y-onHeight-1)*width]==11)|| 316: (bltype[x+leavesLayer+(y-onHeight-1)*width]==12)|| 317: (bltype[x+leavesLayer+(y-onHeight-1)*width]==13)|| 318: (bltype[x+leavesLayer+(y-onHeight-1)*width]==14) 319: ){ 320: architecture[x+leavesLayer+(y-onHeight-1)*width] |= architecture_bit.bond_down; 321: bond_ver [x+leavesLayer+(y-onHeight-1)*width]=defaultWoodBondStrength; 322: } 323: if( 324: (bltype[x+leavesLayer+(y-onHeight+1)*width]==15)|| 325: (bltype[x+leavesLayer+(y-onHeight+1)*width]==16)|| 326: (bltype[x+leavesLayer+(y-onHeight+1)*width]==10)|| 327: (bltype[x+leavesLayer+(y-onHeight+1)*width]==11)|| 328: (bltype[x+leavesLayer+(y-onHeight+1)*width]==12)|| 329: (bltype[x+leavesLayer+(y-onHeight+1)*width]==13)|| 330: (bltype[x+leavesLayer+(y-onHeight+1)*width]==14) 331: ){ 332: architecture[x+leavesLayer+(y-onHeight)*width] |= architecture_bit.bond_down; 333: bond_ver [x+leavesLayer+(y-onHeight)*width]=defaultWoodBondStrength; 334: } 335: } 336: break; 337: } 338: } 339: } 340: } 341: // grow leaves on trunk, to left 342: if(x-1>=0) 343: for(int onHeight=2;onHeight<=heightReached; onHeight++){ 344: if(bltype[x-1+(y-onHeight)*width]==0){ 345: if((rand()%treeLeafGrowthChance)==0){ 346: if((rand()%treeLeafEndingChance)==0){ 347: bltype[x-1+(y-onHeight)*width]=16; 348: }else{ 349: bltype[x-1+(y-onHeight)*width]=15; 350: } 351: architecture[x-1+(y-onHeight)*width]=architecture_bit.dynamic; 352: architecture[x-1+(y-onHeight)*width] |= architecture_bit.bond_right; 353: bond_hor [x-1+(y-onHeight)*width]=defaultWoodBondStrength; 354: weight [x-1+(y-onHeight)*width]=defaultWoodBlockWeight; 355: if((y-onHeight)>0) 356: if( 357: (bltype[x-1+(y-onHeight-1)*width]==15)|| 358: (bltype[x-1+(y-onHeight-1)*width]==16)|| 359: (bltype[x-1+(y-onHeight-1)*width]==10)|| 360: (bltype[x-1+(y-onHeight-1)*width]==11)|| 361: (bltype[x-1+(y-onHeight-1)*width]==12)|| 362: (bltype[x-1+(y-onHeight-1)*width]==13)|| 363: (bltype[x-1+(y-onHeight-1)*width]==14) 364: ){ 365: architecture[x-1+(y-onHeight-1)*width] |= architecture_bit.bond_down; 366: bond_ver [x-1+(y-onHeight-1)*width]=defaultWoodBondStrength; 367: } 368: if( 369: (bltype[x-1+(y-onHeight+1)*width]==15)|| 370: (bltype[x-1+(y-onHeight+1)*width]==16)|| 371: (bltype[x-1+(y-onHeight+1)*width]==10)|| 372: (bltype[x-1+(y-onHeight+1)*width]==11)|| 373: (bltype[x-1+(y-onHeight+1)*width]==12)|| 374: (bltype[x-1+(y-onHeight+1)*width]==13)|| 375: (bltype[x-1+(y-onHeight+1)*width]==14) 376: ){ 377: architecture[x-1+(y-onHeight)*width] |= architecture_bit.bond_down; 378: bond_ver [x-1+(y-onHeight)*width]=defaultWoodBondStrength; 379: } 380: } 381: continue; 382: } 383: if((bltype[x-1+(y-onHeight)*width]==15)&& 384: ((architecture[x-1+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 385: // if there are leaves on this height, then grow more leaves on that side 386: for(int leavesLayer=1;leavesLayer<=maxTreeLeavesThick;leavesLayer++){ 387: if(x-leavesLayer<0)break; 388: if(bltype[x-leavesLayer+(y-onHeight)*width]!=15){ 389: if(bltype[x-leavesLayer+(y-onHeight)*width]==0) 390: if((rand()%treeLeafGrowthChance)==0){ 391: // add one more leaf block 392: if((rand()%treeLeafEndingChance)==0){ 393: bltype[x-leavesLayer+(y-onHeight)*width]=16; 394: }else{ 395: bltype[x-leavesLayer+(y-onHeight)*width]=15; 396: } 397: architecture[x-leavesLayer+(y-onHeight)*width]=architecture_bit.dynamic; 398: architecture[x-leavesLayer+(y-onHeight)*width] |= architecture_bit.bond_right; 399: bond_hor [x-leavesLayer+(y-onHeight)*width]=defaultWoodBondStrength; 400: weight [x-leavesLayer+(y-onHeight)*width]=defaultWoodBlockWeight; 401: if((y-onHeight)>0) 402: if( 403: (bltype[x-leavesLayer+(y-onHeight-1)*width]==15)|| 404: (bltype[x-leavesLayer+(y-onHeight-1)*width]==16)|| 405: (bltype[x-leavesLayer+(y-onHeight-1)*width]==10)|| 406: (bltype[x-leavesLayer+(y-onHeight-1)*width]==11)|| 407: (bltype[x-leavesLayer+(y-onHeight-1)*width]==12)|| 408: (bltype[x-leavesLayer+(y-onHeight-1)*width]==13)|| 409: (bltype[x-leavesLayer+(y-onHeight-1)*width]==14) 410: ){ 411: architecture[x-leavesLayer+(y-onHeight-1)*width] |= architecture_bit.bond_down; 412: bond_ver [x-leavesLayer+(y-onHeight-1)*width]=defaultWoodBondStrength; 413: } 414: if( 415: (bltype[x-leavesLayer+(y-onHeight+1)*width]==15)|| 416: (bltype[x-leavesLayer+(y-onHeight+1)*width]==16)|| 417: (bltype[x-leavesLayer+(y-onHeight+1)*width]==10)|| 418: (bltype[x-leavesLayer+(y-onHeight+1)*width]==11)|| 419: (bltype[x-leavesLayer+(y-onHeight+1)*width]==12)|| 420: (bltype[x-leavesLayer+(y-onHeight+1)*width]==13)|| 421: (bltype[x-leavesLayer+(y-onHeight+1)*width]==14) 422: ){ 423: architecture[x-leavesLayer+(y-onHeight)*width] |= architecture_bit.bond_down; 424: bond_ver [x-leavesLayer+(y-onHeight)*width]=defaultWoodBondStrength; 425: } 426: } 427: break; 428: } 429: } 430: } 431: } 432: //grow arcons, right 433: //first - find lower branch 434: if(x+1<width) 435: for(int onHeight=2;onHeight<=heightReached; onHeight++){ 436: if((bltype[x+1+(y-onHeight)*width]!=10)&& 437: (bltype[x+1+(y-onHeight)*width]!=12)&& 438: (bltype[x+1+(y-onHeight)*width]!=14)) continue; 439: //cycle through branch 440: for(int branchLenght=1;branchLenght<=maxTreeBranchLenght; branchLenght++){ 441: if(x+1+branchLenght>=width)break; 442: if(((bltype[x+1+branchLenght+(y-onHeight)*width]==10)|| 443: (bltype[x+1+branchLenght+(y-onHeight)*width]==12)|| 444: (bltype[x+1+branchLenght+(y-onHeight)*width]==14) 445: )&& 446: ((architecture[x+branchLenght+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 447: if( (bltype[x+1+branchLenght+(y-onHeight+1)*width]==0 )|| 448: (bltype[x+1+branchLenght+(y-onHeight+1)*width]==15)|| 449: (bltype[x+1+branchLenght+(y-onHeight+1)*width]==16)) 450: if((rand()%arconGrowthChance)==0){ 451: bltype [x+1+branchLenght+(y-onHeight+1)*width]=17; 452: architecture[x+1+branchLenght+(y-onHeight+1)*width]=architecture_bit.dynamic; 453: weight [x+1+branchLenght+(y-onHeight+1)*width]=defaultStoneBlockWeight; 454: 455: architecture[x+1+branchLenght+(y-onHeight )*width] |= architecture_bit.bond_down; 456: bond_ver [x+1+branchLenght+(y-onHeight )*width]=1; 457: 458: architecture[x +branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_right); 459: bond_hor [x +branchLenght+(y-onHeight+1)*width]=0; 460: 461: architecture[x+1+branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_down); 462: bond_ver [x+1+branchLenght+(y-onHeight+1)*width]=0; 463: 464: architecture[x+1+branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_right); 465: bond_hor [x+1+branchLenght+(y-onHeight+1)*width]=0; 466: 467: break; 468: } 469: } 470: } 471: break; 472: } 473: //grow arcons, left 474: //first - find lower branch 475: if(x-1>=0) 476: for(int onHeight=2;onHeight<=heightReached; onHeight++){ 477: if((bltype[x-1+(y-onHeight)*width]!=10)&& 478: (bltype[x-1+(y-onHeight)*width]!=11)&& 479: (bltype[x-1+(y-onHeight)*width]!=13)) continue; 480: //cycle through branch 481: for(int branchLenght=1;branchLenght<=maxTreeBranchLenght; branchLenght++){ 482: if(x-1-branchLenght<0)break; 483: if(((bltype[x-1-branchLenght+(y-onHeight)*width]==10)|| 484: (bltype[x-1-branchLenght+(y-onHeight)*width]==11)|| 485: (bltype[x-1-branchLenght+(y-onHeight)*width]==13) 486: )&& 487: ((architecture[x-1-branchLenght+(y-onHeight)*width] & architecture_bit.bond_right)!=0 )){ 488: if( (bltype[x-1-branchLenght+(y-onHeight+1)*width]==0 )|| 489: (bltype[x-1-branchLenght+(y-onHeight+1)*width]==15)|| 490: (bltype[x-1-branchLenght+(y-onHeight+1)*width]==16)) 491: if((rand()%arconGrowthChance)==0){ 492: bltype [x-1-branchLenght+(y-onHeight+1)*width]=17; 493: architecture[x-1-branchLenght+(y-onHeight+1)*width]=architecture_bit.dynamic; 494: weight [x-1-branchLenght+(y-onHeight+1)*width]=defaultStoneBlockWeight; 495: 496: architecture[x-1-branchLenght+(y-onHeight )*width] |= architecture_bit.bond_down; 497: bond_ver [x-1-branchLenght+(y-onHeight )*width]=1; 498: 499: architecture[x-1-branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_right); 500: bond_hor [x-1-branchLenght+(y-onHeight+1)*width]=0; 501: 502: architecture[x-1-branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_down); 503: bond_ver [x-1-branchLenght+(y-onHeight+1)*width]=0; 504: 505: if(x-2-branchLenght>=0){ 506: architecture[x-2-branchLenght+(y-onHeight+1)*width] &= (~architecture_bit.bond_right); 507: bond_hor [x-2-branchLenght+(y-onHeight+1)*width]=0; 508: } 509: break; 510: } 511: } 512: } 513: break; 514: } 515: } 516: if(bltype[jindex]==17){ // arcon 517: if(y+1<height){ 518: // acron grow 519: if(bltype[x+y*width+width]==1){ 520: if((rand()%arconGrowthChance)==0){ 521: bltype[jindex]=7; // make new root 522: architecture[jindex] |= architecture_bit.bond_down; 523: bond_ver [jindex]=defaultWoodBondStrength; 524: } 525: } 526: //arcon should fall through leaves 527: if((bltype[x + y * width+width]==15)|| 528: (bltype[x + y * width+width]==16)) 529: { 530: bltype[x + y * width+width]=0; 531: architecture[x + y * width ] &= (~architecture_bit.bond_down); 532: architecture[x + y * width + width] &= (~architecture_bit.dynamic); 533: architecture[x + y * width + width] &= (~architecture_bit.bond_down); 534: architecture[x + y * width + width] &= (~architecture_bit.bond_right); 535: if(x-1>=0){ 536: architecture[x-1+y * width + width] &= (~architecture_bit.bond_right); 537: } 538: } 539: } 540: } 541: }