public WorldSettings(int seed, int worldBoardWidth, int worldBoardHeight)
        {
            Seed             = seed;
            WorldBoardWidth  = worldBoardWidth;
            WorldBoardHeight = worldBoardHeight;
            GlobalRandom     = new InternalRandom(seed);
            TerrainGen       = new TerrainGenerator(GlobalRandom);
            WorldMapScale    = 1;
            ContinentTilesPerCivilization = 2000;

            ContinentTilesPerArtifact = 1500;
            ContinentTilesPerResource = 100;
            NamesGenerator            = new NamesGenerator();

            //TODO move to files
            CultureTemplates.Add(new CultureTemplate("Slavic",
                                                     "abakan abaza abdulino abinsk achinsk adygeysk agidel agryz akhtubinsk aksay alagir alapayevsk alatyr aldan aleksin alexandrov alexandrovsk alexeyevka aleysk almetyevsk alzamay amursk anadyr anapa andreapol angarsk aniva apatity aprelevka apsheronsk aramil ardatov ardon argun arkadak arkhangelsk armavir arsenyev arsk artyom artyomovsk artyomovsky arzamas asbest asha asino astrakhan atkarsk aznakayevo azov babayevo babushkin bagrationovsk bakal baksan balabanovo balakhna balakovo balashikha balashov baley baltiysk barabinsk barnaul barysh bataysk bavly baykalsk baymak belebey belgorod belinsky belogorsk belokurikha belomorsk belorechensk beloretsk belousovo belovo beloyarsky belozersk bely belyov berdsk berezniki berezovsky berezovsky beslan bezhetsk bikin bilibino birobidzhan birsk biryuch biryusinsk biysk blagodarny blagoveshchensk blagoveshchensk bobrov bodaybo bogdanovich bogoroditsk bogorodsk bogotol boguchar boksitogorsk bolgar bolkhov bologoye bolokhovo bolotnoye bor borisoglebsk borodino borovichi borovsk borzya bratsk bronnitsy bryansk budyonnovsk bugulma buguruslan buinsk buturlinovka buy buynaksk buzuluk chadan chapayevsk chaplygin chaykovsky chebarkul cheboksary chegem chekalin chekhov chelyabinsk cherdyn cheremkhovo cherepanovo cherepovets cherkessk chernogolovka chernogorsk chernushka chernyakhovsk chistopol chita chkalovsk chudovo chukhloma chulym chusovoy chyormoz dalmatovo dalnegorsk dalnerechensk danilov dankov davlekanovo dedovsk degtyarsk demidov derbent desnogorsk digora dimitrovgrad divnogorsk dmitriyev dmitrov dmitrovsk dno dobryanka dolgoprudny dolinsk domodedovo donetsk donskoy dorogobuzh drezna dubna dubovka dudinka dukhovshchina dyatkovo dyurtyuli dzerzhinsk dzerzhinsky elektrogorsk elektrostal elektrougli elista engels ertil fatezh fokino fokino frolovo fryazino furmanov gadzhiyevo gagarin galich gatchina gay gdov gelendzhik georgiyevsk glazov golitsyno gorbatov gornozavodsk gornyak gorodets gorodishche gorodovikovsk gorokhovets grayvoron gremyachinsk grozny gryazi gryazovets gubakha gubkin gubkinsky gudermes gukovo gulkevichi guryevsk guryevsk gusev gusinoozyorsk gvardeysk igarka ilansky innopolis insar inta inza ipatovo irbit irkutsk ishim ishimbay isilkul iskitim istra ivangorod ivanovo ivanteyevka ivdel izberbash izhevsk izobilny kachkanar kadnikov kalach kalachinsk kaliningrad kalininsk kaltan kaluga kalyazin kambarka kamenka kamennogorsk kameshkovo kamyshin kamyshlov kamyzyak kanash kandalaksha kansk karabanovo karabash karabulak karachayevsk karachev karasuk kargat kargopol karpinsk kartaly kashin kashira kasimov kasli kaspiysk kataysk kazan kedrovy kem kemerovo khabarovsk khadyzhensk kharabali kharovsk khasavyurt khilok khimki kholm kholmsk khotkovo khvalynsk kimovsk kimry kinel kineshma kingisepp kirensk kireyevsk kirillov kirishi kirov kirov kirovgrad kirovsk kirovsk kirs kirsanov kirzhach kiselyovsk kislovodsk kizel kizilyurt kizlyar klimovsk klin klintsy knyaginino kodinsk kogalym kokhma kola kolchugino kologriv kolomna kolpashevo kolpino kommunar komsomolsk konakovo kondopoga kondrovo konstantinovsk kopeysk korablino korenovsk korkino korocha korolyov korsakov koryazhma kosteryovo kostomuksha kostroma kotelnich kotelniki kotelnikovo kotlas kotovo kotovsk kovdor kovrov kovylkino kozelsk kozlovka kozmodemyansk krasavino krasnoarmeysk krasnoarmeysk krasnodar krasnogorsk krasnokamensk krasnokamsk krasnoslobodsk krasnoslobodsk krasnoturyinsk krasnoufimsk krasnouralsk krasnovishersk krasnoyarsk krasnozavodsk krasnoznamensk krasnoznamensk kremyonki kronstadt kropotkin krymsk kstovo kubinka kudymkar kulebaki kumertau kungur kupino kurchatov kurgan kurganinsk kurilsk kurlovo kurovskoye kursk kurtamysh kusa kushva kuvandyk kuvshinovo kuybyshev kuznetsk kyakhta kyshtym kyzyl labinsk labytnangi ladushkin lagan laishevo lakhdenpokhya lakinsk langepas lebedyan leninogorsk leninsk lensk lermontov lesnoy lesosibirsk lesozavodsk lgov likhoslavl lipetsk lipki liski livny lobnya lomonosov luga lukhovitsy lukoyanov luza lyantor lyskovo lysva lytkarino lyuban lyubertsy lyubim lyudinovo magadan magas magnitogorsk makarov makaryev makhachkala makushino malgobek malmyzh maloarkhangelsk maloyaroslavets mamadysh mamonovo manturovo mariinsk marks maykop maysky mednogorsk medvezhyegorsk medyn megion melenki meleuz mendeleyevsk menzelinsk meshchovsk mezen mezhdurechensk mezhgorye mglin miass michurinsk mikhaylov mikhaylovka mikhaylovsk mikhaylovsk mikun millerovo minusinsk minyar mirny mirny mogocha monchegorsk morozovsk morshansk mosalsk moscow moskovsky mozdok mozhaysk mozhga mtsensk murashi muravlenko murmansk murom myshkin myski mytishchi nadym nakhodka nalchik narimanov nartkala navashino navoloki nazarovo nazran nazyvayevsk neftekamsk neftekumsk nefteyugansk nelidovo neman nerchinsk nerekhta neryungri nesterov nevel nevelsk nevinnomyssk nevyansk neya nikolayevsk nikolsk nikolsk nikolskoye nizhnekamsk nizhneudinsk nizhnevartovsk noginsk nolinsk norilsk novoalexandrovsk novoaltaysk novoanninsky novocheboksarsk novocherkassk novodvinsk novokhopyorsk novokubansk novokuybyshevsk novokuznetsk novomichurinsk novomoskovsk novopavlovsk novorossiysk novorzhev novoshakhtinsk novosibirsk novosil novosokolniki novotroitsk novoulyanovsk novouralsk novouzensk novovoronezh novozybkov noyabrsk nurlat nyagan nyandoma nyazepetrovsk nytva nyurba ob obluchye obninsk oboyan ochyor odintsovo okha okhansk oktyabrsk oktyabrsky okulovka olenegorsk olonets olyokminsk omsk omutninsk onega opochka orenburg orlov orsk oryol osa osinniki ostashkov ostrogozhsk ostrov ostrovnoy otradnoye otradny ozherelye ozyorsk ozyorsk ozyory pallasovka partizansk pavlovo pavlovsk pavlovsk pechora pechory penza peresvet perevoz perm pervomaysk pervouralsk pestovo petergof petrovsk petrozavodsk petukhovo petushki pevek pikalyovo pionersky pitkyaranta plast plavsk plyos pochep pochinok podolsk podporozhye pokachi pokhvistnevo pokrov pokrovsk polessk polevskoy polyarny polysayevo porkhov poronaysk poshekhonye povorino pravdinsk primorsk priozersk privolzhsk prokhladny prokopyevsk proletarsk protvino pskov puchezh pudozh pugachyov pushchino pushkin pushkino pustoshka pyatigorsk pytalovo raduzhny raduzhny ramenskoye rasskazovo raychikhinsk reutov revda rezh rodniki roshal roslavl rossosh rostov rtishchevo rubtsovsk rudnya ruza ruzayevka ryazan ryazhsk rybinsk rybnoye rylsk rzhev safonovo salair salavat salekhard salsk samara saransk sarapul saratov sarov sasovo satka sayanogorsk sayansk sebezh segezha seltso semikarakorsk semiluki semyonov sengiley serafimovich serdobsk sergach serov serpukhov sertolovo sestroretsk severobaykalsk severodvinsk severomorsk severouralsk seversk sevsk shadrinsk shagonar shakhty shakhtyorsk shakhunya shali sharya sharypovo shatsk shatura shcherbinka shchigry shchuchye shchyokino shchyolkovo shebekino shelekhov shenkursk shikhany shilka shimanovsk shlisselburg shumerlya shumikha shuya sibay sim skopin skovorodino slantsy slavgorod slavsk slobodskoy slyudyanka smolensk snezhinsk snezhnogorsk sobinka sochi sokol sokolniki soligalich solikamsk solnechnogorsk soltsy solvychegodsk sorochinsk sorsk sortavala sosensky sosnogorsk sosnovka sosnovoborsk sovetsk sovetsk sovetsk sovetsky spassk srednekolymsk sredneuralsk sretensk staritsa starodub stavropol sterlitamak strezhevoy stroitel strunino stupino sudogda sudzha sukhinichi suoyarvi surazh surgut surovikino sursk susuman suvorov suzdal svetlogorsk svetlograd svetly svetogorsk svirsk svobodny syasstroy sychyovka syktyvkar sysert syzran taganrog taldom talitsa tambov tara tarusa tashtagol tatarsk tavda tayga tayshet teberda temnikov temryuk terek tetyushi teykovo tikhoretsk tikhvin timashyovsk tobolsk toguchin tolyatti tomari tommot tomsk topki toropets torzhok tosno totma troitsk troitsk trubchevsk tryokhgorny tsimlyansk tsivilsk tuapse tula tulun turan turinsk tutayev tuymazy tver tynda tyrnyauz tyukalinsk tyumen uchaly udachny udomlya ufa uglegorsk uglich ukhta ulyanovsk unecha uray uren uryupinsk urzhum usinsk usman usolye ussuriysk ustyuzhna uvarovo uyar uzhur uzlovaya valday valuyki velizh velsk venyov vereshchagino vereya verkhneuralsk verkhoturye verkhoyansk vesyegonsk vetluga vichuga vidnoye vikhorevka vilyuchinsk vilyuysk vladikavkaz vladimir vladivostok volchansk volgodonsk volgograd volgorechensk volkhov volodarsk vologda volokolamsk volosovo volsk volzhsk volzhsky vorkuta voronezh vorsma voskresensk votkinsk vsevolozhsk vuktyl vyazemsky vyazma vyazniki vyborg vyksa vysokovsk vysotsk vytegra yadrin yakhroma yakutsk yalutorovsk yanaul yaransk yaroslavl yarovoye yartsevo yasnogorsk yasny yefremov yegoryevsk yekaterinburg yelabuga yelets yelizovo yelnya yemanzhelinsk yemva yeniseysk yermolino yershov yessentuki yeysk yubileyny yugorsk yukhnov yurga yuryevets yuryuzan yuzha yuzhnouralsk zadonsk zainsk zakamensk zaozyorny zaozyorsk zapolyarny zaraysk zarechny zarechny zarinsk zavitinsk zavodoukovsk zavolzhsk zavolzhye zelenodolsk zelenogorsk zelenogorsk zelenograd zelenogradsk zelenokumsk zernograd zeya zheleznodorozhny zheleznogorsk zheleznogorsk zheleznovodsk zherdevka zhigulyovsk zhirnovsk zhizdra zhukov zhukovka zhukovsky zima zlatoust zlynka zmeinogorsk znamensk zubtsov zuyevka zvenigorod zvenigovo zverevo"
                                                     ));

            CultureTemplates.Add(new CultureTemplate("English",
                                                     "abingdon accrington acle acton adlington alcester aldeburgh aldershot alford alfreton alnwick alsager alston alton altrincham amble ambleside amersham amesbury ampthill andover appleby arlesey arundel ashbourne ashburton ashby ashford ashington ashton askern aspatria atherstone attleborough axbridge axminster aylesbury aylsham bacup bakewell bampton banbury barking barnard barnes barnet barnoldswick barnsley barnstaple barrow barton basildon basingstoke batley battle bawtry beaconsfield beaminster bebington beccles beckenham bedale bedford bedworth belper bentham berkeley berkhamsted berwick beverley bewdley bexhill bexley bicester biddulph bideford biggleswade billericay billingham bilston bingham bingley birchwood birkenhead bishop blackburn blackpool blackrod blackwater blandford bletchley blyth bodmin bognor bollington bolsover bolton bootle bordon boroughbridge boston bottesford bourne bournemouth bovey brackley bracknell bradford brading bradley bradninch braintree brampton brandon braunstone brentford brentwood bridgnorth bridgwater bridlington bridport brierfield brierley brigg brighouse brightlingsea brixham broadstairs bromborough bromley bromsgrove bromyard broseley brough broughton bruton buckfastleigh buckingham bude budleigh bulwell bungay buntingford burford burgess burgh burnham burnley burntwood burslem burton burton bury bury bushey buxton caistor callington calne camborne camelford cannock canvey carlton carnforth carshalton carterton castle castleford chagford chapel chard charlbury chatham chatteris cheadle cheltenham chertsey chesham cheshunt chester chesterfield chickerell chilton chingford chippenham chipping chipping chipping chorley chorleywood christchurch chudleigh chulmleigh church cinderford cirencester clare clay cleator cleethorpes cleobury clevedon clitheroe clun cockermouth coggeshall colburn colchester coleford coleshill colne colyton congleton conisbrough corbridge corby corringham corsham cotgrave coulsdon cowes cramlington cranbrook craven crawley crediton crewe crewkerne cricklade cromer crook crosby crowborough crowland crowle croydon cullompton dagenham dalton darley darlington dartford dartmouth darwen daventry dawley dawlish deal denholme dereham desborough devizes dewsbury didcot dinnington diss doncaster dorchester dorking dover dovercourt downham driffield droitwich dronfield dudley dukinfield dulverton dunstable dunwich dursley ealing earby earl earley easingwold east east east east eastbourne eastleigh eastwood eccles eccleshall edenbridge edgware edmonton egremont elland ellesmere ellesmere elstree emsworth enfield epping epworth erith eton evesham exmouth eye fairford fakenham falmouth fareham faringdon farnham faversham fazeley featherstone felixstowe ferndown ferryhill filey filton finchley fleet fleetwood flitwick folkestone fordbridge fordingbridge fordwich fowey framlingham frinton frodsham frome gainsborough garstang gateshead gillingham gillingham glastonbury glossop godalming godmanchester goole gorleston gosport grange grantham grassington gravesend grays great great great greater grimsby guildford guisborough hadleigh hailsham halesowen halesworth halewood halifax halstead haltwhistle harlow harpenden harrogate harrow hartland hartlepool harwich harworth haslemere haslingden hastings hatfield hatfield hatherleigh havant haverhill hawes hawkinge haxby hayle haywards heanor heathfield hebden hedge hednesford hedon helmsley helston hemel hemsworth hendon henley hertford hessle hetton hexham heywood high higham highbridge highworth hinckley hingham hitchin hoddesdon holbeach holsworthy holt honiton horley horncastle hornsea hornsey horsforth horsham horwich houghton hounslow howden huddersfield hungerford hunstanton huntingdon hyde hythe ilford ilfracombe ilkeston ilkley ilminster immingham ingleby ipswich irthlingborough ivybridge jarrow keighley kempston kendal kenilworth kesgrave keswick kettering keynsham kidderminster kidsgrove kimberley kingsbridge kingsteignton kingston kington kirkby kirkbymoorside kirkham kirton knaresborough knutsford langport launceston leatherhead lechlade ledbury leek leigh leighton leiston leominster letchworth lewes leyburn leyton liskeard littlehampton loddon loftus long longridge longtown looe lostwithiel loughborough loughton louth lowestoft ludgershall ludlow luton lutterworth lydd lydney lyme lymington lynton lytchett lytham mablethorpe macclesfield madeley maghull maidenhead maidstone maldon malmesbury maltby malton malvern manningtree mansfield marazion march margate marlborough marlow maryport masham matlock medlar melksham meltham melton mere mexborough middleham middlesbrough middleton middlewich midhurst midsomer mildenhall millom milton minchinhampton minehead minster mirfield mitcham mitcheldean modbury morecambe moreton moretonhampstead morley morpeth mossley much nailsea nailsworth nantwich needham nelson neston newark newbiggin newbury newcastle newent newhaven newlyn newmarket newport newquay newton normanton north northallerton northam northampton northfleet northleach northwich norton nuneaton oakengates oakham okehampton oldbury oldham ollerton olney ongar orford ormskirk ossett oswestry otley ottery oundle paddock padiham padstow paignton painswick partington patchway pateley peacehaven penistone penkridge penrith penryn penwortham penzance pershore peterlee petersfield petworth pickering plympton pocklington polegate pontefract ponteland poole porthleven portishead portland potton poynton preesall prescot princes prudhoe pudsey queenborough radstock ramsey ramsgate raunds rawtenstall rayleigh reading redcar redditch redenhall redruth reepham reigate richmond richmond ringwood ripley rochdale rochester rochford romford romsey ross rothbury rotherham rothwell rowley royal royston rugby rugeley rushden ryde rye saffron salcombe sale saltash sandbach sandhurst sandiacre sandown sandwich sandy sawbridgeworth saxmundham scarborough scunthorpe seaford seaham seaton sedbergh sedgefield selby selsey settle sevenoaks shaftesbury shanklin shefford shepshed shepton sherborne sheringham shifnal shildon shipston shirebrook shoreham shrewsbury sidmouth silloth silsden sittingbourne skegness skelmersdale skelton skipton sleaford slough smethwick snaith snodland soham solihull somerton southall southam southborough southend southgate southminster southport southsea southwell southwick southwold spalding spennymoor spilsby sprowston stafford staines stainforth stalbridge stalham stalybridge stamford stanhope stanley stapleford staveley stevenage steyning stockport stocksbridge stockton stone stonehouse stony stotfold stourbridge stourport stow stowmarket stratford stretford strood stroud sturminster sudbury surbiton sutton sutton swaffham swanage swanley swanscombe swindon syston tadcaster tadley tamworth taunton tavistock teignmouth telford telscombe tenbury tenterden tetbury tewkesbury thame thatcham thaxted thetford thirsk thornaby thornbury thorne thorpe thrapston tickhill tidworth tipton tisbury tiverton todmorden tonbridge topsham torpoint torquay totnes tottenham totton tow towcester town tring trowbridge twickenham tynemouth uckfield ulverston uppingham upton uttoxeter uxbridge ventnor verwood wadebridge wadhurst wainfleet wallasey wallingford wallsend walsall waltham waltham walthamstow walton wantage ware wareham warminster warrington warwick washington watchet watford wath watlington watton wednesbury wellingborough wellington wells welwyn wembley wendover westbury westerham westhoughton weston wetherby weybridge weymouth whaley whitby whitchurch whitehaven whitehill whitnash whittlesey whitworth wickham wickwar widnes wigan wigton willenhall willesden wilmslow wilton wimbledon wimborne wincanton winchcombe winchelsea windermere windsor winsford winslow winterton wirksworth wisbech witham withernsea witney wiveliscombe wivenhoe woburn woburn woking wokingham wolsingham wolverton wood woodbridge woodley woodstock wooler workington worksop worthing wotton wragby wymondham yarm yarmouth yate yateley yeovil"
                                                     ));

            CultureTemplates.Add(new CultureTemplate("Asian",
                                                     "aksu alashankou altay anda anda andong anguo ankang anlu anning anqing anqiu anshan anshun anyang aral artux arxan baicheng baise baishan baiyin baoding baoji baoshan baotou barkam bayannur bazhong bazhou beian beihai beijing beiliu beining beipiao beitun beizhen bengbu benxi bijie binzhou bole botou bozhou cangzhou cenxi chamdo changchun changde changge changji changle changning changsha changshu changyi changzhi changzhou chaohu chaoyang chaozhou chengde chengdu chenzhou chibi chifeng chishui chizhou chongqing chongzhou chongzuo chuxiong chuzhou cixi daan dali dalian dandong dangyang danjiangkou danyang danzhou daqing dashiqiao datong daxian daye dayong dazhou dehui delingha dengfeng dengta dengzhou dexing deyang dezhou diaobingshan dihua dingxi dingzhou dongfang donggang dongguan dongning dongtai dongxing dongyang dongying dujiangyan dukou dunhua dunhuang duyun emeishan enping enshi erenhot ergun ezhou fangchenggang feicheng fengcheng fengcheng fenghua fengzhen fenyang foshan fuan fuding fujin fukang fuqing fuquan fushun fuxin fuyang fuyu fuyuan fuzhou fuzhou gaizhou ganzhou gaoan gaobeidian gaomi gaoping gaoyou gaozhou gejiu genhe golmud gongqingcheng gongyi gongzhuling guangan guanghan guangshui guangyuan guangzhou guigang guilin guiping guisui guixi guiyang gujiao guyuan haicheng haidong haikou hailin hailun haimen haining haiyang hami hancheng hanchuan handan hangzhou hanzhong harbin hebi hechi hefei hegang heihe hejian hejin helong hengshui hengyang heshan heshan heyuan heze hezhou hezuo hohhot holingol hongkong honghu hongjiang hotan houma huadian huaian huaibei huaihua huainan huaiyin huanggang huanghua huangshan huangshi huayin huaying huazhou huixian huizhou hulin huludao hulunbuir hunchun hunjiang huozhou huzhou jiamusi jian jian jiande jiangmen jiangshan jiangyin jiangyou jianou jianyang jiaohe jiaozhou jiaozuo jiaxing jiayuguan jieshou jiexiu jieyang jilin jimo jinan jinchang jincheng jingdezhen jinggangshan jinghong jingjiang jingmen jingsha jingxi jingzhou jinhua jining jinjiang jinshi jinxi jinzhong jinzhou jinzhou jishou jiujiang jiuquan jixi jiyuan jurong kaifeng kaili kaiping kaiyuan kaiyuan kangding karamay kashgar khorgas kokdala korla kunming kunshan kunyu kuytun laibin laiwu laixi laiyang laizhou langfang langzhong lanxi lanzhou laohekou lechang leiyang leizhou leling lengshuijiang leping leshan lhasa lianjiang lianyuan lianyungang lianzhou liaocheng liaoyang liaoyuan lichuan lijiang liling linan lincang linfen lingbao linghai lingwu lingyuan linhai linjiang linqing linxia linxiang linyi linzhou lishui liupanshui liuyang liuzhou liyang longhai longjing longkou longnan longquan longyan loudi luan lucheng lufeng luoding luohe luoyang lushan lushui luxi luzhou lüda lüliang maanshan macau macheng mang manzhouli maoming meihekou meishan meixian meizhou mengzhou mengzi mianyang mianzhu mile miluo mingguang mishan mudanjiang muling nanan nanchang nanchong nangong nanjing nanning nanping nantong nanxiong nanyang nanzheng nehe neijiang ningan ningbo ningde ningguo nyingchi ordos panjin panshi panzhihua penglai pengzhou pingdingshan pingdu pinghu pingliang pingxiang pingxiang pizhou puer puning puqi putian puyang qianan qianjiang qidong qingdao qingtongxia qingyang qingyuan qingzhen qingzhou qinhuangdao qinyang qinzhou qionghai qionglai qiqihar qitaihe qixia quanzhou qufu qujing quzhou renhuai renqiu rizhao rongcheng rugao ruian ruichang ruijin ruili rushan ruzhou sanhe sanmenxia sanming sansha sanya shahe shanghai shangluo shangqiu shangrao shangrila shangzhi shannan shantou shanwei shaoguan shaoshan shaowu shaoxing shaoyang shengzhou shenyang shenzhen shenzhou shifang shigatse shihezi shijiazhuang shishi shishou shiyan shizuishan shouguang shuanghe shuangliao shuangyashan shulan shuozhou sihui simao siping songyuan songzi sucheng suifenhe suihua suining suixi suizhou suqian suzhou suzhou tacheng taian taicang taishan taixing taiyuan taizhou taizhou tangshan taonan tengchong tengzhou tianchang tianjin tianmen tianshui tiefa tieli tieling tiemenguan tongcheng tongchuan tonghua tongjiang tongliao tongling tongren tongshi tongxiang tumen tumxuk turpan ulanhot ulanqab wafangdian wanning wanyuan weifang weihai weihaiwei weihui weinan wenchang wenling wenzhou wuan wuchang wuchuan wudalianchi wugang wugang wuhai wuhan wuhu wujiaqu wusu wuwei wuxi wuxue wuyishan wuzhishan wuzhong wuzhou xiamen xian xian xiangcheng xiangfan xiangtan xiangxiang xiangyang xianning xiantao xianyang xiaogan xiaoyi xichang xilinhot xingcheng xinghua xingning xingping xingshan xingtai xingyang xingyi xinhailian xining xinji xinle xinmi xinmin xintai xinxiang xinyang xinyi xinyi xinyu xinzheng xinzhou xuancheng xuanwei xuchang xuzhou yaan yakeshi yanan yancheng yangchun yangjiang yangquan yangzhong yangzhou yanji yanshi yantai yibin yichang yicheng yichun yichun yidu yima yinchuan yingcheng yingde yingkou yingtan yining yiwu yixing yiyang yizheng yizhou yongan yongcheng yongji yongkang yongzhou yuanjiang yuanping yucheng yueqing yueyang yulin yulin yumen yuncheng yunfu yushu yushu yuxi yuyao yuzhou zaoyang zaozhuang zhalantun zhangjiagang zhangjiajie zhangjiakou zhangping zhangqiu zhangshu zhangye zhangzhou zhanjiang zhaodong zhaoqing zhaotong zhaoyuan zhengzhou zhenjiang zhicheng zhijiang zhongshan zhongwei zhongxiang zhoukou zhoushan zhuanghe zhucheng zhuhai zhuji zhumadian zhuozhou zhuzhou zibo zigong zixing ziyang zoucheng zunhua zunyi"
                                                     ));

            CultureTemplates.Add(new CultureTemplate("Roman",
                                                     "acerrae acerraevatriae acquiterme adrotas alsium anavio antemnae apiolae apollonia aquaesulis ardotalia ariolica asti ausona baiae bannaventa bevagna bobbio bovillae bruttium caenina caesaromagus cagliari calcaria cales cameria camulodunum capizzi caromago castelseprio catania cefalù chiavenna chieri claternae clausentum clotagenium colonnata como concangis concordia condate coria corinium cosa cremona curia daedalium danum dubris durnovaria durocobrivis durocornovium durolipons durolitum durovigutum eboracum entella eryx etruria evidensca falacrine fano feronia forumfulvii forumnovum gabii gaeta garrianonum genoa gereatis heraea herculaneum hispellum hortonium imachara interamna ivrea lactodorum lagentium latium leodis letocetum lindinis londinium longaricum longula lorium luceria luentinum luguvalium luna luni mamucium mantua maromago mediolanum miseno monferrato moridunum mytistraton nacona navio netum norba olicana padria pedum petelia piacenza pollentia pollusca pompeia portotorres portusfelix potentia praetorium regillum regulbium ricina rusellae rutupiae saepinum salinae sciacca segontium sentinum septempeda soluntum stabiae suasa sulloniacae taormina tortona trimontium turin tusculum ulubrae vagniacae vardacate vectis veleia venafrum ventimiglia vercelli verulamium vindolanda vinovia"
                                                     ));

            CultureTemplates.Add(new CultureTemplate("Egyptian",
                                                     "THEBES MEMPHIS HELIOPOLIS ELEPHANTINE ALEXANDRIA PIRAMESSES GIZA BYBLOS AKHETATEN HIERACONPOLIS ABYDOS ASYUT AVARIS LISHT BUTO EDFU PITHOM BUSIRIS KAHUN ATHRIBIS MENDES ELASHMUNEIN TANIS BUBASTIS THIS ORYX SEBENNYTUS AKHMIN KARNAK LUXOR ELKAB ARMANT BALAT ELLAHUN GHURAB HAWARA DASHUR RAQOTE DAMANHUR MERIMDE ABUSIR HERAKLEOPOLIS AKORIS BENIHASAN TASA BADARI HERMOPOLIS AMRAH NEGADE KOPTOS HERMONTHIS OMBOS ANIBA SOLEB SEMNA AMARA"
                                                     ));
        }
        public SimplexNoise_octave(int seed)
        {
            p = (short[])p_supply.Clone();

            InternalRandom rand;

            if (seed == RANDOMSEED)
            {
                rand = new InternalRandom();
                seed = rand.Next();
            }

            //the random for the swaps
            rand = new InternalRandom(seed);

            //the seed determines the swaps that occur between the default order and the order we're actually going to use
            for (int i = 0; i < NUMBEROFSWAPS; i++)
            {
                int swapFrom = rand.Next(p.Length - 1);
                int swapTo   = rand.Next(p.Length - 1);

                short temp = p[swapFrom];
                p[swapFrom] = p[swapTo];
                p[swapTo]   = temp;
            }


            for (int i = 0; i < 512; i++)
            {
                perm[i]      = p[i & 255];
                permMod12[i] = (short)(perm[i] % 12);
            }
        }
        public override void Update(long gameTime, NamelessGame namelessGame)
        {
            while (namelessGame.Commander.DequeueCommand(out AttackCommand ac))
            {
                var random = new InternalRandom();

                var source = ac.getSource();
                var stats  = source.GetComponentOfType <Stats>();

                //TODO: attack damage based on stats, equipment etc.
                int damage = stats.Attack.Value;
                DamageHelper.ApplyDamage(ac.getTarget(), ac.getSource(), damage);

                Description targetDescription = ac.getTarget().GetComponentOfType <Description>();
                Description sourceDescription = ac.getSource().GetComponentOfType <Description>();
                if (targetDescription != null && sourceDescription != null)
                {
                    var logCommand = new HudLogMessageCommand();
                    namelessGame.Commander.EnqueueCommand(logCommand);

                    logCommand.LogMessage += (sourceDescription.Name + " deals " + (damage) +
                                              " damage to " + targetDescription.Name);
                    //namelessGame.WriteLineToConsole;
                }
            }
        }
        public string GetTownName(InternalRandom random)
        {
            if (townChain == null)
            {
                List <string> townList = TownNames.ToLower().Split(' ').ToList();
                foreach (var str in townList)
                {
                    townChain.Add(str);
                }
            }

            return(new string(townChain.Chain(random.Next()).ToArray()).FirstCharToUpper());
        }
        public static void RiverBordersWriteImage(List <List <TileForGeneration> > riverBorders, float[][] heights, int resolution, string path)
        {
            var img = new System.Drawing.Bitmap(resolution, resolution, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            for (int y = 0; y < resolution; y++)
            {
                for (int x = 0; x < resolution; x++)
                {
                    var colorRGB = (float)heights[x][y];

                    if (heights[x][y] > 1)
                    {
                        colorRGB = 1;
                    }

                    if (heights[x][y] <= TileNoiseInterpreter.SeaLevelThreshold)
                    {
                        colorRGB = 0;
                    }

                    var col = new Color(colorRGB, colorRGB, colorRGB, 1f);
                    img.SetPixel(x, resolution - 1 - y, col.ToColor());
                }
            }

            var random = new InternalRandom();

            foreach (var riverBorder in riverBorders)
            {
                var color = new Color(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255), 1f);
                foreach (var tileForGeneration in riverBorder)
                {
                    img.SetPixel(tileForGeneration.x, resolution - 1 - tileForGeneration.y, color.ToColor());
                }
            }

            img.Save(path);


            // Texture2D tex = new Texture2D(NamelessGame.DebugDevice, resolution, resolution, false, SurfaceFormat.Color);
            //tex.SetData(arrBytes);



            //using (var str = File.OpenWrite(path))
            //{
            //    tex.SaveAsPng(str, resolution, resolution);
            //}
            //tex.Dispose();
        }
        public void Init(InternalRandom random)
        {
            Random        = random;
            TerrainNoises = new List <SimplexNoise>();
            SimplexNoise noise1 = new SimplexNoise(layer1, 0.5, random);
            SimplexNoise noise2 = new SimplexNoise(layer2, 0.5, random);
            SimplexNoise noise3 = new SimplexNoise(layer3, 0.5, random);


            ForestsNoise = new SimplexNoise(200, 0.75, random);
            LakesNoise   = new SimplexNoise(200, 0.75, random);
            SwampNoise   = new SimplexNoise(200, 0.75, random);
            DesertNoise  = new SimplexNoise(200, 0.75, random);

            TemperatureNoise = new SimplexNoise(200, 0.75, random);

            TerrainNoises.Add(noise1);
            TerrainNoises.Add(noise2);
            TerrainNoises.Add(noise3);
        }
