[138] | 1 | // This file is a part of the Framsticks GDK. |
---|
| 2 | // Copyright (C) 2002-2014 Maciej Komosinski and Szymon Ulatowski. See LICENSE.txt for details. |
---|
| 3 | // Refer to http://www.framsticks.com/ for further information. |
---|
| 4 | |
---|
| 5 | #include "autoname.h" |
---|
| 6 | #include "common/nonstd_stl.h" |
---|
| 7 | #include <ctype.h> |
---|
| 8 | |
---|
| 9 | SString AutoName::makeName(Model &model) |
---|
| 10 | { |
---|
| 11 | SString t; |
---|
| 12 | t=firstName(model); |
---|
| 13 | t+=' '; |
---|
| 14 | t+=lastName(model); |
---|
| 15 | return t; |
---|
| 16 | } |
---|
| 17 | |
---|
| 18 | /////////////////////////// |
---|
| 19 | |
---|
| 20 | static char* cat_syl(char* str,unsigned int x) |
---|
| 21 | { |
---|
| 22 | static char sp[]="bcdfghklmnprstwz",sa[]="aeiouy"; |
---|
| 23 | x%=6*16; |
---|
| 24 | str[0]=sa[x%6]; |
---|
| 25 | if (x>5) |
---|
| 26 | {str[1]=sp[x/6]; str[2]=0; return str+2;} |
---|
| 27 | else |
---|
| 28 | {str[1]=0; return str+1;} |
---|
| 29 | } |
---|
| 30 | |
---|
| 31 | SString AutoName::firstName(Model& model) |
---|
| 32 | { |
---|
| 33 | char buf[8]; |
---|
| 34 | unsigned int s1=0,s2=0,s3=0; |
---|
| 35 | const char *x=model.getGeno().getGene(); |
---|
| 36 | for (;*x;x++) { s1+=*x; s2=s2**x+*x; s3=(s3^*x)+*x; } |
---|
| 37 | char* t=buf; |
---|
| 38 | t=cat_syl(t,s1); |
---|
| 39 | t=cat_syl(t,s2); |
---|
| 40 | t=cat_syl(t,s3); |
---|
| 41 | buf[0]=(char)toupper(buf[0]); |
---|
| 42 | return SString(buf); |
---|
| 43 | } |
---|
| 44 | |
---|
| 45 | static void przeplatanka(char *out,char *in1,char *in2) |
---|
| 46 | { |
---|
| 47 | int d1=strlen(in1),d2=strlen(in2); |
---|
| 48 | int p1=0,p2=0; |
---|
| 49 | int pp=d1+d2; |
---|
| 50 | int i,p; |
---|
| 51 | if (d2<d1) |
---|
| 52 | { |
---|
| 53 | int t=d2; d2=d1; d1=t; |
---|
| 54 | char *c=in1; in1=in2; in2=c; |
---|
| 55 | } |
---|
| 56 | if (pp) |
---|
| 57 | for (i=0;i<=pp;i++) |
---|
| 58 | { |
---|
| 59 | p=(i*d1)/pp-1; for (;p1<=p;p1++) *(out++)=*(in1++); |
---|
| 60 | p=(i*d2)/pp-1; for (;p2<=p;p2++) *(out++)=*(in2++); |
---|
| 61 | } |
---|
| 62 | *out=0; |
---|
| 63 | } |
---|
| 64 | |
---|
| 65 | SString AutoName::lastName(Model& model) |
---|
| 66 | { |
---|
| 67 | char Sam[]="yeaou"; |
---|
| 68 | char Sp[]="shtkdgmr"; |
---|
| 69 | |
---|
| 70 | #define NAME_MAXLENBODY 5 |
---|
| 71 | #define NAME_MAXLENBRAIN 5 |
---|
| 72 | #define NAME_BODYLEN 0.8 |
---|
| 73 | #define NAME_BRAINLEN 0.8 |
---|
| 74 | #define NAME_BODYMASS 1.0 |
---|
| 75 | #define NAME_BRAININP 1.0 |
---|
| 76 | |
---|
| 77 | char naz[NAME_MAXLENBODY+NAME_MAXLENBRAIN+1]; |
---|
| 78 | int poz,nextpoz,i; |
---|
| 79 | |
---|
| 80 | double w; |
---|
| 81 | int cialo=-1; |
---|
| 82 | int mozg=-1; |
---|
| 83 | |
---|
| 84 | char tmpc[NAME_MAXLENBODY+1],tmpm[NAME_MAXLENBRAIN+1]; |
---|
| 85 | |
---|
| 86 | if (model.getPartCount()>0) |
---|
| 87 | { |
---|
| 88 | cialo=min((int)(sqrt(double(model.getPartCount())-1)*NAME_BODYLEN),NAME_MAXLENBODY-1); |
---|
| 89 | poz=0; |
---|
| 90 | for (i=0;i<=cialo;i++) // budowanie "opisu" ciala |
---|
| 91 | { |
---|
| 92 | nextpoz=((model.getPartCount())*(i+1))/(cialo+1)-1; |
---|
| 93 | w=1.0; |
---|
| 94 | for (;poz<=nextpoz;poz++) w=max(w,model.getPart(poz)->mass); |
---|
| 95 | tmpc[i]=Sp[min(int((w-1.0)*NAME_BODYMASS),int(sizeof(Sp))-2)]; |
---|
| 96 | } |
---|
| 97 | tmpc[i]=0; |
---|
| 98 | } |
---|
| 99 | else tmpc[0]=0; |
---|
| 100 | |
---|
| 101 | int wint; |
---|
| 102 | |
---|
| 103 | if (model.getNeuroCount()>0) |
---|
| 104 | { |
---|
| 105 | mozg=min((int)(sqrt((double)model.getNeuroCount())*NAME_BRAINLEN),NAME_MAXLENBRAIN-1); |
---|
| 106 | poz=0; |
---|
| 107 | for (i=0;i<=mozg;i++) // budowanie "opisu" mozgu |
---|
| 108 | { |
---|
| 109 | nextpoz=(model.getNeuroCount()*(i+1))/(mozg+1)-1; |
---|
| 110 | wint=0; |
---|
| 111 | for (;poz<=nextpoz;poz++) wint=max(wint,model.getNeuro(poz)->getInputCount()); |
---|
| 112 | tmpm[i]=Sam[min(int(wint*NAME_BRAININP),int(sizeof(Sam))-2)]; |
---|
| 113 | } |
---|
| 114 | tmpm[i]=0; |
---|
| 115 | } |
---|
| 116 | else tmpm[0]=0; |
---|
| 117 | |
---|
| 118 | if ((mozg+1) < ((cialo+2)/2)) |
---|
| 119 | { |
---|
| 120 | for (i=mozg+1;i<=cialo/2;i++) tmpm[i]='i'; |
---|
| 121 | tmpm[i]=0; |
---|
| 122 | } |
---|
| 123 | |
---|
| 124 | przeplatanka(naz,tmpc,tmpm); |
---|
| 125 | |
---|
| 126 | naz[0]=(char)toupper(naz[0]); |
---|
| 127 | return SString(naz); |
---|
| 128 | } |
---|
| 129 | |
---|
| 130 | |
---|
| 131 | |
---|