; s[?c@sXdZdkZdkZdkZdkZdkZdfdYZeiZeiZei Z dZ dZ dZ dZ dZd Zd Zd Zd Zed ZddZhdd<dd<dd<dd<dd<dd<dd<dd<d d!<d"d#<d$d%<d&d'<d(d)<d*d+<d,d-<d.d/<dd<d0d1<d2d3<d4d5<d6d7<d8d9<d:d;<d<d=<d>d?<d@dA<dBdC<dDdE<dFdG<dHdI<dJdK<dLdM<dNdO<dPdQdefdYZ?defdYZ@defdYZAdZBdefdYZCdefdYZDdefdYZEdefdYZFdefdYZGdefdYZHgZIdZJeJe6ZKdZLdZMdZNdZOdS(s3Routines used to parse information from the server.NsbaseDispcBsMtZdZdZdZdZdZdZdZdZ RS(sBase class for chained parsing classes. (Does little by itself.) Basically, this class just insures that all the sub-classes support the standard chained display class protocols.cCs ||_dS(N(sdispsselfsout(sselfsdisp((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys__init__jscCs|ii|dS(snote the beginning of a commandN(sselfsoutsBeginscommand(sselfscommand((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBeginlscCs|ii|dS(snote a line of dataN(sselfsoutsdatasline(sselfsline((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdataoscCs|ii||dS(snote a sub-promptN(sselfsoutsflushspromptscallback(sselfspromptscallback((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysflushrscCs|ii|dS(s!note the response to a sub-promptN(sselfsoutsAnswersresponse(sselfsresponse((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysAnsweruscCs|ii|dS(snote the end of a commandN(sselfsoutsEndscommand(sselfscommand((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysEndxscCs|iidS(snote a lull in server outputN(sselfsoutsProcess(sself((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysProcess{s( s__name__s __module__s__doc__s__init__sBeginsdatasflushsAnswersEndsProcess(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysbaseDispes       c Csvtid}g} xO|D]G\} }}|djotidi| oqn|i | |fh}|i d}|i d}h}|djo |djoqn|djo|djo |djo||d#sN(slensargssnumsstringssplits lastColumnssstartcutsnewssegmentsendcutsappendslstripsjoinsmapsstripsoperatorsgetslicesfiltersNonesfinalsis translationssidxsKeyErrorscallable( s translationssargssstartcutsidxsis lastColumnssnumsendcutsnewssegmentsfinal((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys composeHeaders0 &  cCsti|}t|t|t|josh}xbtt ||D]N\}}|t joqKnt |o|i ||qK|||\d+) (?P\S+)(?P.*)$s SHIPNAMESsversionsenabledOptionss^\s*(?P.*?)\s+s\(\#\s*(?P\d+)\)\s+s(?P\S+).*s\(\#(?P\d+)\)\s+s+@ (?P-?\d+),(?P-?\d+)\s*$s\(\#(\s*?P\d+)\)\s+s\#(?P\d+)\s+s^(?P.*?)\s+s\(\#(?P\d+)\)\s+s(?P\S+).*s\#(?P\d+)\s+s"\(approx (?P\d+) mil\)\s+s(?P\S+).*s\#(?P\d+)\s+isSHIPis LAND UNITiiiscounIds countriesscounNamessectorXssectorYsshipIdsSHIPSsidstypesshipTypesxsysownerslandIds LAND UNITSslandTypesplaneIdsPLANESs planeTypescivsmils sectorStatsseffsdess sectorNamesSECTORN(srescompiles look_statssempDbsmegaDBslook_ship_infoslook_land_infoslook_plane_infosfoundsunitTypesmatchslinesmms look_infosgroupsownsNonesCN_OWNEDs resolveNameIdsintsmapsxsysidsupdatesslstscomposePreambles zeroIsOneseffsupdatessectorNameConvert(slinesunitTypesownslstsids look_statsseffslook_ship_infosfoundslook_land_infosmmsysxslook_plane_info((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys getLookInfoXs`##       ( !Q 'Q 'Q!Gs.sseas^smountainsss sanctuarys\s wastelands-s wildernesssgs gold minescscapitalspsparks+shighways)sradar installations#s bridge heads=s bridge spans@s bridge towersds defense plantsisshell industrysmsmineshsharborsws warehousesus uranium mines*sairfieldsas agribusinesssos oil fieldsjslight manufacturingsksheavy manufacturings%srefineryststechnical centersfsfortresssrs research labsns nuclear plantslslibrary/schoolsesenlistment centers!s headquarterssbsbanks(?Ps|cCsxtt|D]}||}d|jo-yt|}Wqtj o qqXnHyt|}Wn4tj ot |}ntj o qnX|||.*) (?P\d+)$s ^\d+ (sector|ship|unit|plane)s?$s$^.*No (sector|ship|unit|plane)\(s\)$cCs|ii||itjoti|}|ot i di |dSn|i i|}|o|i d}|dj|_t i ||_t|i d}|io|d|_n|io|i|i_nd|_n|idjoti||_d|_g|_g|_xtt|itt|iD][\} }| djo!d|i|<|ii |qU| d jo|ii |qUqUWndSn|i!i|} | ot|_dSn|i#i|} | ot|_dSnti|}t|} | t|ijox|iD]} | } }t|| djo|d}nx$||d d jo|d}qWti)|| |d!dd !g|| |d+| || } qOWn| t|ijot*|hd t+<}tt-i.|g| |i||io-|dd jot+|d    A  # (s__name__s __module__s__doc__sattachsaltersDBsrescompiles dumpcommandsBegins dumpheadersdumpendsdumpnonesdatasEnd(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseDumps <  ^sParseMapcBsVtZdZddfddfddffZdZeidZdZd Z RS( s'Parse output from various map commands.smapisnmapisbmapss ^\s*(\S?)mapcCs|ii|d|_g|_|ii|}|oOy,hdd<dd<|i d|_ Wqt j od|_ qXn d|_ dS(Nisnsnewdessbsbmapis( sselfsoutsBeginscmdsMpossMheaders mapcommandsmatchsmmsgroupsmapTypesKeyError(sselfscmdsmm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBegins  ,cCsA|ii||d }|d}|djo|idjo$d|_t|i|i dSq=|idjo||_ d|_q=|idjo4t i |dd}t ti|i ||_ q=nk|idjod|_t t|i }t|djod|_dSn|d|d jo|d |ds),(?Ps (?Ps),(?Ps (?P\S+)s ParseMovecBstZdZddfddfddfddffZdZeided Zd Z d Z d Z eid e de dedZ dZ RS(sParse an explore prompt.sexploreismoves transportistestcCs|ii|g|_dS(N(sselfsoutsBeginscmdsmap(sselfscmd((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBeginss^Sector s is now yours\.$cCs|ii|}|oWtt|idd\}}t i di hd|<d|<dt \d+\.\d+)s (?P.)s^ $cCs|ii|||ii|}|oag}x)|i dD]}|i |dd!q@Wt t |i dd}t||dndS(NiiissectorXssectorYs(sselfsoutsflushsmsgshdls promptFormatsmatchsmmssectssmapsisappendsintsgroupscoords parseStarMap(sselfsmsgshdlssectssmmscoordsi((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysflushs(s__name__s __module__s__doc__sattachsBeginsrescompiless_sectors ownSectorsdatass_mobss_dess promptFormatsflush(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseMoves *  's)(?P\S+)(?:.+)? #(?P\d+)s-(?P\S+)(?:.+)? \(#(?P\d+)\)s(?:s(?P.*?)s\(#(?P\d+)\)s s (?P\d+)%s ParseUnitscBstZdZddfddfddfddfddfddfd dffZd Zd Zeid ed e de dedZ eidde dZ eidde dZ dZdedede dedZeidede de dedZeidZeidede dZdZdZd edZd!edZeid"ed#ed$e d%Zd&Zd'ZRS((s0Parse info from a variety of unit type commands.sradarislradarislookoutsllookoutsnavigatesmarchssonarcCs|ii|t|_g|_|d djp|d djo d|_n9|d djp|d djo d|_n d |_dS( NisnavsloosSHIPislloosmarcs LAND UNITsUNKNOWN(sselfsoutsBeginscmdsNonesnumsMapsunitType(sselfscmd((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBegins  " " s (?P\d+)s^(?:s at )?s efficiency s , max range s$sJ^Sonar detects (?P\S.*\S) (?P\S+)?\(#(?P\d+)\)s @ s#^Sonar detects sub #(?P\d+)s/(?P(?: with (?:approx )?\d+ \S+)*)s(?:s|s s efficients)s^(?:\[(?P.*?)\] )?s&^(?P\S+):(?P\d+)(?P)$s^s. (?:stopped at|is out of mobility & stays in) cCsq|ii||ii|} | oQ| id}t i |} t | djo| d}| d}nnt | djot}| d}nGtidii| do| d}| d}nt}| d}tt| iddd \} } }tidi|d |f}tid ihd |<d |<d | <d| <d|s (?Ps^ $cCs |ii|||ii|}|oRtt |i dd|_ t |i djot|i |i dq~n|itj o|d}x(t |t |jo|d}qWx.t |i |ijo|i i|qWt|i |i dng|_ t|_dS(NssectorXssectorYisradarss (sselfsoutsflushsmsgshdls nav_promptsmatchsmmsmapsintsgroupscoordslensMaps parseStarMapsnumsNonesssappend(sselfsmsgshdlsmmss((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysflushs" cCs |ii||itj od}xv|iD]j}|d}t i |ddjoAx>||iddjo!|ii dd|d}q]Wq1q1Wx.t |i|ijo|ii dqWt|i|idny |`Wntj onXg|_t|_dS(Niis0iissradar(sselfsoutsEndscmdsnumsNonesisMapsmsgsstringsfindsinsertslensappends parseStarMapscoordsAttributeError(sselfscmdsismsg((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysEnds*    (s__name__s __module__s__doc__sattachsBeginss_distsrescompiles s_shipOrLandss_sectorss_effs start_radars sonar_infossonar_unknown_sub_infos s_sectorStatss s_shipIdents s_sectorNamess_shipOrSectors view_infos view_statss unit_stopsdatasss_mobss_minMobss_maxMobs nav_promptsflushsEnd(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseUnitss& E /&/ k' s ^(?:Your|s) s @ sParseSimpleTimec BstZdZddfddfddfddfddfd dfd dfd dfd dfd dfddfddff ZddffZdZdZRS(s<Simple class that will extract the time from the first line.scensusisresourceiscutoffssinfrastructures commodityislevelsneweffs productionsstrengthsstopsstartisantisicCs|ii|d|_dS(Ni(sselfsoutsBeginscmdsdone(sselfscmd((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBeginscCsZ|i o;ti|}|otidi|nd|_n|i i |dS(Nstimei( sselfsdones curtimeFormatsmatchsmsgsmmsempDbsmegaDBsnoteTimesoutsdata(sselfsmsgsmm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdatas   (s__name__s __module__s__doc__sattachsBeginsdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysParseSimpleTimes r sParseSpycBstZdZddffZdZhde<de<de<de<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd<dd\S+ \d+(?:, \S+ \d+)*)s^(?:Allied|Enemy|Neutral) \(s \) unit in s: s(?: \(s\))?$s-(?P\S+) (?P\d+)(?:, (?P.*))?cCs|ii||idjo|djo d|_qn|idjo;ti|}|o!ti di |d|_qnn|idjo||_ d|_nH|idjo(t |i |i ||_ d|_n|idjo|ii|}|oh}t||i|idtt|id d d \|d <|d <}||d<|id|d\d+)s^s is a s s with approximately s military\.$s-^We have (?:captured|secured a beachhead at) s, sir!$s% (?:moves in to occupy|now occupies) s$s (?:mil from (?:s|s() moves into|of your troops now occupy) c Csi|ii||ii|}|ott|i dddd\}}}}tidihd|<d|<dtid i|i d d||f<d t|i d <d|<d|\d+)\)s^\s*s s @ cCs!|ii|t|ddS(NsSHIP(sselfsoutsdatasmsgs getLookInfo(sselfsmsg((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdata]s( s__name__s __module__s__doc__sattachsaltersDBs s_counNames s_counIdentsrescompiles s_shipIdentss_sectorslinesdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysParseCoastWatchVs  #s ParseSatecBstZddffZdZdZdddhde<d d <d e<d d <dd<dd<dd<dd<dd<dd<dd<dd<dd<ddMap|Spy) Report:$s^s at s efficiency s, max range (?P\d+)$cCs!|ii||idjo\|ii|}|o?|id}|djo d|_ n d|_ d|_qn|idjoh|i i|}|oKt t |idd|_ t |id d d|_d |_qn*|id jo|d jog|_d |_q|dd !djo d|_q|dd!djo d|_q|dd!djo d|_qn|id joS|ii|t|i|ijo&t|i|i |i d|_qn-|idjottiti|}t|d jo d |_qt|dd}|d|dBridge tower built in)|s built in sector) s$cCsI|ii||ii|}|o|idoxtt |iddd\}}}t idihd|<d|id<dt<d |<d |\S+)s(?P\S+)s^\s*s Diplomatic Relations Report s$s\) s\s+cCs`|ii||ii|}|o3tidi |i dt |i dndS(Ns countriesscounNamescounId( sselfsoutsdatasmsgslinesmatchsmmsempDbsmegaDBs resolveNameIdsgroupsint(sselfsmsgsmm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdatas (s__name__s __module__s__doc__sattachsaltersDBss_yourRelationss_theirRelationsrescompiles s_counNamess_timesheaderss_counIdslinesdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysParseRelations s /s ParseRealmcBswtZdZddffZdZdededededZd Zei d ed ed Z d Z RS(s Parse output from realm command.srealmiss (?Ps ):(?Ps ),(?Ps ):(?Ps)s#(?P\d+)s^Realm s is s$cCsp|ii||ii|}|oCttt |i }|d}|d}t d||ndS(Niisrealm(sselfsoutsdatasmsgsrmsmatchsmtchstuplesmapsintsgroupssvalssrealms checkUpdated(sselfsmsgsmtchsrealmsvals((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdata's  ( s__name__s __module__s__doc__sattachsaltersDBsss_sectss_rangess_realmsrescompilesrmsdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseRealms &s ParseTelecBsvtZdZddffZdZdZeidedZ dZ eidZ d Z d Z d ZRS( s.Parse outgoing telegrams for future reference.stelegramiscCs8|ii|t|_d|_t|_t|_dS(Ns( sselfsoutsBeginscmdsNonestosbufspossmax(sselfscmd((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBegin4s    s^Enter telegram for s$cCsy|ii||itjo7|ii|}|o|i d|_dSqWn|djot|_ dSndS(NscounNamesTelegram aborted( sselfsoutsdatasmsgstosNonesinitsmatchsmmsgroupspos(sselfsmsgsmm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdata;s   s^\s*(?P\d+) left: $cCszl|ii|}|oFt|id}|it jo ||_n|i||_ n t |_ Wd|i i ||XdS(Nsleft(sselfspromptsmatchsmsgsmmsintsgroupsleftsmaxsNonespossoutsflushshdl(sselfsmsgshdlsmmsleft((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysflushFs  cCsP|ii||tj o |itj o|i|i |d|_ndS(Ns (sselfsoutsAnswersmsgsNonespossbuf(sselfsmsg((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysAnswerRscCs|ii||itj o |itj oti|i d}|d=d|ig|d*|ddjo |d=nt i ddi |yt iddi |Wqtj o|gt idd Telegram to is.s telegramsslist(sselfsoutsEndscmdstosNonespossstringssplitsbufsmsgsempDbsmegaDBsappendsupdateDBsKeyError(sselfscmdsmsg((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysEndVs  (s__name__s __module__s__doc__sattachsaltersDBsBeginsrescompiles s_counNamesinitsdataspromptsflushsAnswersEnd(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseTele0s    s ParseReadcBstZdZddfddffZdZdZeidede d e d Z d Z d Z d ZdZRS(sParse and store telegrams and announcements. This parser is responsible for making a copy of all correspondence that is received. It then stores these telegrams and annoucements in the database. sreadiswireiscCss|ii|t|_g|_ti|}|d djo d|_ n d|_ t i |i d|_ dS(Niswirs announcementss telegramsslast(sselfsoutsBeginscmdsNonesstorstlistsstringslstripscsdbnamesempDbsmegaDBslast(sselfscmdsc((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysBeginms    s^> (?P.*?)(?: from s, s )? dated s$cCsU|ii||d djo |ii|}|ot|id}|t j o,t i di |idt |}n|id|t i di|f}n||ijot |_g|_dSn|it j o|idd jo|id=n|g|_|ii|in%|it j o|ii|ndS( Nis>scounIds countriesscounNamestypestimeis(sselfsoutsdatasmsgs headerInfosmatchsmmsgroupscounIdsNonesempDbsmegaDBs resolveNameIdsints translateTimeslastsstorstlistsappend(sselfsmsgsmmscounId((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdatas$ ,,  $ cCs|i odSnti|i}ti|i}|idd|d<|d<|d}|i|t |)y!|d}|i|t |)Wn t j o|i|d\d+) by (?P\d+)\.$|^There can be up to (?P\d+) countries\.$|^An Empire time unit is (?P\d+) seconds long\.$|^The current time is s\.$|^An update consists of (?P\d+) empire time units\.$|^Each country is allowed to be logged in (?P\d+) minutes a day\.$|^It takes (?Pse) civilians to produce a BTU in one time unit\.$|^A non-aggi, 100 fertility sector can grow (?Ps8) food per etu\.$|^1000 civilians will harvest (?Ps?) food per etu\.$|^1000 civilians will give birth to (?PsN) babies per etu\.$|^1000 uncompensated workers will give birth to (?Ps7) babies\.$|^In one time unit, 1000 people eat (?Ps-) units of food\.$|^1000 babies eat (?Ps=) units of food becoming adults\.$|^Banks pay \$(?PsO) in interest per 1000 gold bars per etu\.$|^1000 civilians generate \$(?Ps$), uncompensated workers \$(?Ps=) each time unit\.$|^1000 active military cost \$(?Ps), reserves cost \$(?PsH)\.$|^Happiness p\.e\. requires 1 happy stroller per (?P\d+) civ\.$|^Education p\.e\. requires 1 class of graduates per (?P\d+) civ\.$|^Happiness is averaged over (?P\d+) time units\.$|^Education is averaged over (?P\d+) time units\.$|^The technology/research boost you get from the world is (?Ps)%\.$|^Nation levels \(tech etc\.\) decline 1% every (?P\d+) time units\.$|^Tech Buildup is limited to logarithmic growth \(base (?Ps)\) after (?Ps)\.$|^Maximum mobility\s+(?P.*)$|^Max mob gain per update\s+(?P.*)$|^Max eff gain per update\s+(?P.*)$|^Fire ranges are scaled by (?Psc)$|^(?P)Options enabled in this game:$|^(?P)Options disabled in this game:$c'"Cs|ii||idjo|djoLhdd<dd<|i}|iitd||id|_nt t t t i t i|d|id*dSn|ii|}!|!t jodSn|!id d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)!\!}}} } }}}&}}} }}}} }}}}}}}"} }$}} }}}}}}}}%|t j o&tdd*t4|t4|fn| t j otdd+t4| n| t j otdd,t4| nk|t j ot5i6d-i7|!nF|t j otdd.t4|n|&t j otdd/t4|&n|t j otdd0t8|n|t j otdd1t8|n| t j otdd2t8| d3n|t j otdd4t8|d3nT|t j otdd5t8|d3n)|t j otdd6t8|d3n| t j otdd7t8| d3n|t j otdd8t8|d3n|t j otdd9t8|d3n}|t j otdd:t8|d3nR|t j otdd;t8|d3n'|t j otdd<t8|d3n|t j otdd=t4|n|"t j otdd>t4|"n| t j otdd?t4| n|$t j otdd@t4|$n`|t j otddAt8|n9| t j otddBt4| n|t j otddCt8|n|t j otddDt8|n|t j oeg}xHt i|D]7}#|#dEjo|i;dFq|i;t4|#qWtddG|nR|t j oeg}xHt i|D]7}#|#dEjo|i;dFqe|i;t4|#qeWtddH|n|t j oeg}xHt i|D]7}#|#dEjo|i;dFq|i;t4|#qWtddI|nn|t j otddJt8|nG|t j og|_d|_n$|%t j og|_d|_ndS(KNisisenabledOptionsisdisabledOptionssversions,smaxXsmaxYscounsetusdatesupdtsminutessbtusgrowsharvsbirthsubirthseatsbabysintereststaxsutaxsmilcostsrescostsstrollsgradshavgseavgsboostsdeclinestbasestaftersOmaxsOmobsOeffsfires goOptionss goNoOptionss worldsizes maxCountriess ETUSecondsstimes updateETUss minutesOnlinesBTURatesgrowRates harvestRatef1000.0s birthRates UBirthRateseatRatesBEatRates barInterestscivTaxsUWTaxsmilCosts reserveCosts happyRatioseducationRatios happyAverageseducationAverages techBoosts levelDeclinestechLogstechBases--is objectMaxs objectMobs objectEffs fireRange(<sselfsoutsdatasmsgspossnamesoptsssorts checkUpdatedsfiltersNonesmapsstringsstripssplits versionVarssmatchsmmsgroupsmaxXsmaxYscounsetusdatesupdtsminutessbtusgrowsharvsbirthsubirthseatsbabysintereststaxsutaxsmilcostsrescostsstrollsgradshavgseavgsboostsdeclinestbasestaftersOmaxsOmobsOeffsfires goOptionss goNoOptionssintsempDbsmegaDBsnoteTimesfloatsvalsisappend('sselfsmsgsbtusmaxXsmaxYstbasesubirthsupdtstaxsbabyshavgsharvscounsdeclinesOeffsvalsOmobsgrowsinterests goOptionssboostsmilcostsfiresbirthsdatesutaxseatsstrollsOmaxsrescoststaftersnamesetusmmsgradsiseavgs goNoOptionssminutes((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdata s   . {                                        ( s__name__s __module__s__doc__sattachsaltersDBsBeginsrescompiless_timesss_flts versionVarssdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseVersions  Os ParseNationcBstZdZddffZdZeidedede de de d e d e d e d e d e de de de de dZdZRS(sParse nation command.snationiss^s s Nation Report s'$|^Nation status is (?P.*?)\s+|s eff (?:mountain )?capital at sO has (?P\d+) civilians? & (?P\d+) military$|^No capital\. \(was at s!\)$|^ The treasury has \$(?Ps>)\s+Military reserves: (?P\d+)$|^Education\.*\s*(?Ps)\s+Happiness\.*\s*(?Ps)$|^Technology\.*\s*(?Ps)\s*Research\.*\s*(?Ps$)$|^Technology factor :\s*(?Ps!)%\s+Plague factor :\s*(?Ps)%$|^Max population :\s*(?P\d+)$|^Max safe population for civs/uws: (?P\d+)/(?P\d+)$|^Happiness needed is (?Ps)$cCsi|ii||ii|}|tjodSn|iddddddddd d d d d dddddddddd\}} }}}}}} } }}}}}} }} }}}}}}|tj o5t i!di"|t i!di#| t$|nW|tj ot%dd|n6|tj ot%ddt$|t$|ft i!di&hdt$|<dt$|<dt$|<dt$|<d t$|)The next update is at|The current time is ) s\.$cCs}|ii||ii|}|tjodSn|idtj ot i di |nt i di |dS(Nsnextstime( sselfsoutsdatasmsgsgetTimessmatchsmmsNonesgroupsempDbsmegaDBsnoteNextUpdatesnoteTime(sselfsmsgsmm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdatas ( s__name__s __module__s__doc__sattachsaltersDBsrescompiless_timesgetTimessdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseUpdates s ParseSpyPlanecBs tZdZddffZhde<de<de<dd<dd <d d <d d <dd<dd<dd<dd<dd<dd<dd\d+)\s+(?P\d+)\s+(?P\S+)\s+s\S+\s+s\s+c Cs|ii||idjoJ|djod|_d|_q|djod|_d|_qn|idjoXti|}|o>t i di ||idjo d|_qd|_qn*|idjo||_ d|_n|idjo(t |i|i ||_ d|_n|idjo|ii|o d |_q|ii|o d |_q|ii|}|o_tt|id d \}}hd d<dd<d|<d|<}|ii|q|idjo1t|i |}|o|ii|qCqt|n|id jo|ii|}|ott|idd d dd\} }}}} |t i di jo t!}nhd| <d|id<d|<d|<d |<}|i#i|qd|_n|id jo|ii|}|ott|idd d dd\} }}}} |t i di jo t!}nhd| <d|id<d|<d|<d |<}|i%i|qd|_ndS(NisSPY Plane reportisReconnaissance reportstimeiiiiissectorXssectorYsownersdess.sxsysidsownseffs countriesstype(&sselfsoutsdatasmsgsmodesspyPlanes curtimeFormatsmatchsmmsempDbsmegaDBsnoteTimeshdrs composeHeaders headerConverts shipHeaders landHeadersseaSectsinfosmapsintsgroupsxsys sect_changessappends composeBodys getLookInfosuStatssidsownerseffsplayersCN_OWNEDs ship_infos ship_changess land_infos land_changes( sselfsmsgsinfosmmsowners ship_infosysxs land_infosidseff((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdatast           !* ! <  ! <cCsY|ii|tidi|itidi|itidi|i dS(NsSHIPSs LAND UNITSsSECTOR( sselfsoutsEndscmdsempDbsmegaDBsupdatess ship_changess land_changess sect_changes(sselfscmd((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysEndGs(s__name__s __module__s__doc__sattachs sectToCoordss newdesToDess convertOwners headerConvertsBeginsrescompiless_sectorsseaSects shipHeaders landHeaderss_effsuStatssdatasEnd(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseSpyPlanes   Qs ParseFirecBsOtZdZddfddfddffZeidedZdZRS(s+Handle the fire command to find sunk ships.sbombisfirestorpedos^\s*s sunk!cCso|ii||ii|}|oBt|id}t i di hd|<dt t | <d?t | t | <d?t | t | <d?t | s|s)s(?:s efficients^(?:\[(?P.*?)\] )?s @ s$s^s is a s with approximately s military\.$s ^(?:Your|s) sislevelsminslagseffsprodcosts depletionscomoutscomuseis planetypeslcmshcmsmilsavailstechsshiptypeslandtypesgun(HsselfsoutsdatasmsgsstringsfindswhatslenssplitsitemsintsempDbsmegaDBstypeshas_keyssectorDesignationConvertsmcostsmaxoffsmaxdefspack_milspack_uwspack_civspack_bars pack_othersmaxpopsnamesxsfloatssectorNameConvertsmapsoperatorssetitemsvaluesskeyssjoins s_sectorNames s_shipIdentss_effs ParseUnitss s_sectorStatsss_shipOrSectorsrescompiless_sectors view_infos s_counNames ParseAttackss_mils attackInfos s_counIdents look_infosdigitsscomoutsminlevelslagseffscostsdepsdessisasNoneslevelsusesamountsappendslcmshcmscrewsavailstechsgun(!sselfsmsgspack_civspack_uwscostsmaxpopsmcostsispack_barsminlevelscrewsavailstechscomoutstypeseffsmaxoffsmaxdefslagsuses pack_otherslcmsasnameslevelsdepsdessgunspack_milsitemsamountsxshcm((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysdata`s      5####  ' %    "     ,2=.5  "       i     Z     i(s__name__s __module__sattachsaltersDBsBeginsdata(((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys ParseShowZs cCsxxtttttttttt t t t t ttttttttfD].}x%|iD]}ti||fqYWqIWtidS(N(s ParseReads ParseTeles ParseDumpsParseMaps ParseRealms ParseMoves ParseVersions ParseUpdates ParseNations ParseCapitalsParseSpys ParseAttacks ParseUnitss ParseSpyPlanes ParseReportsParseRelationssParseCoastWatchs ParseBuildsParseSimpleTimes ParseSates ParseFires ParseShowsclssattachsbindingsStandardParserssappendssort(sclssbinding((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys initializes I cCs&tt|}|o|SntSdS(s(Return the default parser for a command.N(sfindCmdsStandardParsersscmdsparsers ParseDefault(scmdsparser((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys lookupParser&s cCst|}ti||df}|t|jo1||d| |jot||d|jo||dSn|djoV||d}|d|t|d jo|ddjo||ddSqndS(s:Search a 2-tuple (name, len) command list for a given CMD.iiiN(slenscmdslsbisectslstspossabssprev(slstscmdslspossprev((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pysfindCmd0s G 0cCs8ti|d}t|| t||dfSdS(Ns,i(sstringsindexsssidxsint(sssidx((s@/mnt/gmirror/ports/games/ptkei/work/ptkei-1.18.1/src/empParse.pys str2Coords<scCsHti}||i||jo!||||