Beispiel #7
0
        public static void AnalizeLandmasses(TimelineLayer timelineLayer, NamelessGame game)
        {
            var            s       = Stopwatch.StartNew();
            InternalRandom rand    = game.WorldSettings.GlobalRandom;
            List <Region>  regions = GetRegions(timelineLayer, game, rand, (tile => tile.Biome != Biomes.Sea &&
                                                                            tile.Continent == null), (tile, region) => tile.Continent = region, () => { return(new string(continentNamesChain.Chain(game.WorldSettings.GlobalRandom.Next()).ToArray()).FirstCharToUpper()); });

            List <Region> forests   = GetRegions(timelineLayer, game, rand, (tile => tile.Biome == Biomes.Forest && tile.LandmarkRegion == null), (tile, region) => tile.LandmarkRegion = region, () => { return(new string(continentNamesChain.Chain(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1)).ToArray()).FirstCharToUpper() + " forest"); });
            List <Region> deserts   = GetRegions(timelineLayer, game, rand, (tile => tile.Biome == Biomes.Desert && tile.LandmarkRegion == null), (tile, region) => tile.LandmarkRegion = region, () => { return(new string(continentNamesChain.Chain(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1)).ToArray()).FirstCharToUpper() + " desert"); });
            List <Region> mountains = GetRegions(timelineLayer, game, rand, (tile => tile.Biome == Biomes.Mountain && tile.LandmarkRegion == null), (tile, region) => tile.LandmarkRegion = region, () => { return(new string(continentNamesChain.Chain(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1)).ToArray()).FirstCharToUpper() + " mountain"); });
            List <Region> swamps    = GetRegions(timelineLayer, game, rand, (tile => tile.Biome == Biomes.Swamp && tile.LandmarkRegion == null), (tile, region) => tile.LandmarkRegion = region, () => { return(new string(continentNamesChain.Chain(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1)).ToArray()).FirstCharToUpper() + " swamp"); });

            s.Stop();
            timelineLayer.Continents = regions.Where(x => x.SizeInTiles >= 2000).ToList();
            timelineLayer.Islands    = regions.Where(x => x.SizeInTiles < 2000).ToList();
            timelineLayer.Forests    = forests.ToList();
            timelineLayer.Deserts    = deserts.ToList();
            timelineLayer.Mountains  = mountains.ToList();
            timelineLayer.Swamps     = swamps.ToList();
        }
        private static void GenerateCityBuildingForTest(Vector2 center, NamelessGame game, IWorldProvider chunks)
        {
            var citySize = 200;
            //TODO streets



            var buildingNumber = (citySize) / 15 * (citySize) / 15;
            var random         = new InternalRandom(game.WorldSettings.GlobalRandom.Next());

            var blueprint = BlueprintLibrary.Blueprints.First();

            for (int x = 0; x < citySize; x += 15)
            {
                for (int y = 0; y < citySize; y += 15)
                {
                    BuildingFactory.CreateBuilding((int)(x + center.X - citySize / 2),
                                                   (int)(y + center.Y - citySize / 2), blueprint, game, chunks, random);
                }
            }
        }
