Макросы & Фильтры



  Макросы и Фильтры для пользователей программы GV. Все очень просто. Все, что ниже, надо вставить в файл gv.ctl
Ты можешь либо посмотреть, либо сразу забрать в виде файла (11 Кб).

; Макросы пользователя.
; Macro <имя macro> = <значение>
; используются в Query, Filter, etc.

; Фильтр военных кораблей противников
Macro Wars = (warship| orbship) & enemy

; Фильтр своих военных кораблей
Macro Warme = (orbship | warship) & (race = me)

; Фильтр HЕ своих военных кораблей
Macro DangShip = orbship | warship

; Фильтр орбитальных кораблей
Macro Orbship = (weight>2 & (p.w>0 | p.s>0 & #>2) | weight<=2 & #>2 ) & speed<3.1

Macro Bombs = sum(#*bomb)
Macro Brutto = sum(#*weight)
Macro Netto = sum(#*cpty)
Macro Guns = sum(#*gun)

Macro OrbStan = orbship & p.w>=10
Macro OrbPerf = orbship & gun>5 & p.w<10
Macro OrbCov = orbship & weight<5
Macro OrbShield = orbcov & def>0
Macro DangShip = orbship | warship

Macro Cruiser = warship & p.w>=10 & speed>=3
Macro Perf = warship & gun>5 & p.w<10 & speed>=3
Macro Cover = warship & weight<6
Macro Drone = cover & def=0
Macro HD = cover & def>0
Macro AvgDef = sum(#*def)/summ(#)
Macro AvgDefence = sum(#*def*weight)/summ(#*weight)
Macro AvgCargo = sum(#*cpty)/summ(#)
Macro AvgAttack = sum(#*gun*attack)/summ(#*gun)
Macro AvgSpeed = sum(#*weight*speed)/summ(#*weight)
Macro EnyWar = warship & not Frend
Macro EnyOrb = orbship & not Frend
Macro EnyDang = dangship & not Frend
Macro EWar = warship & Enemy
Macro EOrb = orbship & Enemy
Macro EDang = dangship & Enemy
Macro DShip = EWar & dest to '#181' < speed
Macro Friend = race=me | Good
Macro Enemy = not Friend

; Технологии
;
; макрос получения текущих технологий
macro oldT =Nrace:=race\SELECTRACES(race=Nrace)\oldD:=drv\oldW:=wpn\oldS:=shld\oldC:=crg\SELECTPLANETS(race=Nrace)

; макросы пересчета технологий с учетом прироста
macro newT = NNewt:="D="+(oldt+plusD+oldD) str 4.2 +" W="+(plusW+oldW) str 4.2 +" S="+(plusS+oldS) str 4.2 +" C="+(plusC+oldC) str 4.2 +" N="+plusN str 4

; макросы пересчета замедленных технологий с учетом прироста
; 1 + log( 2^(OldTech-1) + L/3000)
; вспомогательный
; slow^( , )
Macro slow =func( 1 + ln( 2^(op(1)-1) + op(2)*5/3 ) / ln(2) )
; основной макрос
Macro slowT = NNewt:="D="+(oldT+slow^(oldD,plusD)) str 4.2 +" W="+slow^(oldW,plusW) str 4.2 +" S="+slow^(oldS,plusS) str 4.2 +" C="+slow^(oldC,plusC) str 4.2 +" N="+plusN str 4

; рабочие макросы подсчета прироста технологий
macro plusW = sum(l*(production='weapons'))/5000
macro plusS = sum(l*(production='shields'))/5000
macro plusD = sum(l*(production='drive'))/5000
macro plusC = sum(l*(production='cargo'))/5000

; основной макрос для обычных технологий
macro plusT = NNewt:="d="+(oldT+plusD) str 4.2 +" w="+plusW str 4.2 +" s="+plusS str 4.2 +" c="+plusC str 4.2 +" N="+plusN str 4

; макрос подсчета прироста замедленных технологий
macro plusST = NNewt:="d="+(oldT+slow^(oldD,plusD)-oldD) str 4.2 +" w="+(slow^(oldW,plusW)-oldW) str 4.2 +" s="+(slow^(oldS,plusS)-oldS) str 4.2 +" c="+(slow^(oldC,plusC)-oldC) str 4.2 +" N="+plusN str 4

; макросы подсчета прироста технологий по текущей науке
Macro plusN =pr_d:=production\sum(l*(production=pr_d))/5000

; макрос подсчета массы постройки типа корабля по всем планетам
Macro plusK =pr_d:=production\sum(outwgt*(production=pr_d))

; Макросы фильтра текущего флота из списка кораблей :
; Это надо запустить в Query для запоминания текущего флота
macro FLT =fl_t:=fleet
macro DST =ds_t:=dest
; Это фильтр по текущему флоту , запускается после FLT
macro FL =fleet = fl_t

; Буксировка
;
; вспомогательные макросы
; Pеальная загрузка
macro SpeedF =20*sum(#*d*p.d)/sum( #*(weight+(if (c > 0) (wgt / c)(0)) ) )
; полностью загруженого
macro SpeedC =20*sum(#*d*p.d)/sum( #*(weight+(if (c > 0) (cpty / c)(0)) ) )
; без груза
macro SpeedE =20*sum(#*d*p.d)/sum( #*weight )

; Макросы подсчета скорости флота, состоящего из кораблей списка :
; обобщенная
macro Flots =Fflot:="Speed="+SpeedF str 4.2 +" Full="+SpeedC str 4.2 +" Empty="+SpeedE str 4.2+' '+flt

; по текущему флоту
macro Flotm =Fflotm:="Spd="+SpeedF str 4.2 +" Ful="+SpeedC str 4.2 +" Emp="+SpeedE str 4.2+"/"+fleet str 10

; по текущему флоту
macro Fltt =Fflot:=flt+dst\SELECTSHIPS(fl_t=fleet & ds_t=dest & race=me)
macro Flott =Fflott:="Spd="+(Fltt+SpeedF) str 4.2 +" Ful="+SpeedC str 4.2 +" Emp="+SpeedE str 4.2+"/"+fl_t str 10

; Создание файла для программы BATTLE.EXE из списка кораблей
; результат получается в клипбоарде
MACRO battl = (WriteLn('# '+race))+sort(1)+sum(WriteLn(gun str 4.0+' '+p.w str 8.2+':'+w str 6.2+' '+p.s str 8.2+':'+s str 6.2+' '+weight str 8.2+' '+# str 4.0) ,0)


; Это вспомогательный макрос для подсчета скорости и бомбинга
Macro rc = r.c:=race

; Полеты планет
;
; Макрос подсчета скорости планеты - текущий
macro SP = r.c:=race\10*(L/size)*(1-size/2500)*(selectraces(race=r.c)+drv))

; Макрос подсчета скорости планеты из списка планет - произвольный
; SpeedP^( ,<0 | L> )
; D - Drive владельца
; L - производственные единицы,
; L=0 - берутся реальные значения
macro SpeedP = func(10*op(1)*( (if (op(2)=0)(L)(op(2)))/size)*(1-size/2500) )

; Бомбинг
;
; Ослабленный бомбинг - текущий
Macro SB = r.c:=race\d.e:=dest\sum(#*bomb)*(SELECTPLANETS(name=d.e)+1)/sqrt(1000/size*(SELECTRACES(race=r.c)+shld))
;Macro SB = sum(#*bomb)*(dst=dest)*(SELECTPLANETS(name=d.e)+1)*(rc=race)/sqrt(1000/size*(SELECTRACES(race=r.c)+shld))

; Ослабленный бомбинг - произвольный
; Sbomb^(Shields,Size)
; Shields - техи защита владельца планеты
; Size - размер планеты
Macro SBomb = func( sum(#*bomb)/sqrt(op(1)*1000/op(2)) )

; Терраформинг
;
; Макрос подсчета терраформинга
macro Terr = Tterr:="Size="+(Size+0.1*L) str 1 +" Res="+(Res*(1-L*0.3/Size)) str 3.2+ " Pop="+(if ((Pop*1.08+Col*8-Size-0.1*L)>0) (Size+0.1*L) (Pop*1.08+Col*8)) str 1+" Ind="+(if ((Ind+$-Size-0.1*L)>0) (Size+0.1*L) (Ind+$)) str 1

; Gentler
;А загружаюсь вручную по фильтру:
macro car =cpty>7 & state='in orbit'
;
macro loading =car & cpty-wgt>0.1 & (plcol^(dest)>5 or plcap^(dest)>35)
;macro plcol=func(getplanet(op(1))+col)
;macro plcap=func(getplanet(op(1))+$)
;macro plpop=func(getplanet(op(1))+pop)

; Автоматические погрузка-разгрузка ( UN ):
;
macro o =state='in orbit' & race=me
macro plcol =func(getplanet(op(1))+col)
macro plcap =func(getplanet(op(1))+$)
macro Ssize =func(getplanet(op(1))+size)

; Gentler
; 1. Выгрузить понемногу кола на пустые планеты (смотреть,
; чтоб кого не обидеть).
macro un1 =selectraces(1)\while cnt (selectships((owner(dest) like 'unin*') & typ='COL' & o & wgt)\if cnt (command('U '+ grp str 1+' 0 0.01')\show('NewPlan '+cnt str 5+' Grp='+grp str 1))(0))
; Gentler
; 2. Разгрузить все грузовики (трюм более 2 ) над своими планетами.
macro un2 =selectraces(1)\while cnt (selectships(owner(dest)=me & o & wgt>2)\if cnt (command('U '+grp str 1)\show('Unload '+cnt str 5.0+' Grp='+grp str 5))(0))

; Gentler
; 3. Загрузить единичные трюмы новых военных кораблей.
macro un3 =selectraces(1)\while cnt (selectships(owner(dest)=me & o & un3f & plcol^(dest))\if cnt (command('L '+grp str 1+' COL')\show('LoadColW'+cnt str 5+' Grp='+grp str 1))(0))
macro un3f =cpty>0 & p.c<3 & (cpty-wgt>0.1 & typ='COL' | typ='')

; 4. Загрузить грузовики CAP
macro un4 =selectraces(1)\while cnt (selectships(owner(dest)=me & o & un4f & plpop^(dest)> 0.98*Ssize^(dest) )\if cnt (command('L '+grp str 1+' CAP')\show('LoadCap'+cnt str 5+' Grp='+grp str 1))(0))
macro un4f =cpty>50 & (cpty-wgt>0 & typ='CAP' | typ='') & plcap^(dest)>cpty/2
;
; Обязательно проверяйте загрузку - возможна загрузка не того что вы хотите
; 5. Загрузить грузовики COL
macro un5 =selectraces(1)\while cnt (selectships(owner(dest)=me & o & un5f & plcol^(dest))\if cnt (command('L '+grp str 1+' COL')\show('LoadCol'+cnt str 5+' Grp='+grp str 1))(0))
macro un5f =cpty>1 & (cpty-wgt>0 & typ='COL' | typ='')
;
; Обязательно проверяйте загрузку - возможна загрузка не того что вы хотите

; и объединяющий макрос
macro un =un1\un2\un3\un4\un5

; разгрузка по порядку следования групп
; unload
macro unload =selectships(1)\cnt1:=cnt+20\while cnt1>0(cnt1:=cnt1-1\if cnt (show('Use '+cnt1 str 0)\Writeln('U '+cnt1 str 0+' 0 0.01')) ('Ok'))

; Разное
;
; отправка по фильтру на планету долет не более чем за турнов
; send,"",
macro send =selectraces(1)\while cnt>0(selectships(o &(dest to op(-1) > (op(0)-1)*speed) & !(dest to op(-1) > op(0)*speed))\if cnt(show('Send '+grp str 0+' to '+op(-1)+' ( '+cnt str 0+' )')\command('S '+grp str 0+' '+op(-1)))("O'k!"))

; Делаешь список кораблей врага, пишешь в фильтре
; Dist^("#123") и получаешь список кораблей, кто до #123 долетает за ход.
macro Dist = func( (speed > (planet to op(1)) ) )

; Массовая смена производства
;
; prod,"",
;например на планете производится Drive
; и я хочу заменить на это текущее производство
; везде , где заложена Shields :
; prod,"Sh*",0
; или на планетах с L<500 :
; prod,"*",500
; требуется задать фильтр Lprod , можете изобрести свой
macro Lprod =L;
macro Prod =Tprod:=production\while cnt ( selectplanets( Lprod & race=me & !(production=Tprod) )\if cnt (command("P "+name+" "+Tprod)\show('NewPlan '+cnt str 5+' Planet='+name str 12))(0) )

; Gentler
;Вот еще, может пригодится, макрос постановки в апгрейд одиночных
;дронов на свежезавоеванных планетах - чтоб видеть их лишний ход
macro plpop =func(getplanet(op(1))+pop)
macro updron =selectraces(race=me)\Tdr:=drv\while cnt>0 (selectships(owner(dest)=me&o & weight=1 & #=1 & TDr>d)\show('Rest:'+cnt str 1)\if cnt (command('X '+grp str 1+' DRIVE 1 '+(d+0.01) str 1.2))(0))\command("#")

; Делаешь список кораблей врага, пишешь в фильтре
; Dist^("#123") и получаешь список кораблей, кто до #123 долетает за ход.
macro Dist = func( (speed > (planet to op(1)) ) )




Спасибо SLIPPERY за этот научный труд.

Используются технологии uCoz

mr.Skull galaxy@caravan.ru
Реклама в Галактике
Используются технологии uCoz