Beispiel #9
0
        public SimplexNoise(int largestFeature, double persistence, InternalRandom rnd)
        {
            this.largestFeature = largestFeature;
            this.persistence    = persistence;

            //recieves a number (eg 128) and calculates what power of 2 it is (eg 2^7)
            int numberOfOctaves = (int)Math.Ceiling(Math.Log10(largestFeature) / Math.Log10(2));

            octaves    = new SimplexNoise_octave[numberOfOctaves];
            frequencys = new double[numberOfOctaves];
            amplitudes = new double[numberOfOctaves];


            for (int i = 0; i < numberOfOctaves; i++)
            {
                octaves[i] = new SimplexNoise_octave(rnd.Next());

                frequencys[i] = Math.Pow(2, i);
                amplitudes[i] = Math.Pow(persistence, octaves.Length - i);
            }
        }
 public TerrainGenerator(InternalRandom random)
 {
     Init(random);
 }
 public int RandomExclusive(int min, int max, int seedMod = 0)
 {
     return(InternalRandom.Random(RandomSeed + InternalRandom.Random(seedMod)) % (max - min) + min);
 }
        public static IEntity CreateBuilding(int x, int y, BuildingBlueprint blueprint, NamelessGame namelessGame, IWorldProvider worldProvider, InternalRandom random)
        {
            IEntity building = new Entity();

            building.AddComponent(new Description("", ""));
            building.AddComponent(new Position(x, y));

            Building buildingComponent = new Building();

            

            for (int i = 0; i < blueprint.Matrix.Length; i++)
            {
                for (int j = 0; j < blueprint.Matrix[i].Length; j++)
                {
                    var tile = worldProvider.GetTile(x + j, y + i);
                    tile.Terrain = TerrainTypes.Road;
                    tile.Biome = Biomes.None;

                    var bluepringCell = blueprint.Matrix[i][j];
                    switch (bluepringCell)
                    {
                        case BlueprintCell.Wall:
                        {
                            AddToTileAndGame(tile, TerrainFurnitureFactory.WallEntity, namelessGame);
                                break;
                        }
                        case BlueprintCell.Door:
                        {
                            IEntity door = CreateDoor(x + j, y + i);
                            buildingComponent.getBuildingParts().Add(door);
                            AddToTileAndGame(tile, door, namelessGame);
                            break;

                        }
                        case BlueprintCell.Window:
                        {
                            AddToTileAndGame(tile, TerrainFurnitureFactory.WindowEntity, namelessGame);
                            break;
                        }
                        case BlueprintCell.Bed:
                        {
                            AddToTileAndGame(tile, TerrainFurnitureFactory.BedEntity, namelessGame);
                            break;
                        }
                        case BlueprintCell.IndoorsFurniture:
                        {
                            AddToTileAndGame(tile, TerrainFurnitureFactory.BedEntity, namelessGame);
                            break;
                        }

                    }


                }
            }


            {
                //BSPTree tree = new BSPTree(new Rectangle(x,y,width,height));

                //tree.Split(random,3);

                //{
                //    BSPTree child = tree.ChildA;
                //    for (int i = 0; i < child.Bounds.Width; i++)
                //    {
                //        for (int j = 0; j < child.Bounds.Height; j++)
                //        {
                //            var tile = worldProvider.GetTile(child.Bounds.X + i, child.Bounds.Y + j);
                //            tile.Terrain = TerrainLibrary.Terrains[TerrainTypes.Road];
                //            tile.Biome = BiomesLibrary.Biomes[Biomes.None];

                //            if (i == 0 || j == 0 || i == child.Bounds.Width - 1 || j == child.Bounds.Height - 1)
                //            {
                //                if (i == child.Bounds.Width / 2)
                //                {
                //                    IEntity door = CreateDoor(child.Bounds.X + i, child.Bounds.Y + j);
                //                    buildingComponent.getBuildingParts().Add(door);
                //                    namelessGame.GetEntities().Add(door);
                //                    tile.getEntitiesOnTile().Add((Entity)door);
                //                }
                //                else
                //                {
                //                    tile.getEntitiesOnTile().Add(TerrainFurnitureFactory.WallEntity);
                //                }
                //            }

                //        }
                //    }
                //}

                //{
                //    BSPTree child = tree.ChildB;
                //    for (int i = 0; i < child.Bounds.Width; i++)
                //    {
                //        for (int j = 0; j < child.Bounds.Height; j++)
                //        {
                //            var tile = worldProvider.GetTile(child.Bounds.X + i, child.Bounds.Y + j);
                //            tile.Terrain = TerrainLibrary.Terrains[TerrainTypes.Road];
                //            tile.Biome = BiomesLibrary.Biomes[Biomes.None];

                //            if (i == 0 || j == 0 || i == child.Bounds.Width - 1 || j == child.Bounds.Height - 1)
                //            {
                //                if (i == child.Bounds.Width / 2)
                //                {
                //                    IEntity door = CreateDoor(child.Bounds.X + i, child.Bounds.Y + j);
                //                    buildingComponent.getBuildingParts().Add(door);
                //                    namelessGame.GetEntities().Add(door);
                //                    tile.getEntitiesOnTile().Add((Entity)door);
                //                }
                //                else
                //                {
                //                    tile.getEntitiesOnTile().Add(TerrainFurnitureFactory.WallEntity);
                //                }
                //            }

                //        }
                //    }
                //}
            }

            building.AddComponent(buildingComponent);
            return building;

        }
 public ItemsGenerator(InternalRandom random)
 {
     this.random = new InternalRandom(random.Next());
 }
Beispiel #14
0
 public string GetCountryName(InternalRandom random)
 {
     return(new string(countryChain.Chain(random.Next()).ToArray()));
 }
Beispiel #15
0
        private static List <Region> GetRegions(TimelineLayer timelineLayer, NamelessGame game, InternalRandom rand, Func <WorldTile, bool> searchCriterion, Action <WorldTile, Region> onFoundRegion, Func <string> nameGenerator)
        {
            List <Region> regions     = new List <Region>();
            var           searchPoint = new Microsoft.Xna.Framework.Point();

            for (; searchPoint.X < game.WorldSettings.WorldBoardWidth; searchPoint.X++)
            {
                for (searchPoint.Y = 0; searchPoint.Y < game.WorldSettings.WorldBoardHeight; searchPoint.Y++)
                {
                    if (searchCriterion(timelineLayer.WorldTiles[searchPoint.X, searchPoint.Y]))
                    {
                        Region r = new Region();
                        r.Name  = nameGenerator();
                        r.Color = new Color(rand.Next(0, 255), rand.Next(0, 255), rand.Next(0, 255), 1f);
                        regions.Add(r);

                        var firstNode = timelineLayer.WorldTiles[searchPoint.X, searchPoint.Y];

                        var floodList = new Queue <WorldTile>();
                        floodList.Enqueue(firstNode);
                        onFoundRegion(firstNode, r);
                        r.SizeInTiles++;

                        void AddToFloodList(int x, int y, Region region)
                        {
                            if (searchCriterion(timelineLayer.WorldTiles[x, y]))
                            {
                                floodList.Enqueue(timelineLayer.WorldTiles[x, y]);
                                onFoundRegion(timelineLayer.WorldTiles[x, y], region);
                                region.SizeInTiles++;
                            }
                        }

                        while (floodList.Any())
                        {
                            var elem = floodList.Dequeue();

                            AddToFloodList(elem.WorldBoardPosiiton.X - 1, elem.WorldBoardPosiiton.Y, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X + 1, elem.WorldBoardPosiiton.Y, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X, elem.WorldBoardPosiiton.Y - 1, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X, elem.WorldBoardPosiiton.Y + 1, r);

                            AddToFloodList(elem.WorldBoardPosiiton.X - 1, elem.WorldBoardPosiiton.Y - 1, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X + 1, elem.WorldBoardPosiiton.Y + 1, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X + 1, elem.WorldBoardPosiiton.Y - 1, r);
                            AddToFloodList(elem.WorldBoardPosiiton.X - 1, elem.WorldBoardPosiiton.Y + 1, r);
                        }
                    }
                }
            }

            return(regions);
        }
Beispiel #16
0
        public static void PlaceInitialCivilizations(TimelineLayer timelineLayer, NamelessGame game)
        {
            var worldSettingsContinentTilesPerCivilization = game.WorldSettings.ContinentTilesPerCivilization;

            foreach (var worldBoardContinent in timelineLayer.Continents)
            {
                var civNumber = worldBoardContinent.SizeInTiles / worldSettingsContinentTilesPerCivilization;

                var continentTiles = new Queue <WorldTile>();

                foreach (var worldBoardWorldTile in timelineLayer.WorldTiles)
                {
                    if (worldBoardWorldTile.Continent == worldBoardContinent && worldBoardWorldTile.Terrain != TerrainTypes.Water && worldBoardWorldTile.Owner == null)
                    {
                        continentTiles.Enqueue(worldBoardWorldTile);
                    }
                }
                //randomize list
                continentTiles = new Queue <WorldTile>(continentTiles.OrderBy(
                                                           (o) =>
                {
                    return(game.WorldSettings.GlobalRandom.Next() % continentTiles.Count);
                }));

                InternalRandom random = new InternalRandom(game.WorldSettings.GlobalRandom.Next(int.MaxValue - 1));

                for (int i = 0; i < civNumber; i++)
                {
                    bool   civNameUnique = false;
                    string civName       = "";
                    while (!civNameUnique)
                    {
                        civName       = game.WorldSettings.NamesGenerator.GetCountryName(random).FirstCharToUpper();
                        civNameUnique = timelineLayer.Civilizations.All(x => x.Name != civName);
                    }

                    CultureTemplate culture = game.WorldSettings.CultureTemplates[
                        random.Next(game.WorldSettings.CultureTemplates.Count - 1)];

                    var civilization = new Civilization(civName, new Microsoft.Xna.Framework.Color(
                                                            new Vector4((float)random.Next(0, 100) / 100,
                                                                        (float)random.Next(0, 100) / 100,
                                                                        (float)random.Next(0, 100) / 100, 1)),
                                                        culture);
                    timelineLayer.Civilizations.Add(civilization);


                    var firstSettlement = new Settlement()
                    {
                        Name = civilization.CultureTemplate.GetTownName(random)
                    };

                    civilization.Settlements.Add(firstSettlement);



                    WorldTile tile = null;
                    bool      noNeighbooringCivs = false;
                    const int squareToCheck      = 10;
                    const int radiusToClaim      = 7;
                    while (!noNeighbooringCivs)
                    {
                        if (!continentTiles.Any())
                        {
                            break;
                        }

                        tile = continentTiles.Dequeue();
                        noNeighbooringCivs = true;
                        for (int x = tile.WorldBoardPosiiton.X - squareToCheck; x <= tile.WorldBoardPosiiton.X + squareToCheck; x++)
                        {
                            for (int y = tile.WorldBoardPosiiton.Y - squareToCheck; y <= tile.WorldBoardPosiiton.Y + squareToCheck; y++)
                            {
                                if (timelineLayer.WorldTiles[x, y].Owner != null)
                                {
                                    noNeighbooringCivs = false;
                                }
                            }
                        }
                    }


                    //if there is no tiles to place civilizations then break the loop
                    if (!continentTiles.Any())
                    {
                        break;
                    }


                    timelineLayer.Civilizations.Add(civilization);

                    tile.Settlement = firstSettlement;



                    for (int x = tile.WorldBoardPosiiton.X - radiusToClaim; x <= tile.WorldBoardPosiiton.X + radiusToClaim; x++)
                    {
                        for (int y = tile.WorldBoardPosiiton.Y - radiusToClaim; y <= tile.WorldBoardPosiiton.Y + radiusToClaim; y++)
                        {
                            var dX = x - tile.WorldBoardPosiiton.X;
                            var dY = y - tile.WorldBoardPosiiton.Y;

                            if (dX * dX + dY * dY <= (radiusToClaim))
                            {
                                timelineLayer.WorldTiles[x, y].Owner = civilization;
                            }
                        }
                    }
                }

                // var names = timelineLayer.Civilizations.Select(x => x.Name).Aggregate((s1, s2) => s1 + ", " + s2);
            }
        }
Beispiel #17
0
        public static void PopulateWithInitialData(TimelineLayer board, NamelessGame game)
        {
            var resolution = WorldGenConstants.Resolution;

            var random = new InternalRandom(game.WorldSettings.GlobalRandom.Next());


            for (int x = 0; x < game.WorldSettings.WorldBoardWidth; x++)
            {
                for (int y = 0; y < game.WorldSettings.WorldBoardHeight; y++)
                {
                    var worldTile = new WorldTile(new Microsoft.Xna.Framework.Point(x, y));
                    var tile      = game.WorldSettings.TerrainGen.GetTileWithoutRiverWater(x, y, (float)game.WorldSettings.WorldBoardWidth / resolution);
                    worldTile.Terrain = tile.Terrain;
                    worldTile.Biome   = tile.Biome;

                    board.WorldTiles[x, y] = worldTile;
                }
            }


            //generate elevation map for river gen
            for (int i = 0; i < resolution; i++)
            {
                for (int j = 0; j < resolution; j++)
                {
                    //fill it with terrain heght with current noises using resolution
                    board.ElevationMap[i][j] = game.WorldSettings.TerrainGen.GetHeightNoise(i, j, 1);
                }
            }

            //copy elevationArray
            var fillArray = new TileForGeneration[resolution][];

            for (int i = 0; i < resolution; i++)
            {
                fillArray[i] = new TileForGeneration[resolution];
                for (int j = 0; j < resolution; j++)
                {
                    fillArray[i][j] = new TileForGeneration()
                    {
                        fillValue = board.ElevationMap[i][j], x = i, y = j, isWater = false
                    };
                }
            }

            List <FortuneSite> points = new List <FortuneSite>();
            LinkedList <VEdge> edges  = new LinkedList <VEdge>();

            for (var i = 0; i < resolution; i++)
            {
                points.Add(new FortuneSite(
                               random.Next(0, resolution - 1),
                               random.Next(0, resolution - 1)));
            }

            //uniq the points
            points.Sort((p1, p2) =>
            {
                if (p1.X.ApproxEqual(p2.X))
                {
                    if (p1.Y.ApproxEqual(p2.Y))
                    {
                        return(0);
                    }
                    if (p1.Y < p2.Y)
                    {
                        return(-1);
                    }
                    return(1);
                }
                if (p1.X < p2.X)
                {
                    return(-1);
                }
                return(1);
            });

            var unique = new List <FortuneSite>(points.Count / 2);
            var last   = points.First();

            unique.Add(last);
            for (var index = 1; index < points.Count; index++)
            {
                var point = points[index];
                if (!last.X.ApproxEqual(point.X) ||
                    !last.Y.ApproxEqual(point.Y))
                {
                    unique.Add(point);
                    last = point;
                }
            }
            points = unique;

            edges = FortunesAlgorithm.Run(points, 0, 0, resolution - 1, resolution - 1);

            //VEdge.Start is a VPoint with location VEdge.Start.X and VEdge.End.Y
            //VEdge.End is the ending point for the edge
            //FortuneSite.Neighbors contains the site's neighbors in the Delaunay Triangulation


            var waterBitmap = new Bitmap(resolution, resolution);

            var graphics = Graphics.FromImage(waterBitmap);

            Pen whitePen = new Pen(System.Drawing.Color.White, 1);

            var edgesByTheSea = edges.Where(
                x =>
                board.ElevationMap[(int)x.Start.X][(int)x.Start.Y] < TileNoiseInterpreter.SeaLevelThreshold &&
                board.ElevationMap[(int)x.End.X][(int)x.End.Y] >= TileNoiseInterpreter.SeaLevelThreshold ||

                board.ElevationMap[(int)x.End.X][(int)x.End.Y] < TileNoiseInterpreter.SeaLevelThreshold &&
                board.ElevationMap[(int)x.Start.X][(int)x.Start.Y] >= TileNoiseInterpreter.SeaLevelThreshold
                );

            var allInlandEdges = edges.Where(
                x =>
                board.ElevationMap[(int)x.End.X][(int)x.End.Y] >= TileNoiseInterpreter.SeaLevelThreshold &&
                board.ElevationMap[(int)x.Start.X][(int)x.Start.Y] >= TileNoiseInterpreter.SeaLevelThreshold
                ).ToList();

            //randommly remove some rivers;
            var cullingChance = 15;
            var culledEdges   = allInlandEdges.Where(edge => random.Next(1, 101) > cullingChance).ToList();

            culledEdges.AddRange(edgesByTheSea.Where(edge => random.Next(1, 101) > cullingChance));

            //remove desert rivers with high probability
            var cullingDesertChance = 90;

            //if not in desert biome ignore, if in desert, cull with high probability
            culledEdges = culledEdges.Where(edge =>
                                            (board.WorldTiles[(int)edge.Start.X, (int)edge.Start.Y].Biome.HasFlag(Biomes.Desert | Biomes.Jungle | Biomes.Savannah) &&
                                             board.WorldTiles[(int)edge.End.X, (int)edge.End.Y].Biome.HasFlag(Biomes.Desert | Biomes.Jungle | Biomes.Savannah)) ||
                                            random.Next(1, 101) < cullingDesertChance).ToList();

            var finalEdges = new List <VEdge>();

            finalEdges.AddRange(culledEdges);

            foreach (var edge in finalEdges)
            {
                var pointCountForLerpAndRandomization = 7;

                var listVectorEdgePoints = new List <Vector2>();
                var startVector          = new Vector2((float)edge.Start.X, (float)edge.Start.Y);
                var endVector            = new Vector2((float)edge.End.X, (float)edge.End.Y);
                var perpendicular        = (endVector - startVector);
                perpendicular.Normalize();
                perpendicular = new Vector2(perpendicular.Y, -perpendicular.X);



                listVectorEdgePoints.Add(startVector);

                var riverWiggle = 3;

                for (int i = 1; i < pointCountForLerpAndRandomization - 1; i++)
                {
                    var newPoint = Vector2.Lerp(startVector, endVector, ((float)i / (pointCountForLerpAndRandomization - 1))) + (perpendicular * (random.Next(-riverWiggle, riverWiggle)));
                    listVectorEdgePoints.Add(newPoint);
                }
                listVectorEdgePoints.Add(endVector);

                graphics.DrawCurve(whitePen, listVectorEdgePoints.Select(x => x.ToPoint().ToPoint()).ToArray());
            }

            for (int x = 3; x < resolution - 3; x++)
            {
                for (int y = 3; y < resolution - 3; y++)
                {
                    if (waterBitmap.GetPixel(x, y).R > 0)
                    {
                        //fillArray[x][y].isWater = true;

                        if (board.ElevationMap[x][y] >= TileNoiseInterpreter.SeaLevelThreshold)
                        {
                            fillArray[x][y].isWater = true;
                        }
                        else
                        {
                            Queue <TileForGeneration> neighbours = new Queue <TileForGeneration>();
                            GenerationUtility.GetNeighbours(fillArray, neighbours, x, y, 2);
                            if (neighbours.Any(n => board.ElevationMap[n.x][n.y] >= TileNoiseInterpreter.SeaLevelThreshold))
                            {
                                fillArray[x][y].isWater = true;
                            }
                        }
                    }
                }
            }


            for (int i = 0; i < resolution; i++)
            {
                for (int j = 0; j < resolution; j++)
                {
                    board.RiverMap[i][j] = fillArray[i][j].isWater;
                }
            }

            var riverBorderMapCopyForCalcultaion = new bool[resolution][];

            for (int i = 0; i < resolution; i++)
            {
                riverBorderMapCopyForCalcultaion[i] = new bool[resolution];
                for (int j = 0; j < resolution; j++)
                {
                    if (board.RiverMap[i][j])
                    {
                        bool borderedByAnythingBesidesWater = false;
                        //not really a radius, more like an side lenght of a square
                        var searchRadius = 3;
                        if (i > searchRadius && i < resolution - searchRadius && j > searchRadius && j < resolution - searchRadius)
                        {
                            for (int k = i - searchRadius; k < i + searchRadius + 1; k++)
                            {
                                for (int l = j - searchRadius; l < j + searchRadius + 1; l++)
                                {
                                    if (!board.RiverMap[k][l])
                                    {
                                        borderedByAnythingBesidesWater = true;
                                    }
                                }
                            }
                        }

                        if (borderedByAnythingBesidesWater)
                        {
                            board.RiverBorderMap[i][j]             = true;
                            riverBorderMapCopyForCalcultaion[i][j] = true;
                        }
                    }
                }
            }


            var pointsNotConnectedToStartingPoints = new List <TileForGeneration>();

            for (int i = 0; i < resolution; i++)
            {
                for (int j = 0; j < resolution; j++)
                {
                    if (board.RiverBorderMap[i][j])
                    {
                        pointsNotConnectedToStartingPoints.Add(fillArray[i][j]);
                    }
                }
            }


            GenerationUtility.AnalyzeAndAddLines(pointsNotConnectedToStartingPoints, riverBorderMapCopyForCalcultaion, out var borderLines);


            for (int i = 0; i < resolution; i++)
            {
                for (int j = 0; j < resolution; j++)
                {
                    board.InlandWaterConnectivity[i][j] = new TileForInlandWaterConnectivity()
                    {
                        x       = i,
                        y       = j,
                        isWater = board.RiverMap[i][j]
                    };
                }
            }

            foreach (var borderLine in borderLines)
            {
                var line = new WaterBorderLine()
                {
                    Points = borderLine.Select(p => new Microsoft.Xna.Framework.Point(p.x, p.y)).ToList()
                };
                board.BorderLines.Add(line);
                foreach (var p in line.Points)
                {
                    board.InlandWaterConnectivity[p.X][p.Y].WaterBorderLines.Add(line);
                }
            }
#if DEBUG
            ImageWriter.WaterWriteImage(board.RiverMap, board.ElevationMap, resolution, "C:\\11\\RiverMap.png", new Color(1, 0, 0, 1f));

            ImageWriter.WaterWriteImage(board.RiverBorderMap, board.ElevationMap, resolution, "C:\\11\\RiverBorderMap.png", new Color(1, 0, 0, 1f));

            ImageWriter.RiverBordersWriteImage(borderLines, board.ElevationMap, resolution, "C:\\11\\riverBordersLines.png");
#endif

            for (int x = 0; x < game.WorldSettings.WorldBoardWidth; x++)
            {
                for (int y = 0; y < game.WorldSettings.WorldBoardHeight; y++)
                {
                    var worldTile = board.WorldTiles[x, y];

                    if (board.RiverMap[x][y] && worldTile.Terrain != TerrainTypes.Water)
                    {
                        worldTile.Terrain = TerrainTypes.Water;
                        worldTile.Biome   = Biomes.River;
                    }
                }
            }
        }
Beispiel #18
0
 /// <summary>
 /// Flips a coin.
 /// </summary>
 /// <returns><b>True</b> if Heads; <b>False</b> otherwise (i.e. Tails).</returns>
 public bool HeadsOrTails()
 {
     return(InternalRandom.Next(0, 2) == 1);
 }