#1 19.05.2009 01:19:31

valexey
The Q
Откуда: Москва, Россия
Здесь с 30.11.2006
Сообщений: 1,275

VPA & utilX.dat

По ходу дела выяснилось что не только PDV плохо умеет utilX.dat. VPA тоже не без греха: при чтении utilX.dat записи с ID=3 (DarkSense) наличие базы на планете не принимается во внимание, соответственно на карте базы не появляются и игрок о них вообще ничего не знает. Что не есть правильно. PСС и PDV всё прекрасно показывают.

Ошибку в VPA я локализовал, знаю что и как поправить. Но не знаю как и чем собрать  VPA. Если бы кто-нибудь поделился бы настроенной системой сборки был бы премного благодарен.

Далее технические подробности:
Ошибка сидит в файлике msgread.pas.

функция ReadUtilData со строки 1234
          3     : begin                                 { dark sense }
                    BlockRead(f, util_ds, Sizeof(util_ds));
                    InitRecU(mDarkSense, util_ds.pid);
                    owner := util_ds.owner;
                    p.N := util_ds.n; p.Nc := -1;
                    p.T := util_ds.t; p.Tc := -1;
                    p.D := util_ds.d; p.Dc := -1;
                    p.M := util_ds.m; p.Mc := -1;
                    p.funds := util_ds.mc;
                    newpln := newpln OR (NP_Owner OR NP_NTDM_Funds);
                    StoreRecU;
                  end;

Как видим поле util_ds.base внаглую игнорируется.
Предлагаю два варианта фикса:

1) Заменить вышеозначенный код на:

функция ReadUtilData со строки 1234
          3     : begin                                 { dark sense }
                    BlockRead(f, util_ds, Sizeof(util_ds));
                    InitRecU(mDarkSense, util_ds.pid);
                    owner := util_ds.owner;
                    p.N := util_ds.n; p.Nc := -1;
                    p.T := util_ds.t; p.Tc := -1;
                    p.D := util_ds.d; p.Dc := -1;
                    p.M := util_ds.m; p.Mc := -1;
                    p.funds := util_ds.mc;
                    p.base
                    newpln := newpln OR (NP_Owner OR NP_NTDM_Funds OR NP_Base);

                    if util_ds.base <> 0 then TEnd^.data^.eplan[id].activity:= eplan[id].activity OR EP_Base;
                    else TEnd^.data^.eplan[id].activity:= eplan[id].activity OR EP_NoBase;

                    StoreRecU;
                  end;

минимальное вмешательство в код...

2) Второй вариант:

функция ReadUtilData со строки 1234
          3     : begin                                 { dark sense }
                    BlockRead(f, util_ds, Sizeof(util_ds));
                    InitRecU(mDarkSense, util_ds.pid);
                    owner := util_ds.owner;
                    p.N := util_ds.n; p.Nc := -1;
                    p.T := util_ds.t; p.Tc := -1;
                    p.D := util_ds.d; p.Dc := -1;
                    p.M := util_ds.m; p.Mc := -1;
                    p.funds := util_ds.mc;
                    newpln := newpln OR (NP_Owner OR NP_NTDM_Funds OR NP_Base);
                    if util_ds.base <> 0 then e.activity := e.activity OR EP_Base; {new code}
                    else e.activity := e.activity OR EP_NoBase; {end new code}
                    StoreRecU;
                  end;
процедура StoreRecGen с 917 строчки новый код
        'P'     : if (id>=1) and (id<=500) and (owner<>player) and (not IsData[owner]) and
                     ((p.when<>today) or ((p.owner<>player) and not IsData[p.owner])) then
                  begin
                    newplan[id]:=newpln;
                    p.when:=msgdate;
                    if p.when0=-1 then p.when0:=p.when;
                    if newpln and NP_MFD_FCode=0 then p.fcode:=#$FF#$FF#$FF;
                    if (owner=-1) and (newpln and NP_Owner<>0) and
                       not (eplan[id].owner in [0,255]) then owner:=eplan[id].owner;
                    p.owner:=owner;
                    if owner<>-1 then eplan[id].owner:=owner;
                    if planet[id]=nil then
                      begin CheckMem(SizeOf(PRec)); New(planet[id]) end;
                    planet[id]^:=p;
                    if from_msg and (mt in [mExploration,mDarkSense]) then
                    begin
                      sb:=PosInStr(StarBase,mm.text[mm.lines])<>0;
                      eplan[id].activity:=(eplan[id].activity and ($FF-EP_Base-EP_NoBase)) or IIF(sb,EP_Base,EP_NoBase);
                      newplan[id]:=newplan[id] or NP_Base;
                    end
                    else begin {new code}
                      eplan[id].activity:=e;
                    end; {end new code}
                    msgobj:=id or LockP;
                    DataChg:=Yes;
                  end;

В паскале я не силен, посему где-то мог накосячить в синтаксисе. В исходниках ВПА тоже не силен, посему мог и в логике накосячить ;-) Посему просьба меня проверить.


cat /dev/zero > /dev/null

Вне форума

#2 19.05.2009 01:41:34

valexey
The Q
Откуда: Москва, Россия
Здесь с 30.11.2006
Сообщений: 1,275

Re: VPA & utilX.dat

Да, я использовал исходники vpa 3.62c а не с cvs. Поэтому номеру строк будут чуть-чуть отличаться. Но фикс таки всё равно требуется.


cat /dev/zero > /dev/null

Вне форума

#3 19.05.2009 22:51:56

valexey
The Q
Откуда: Москва, Россия
Здесь с 30.11.2006
Сообщений: 1,275

Re: VPA & utilX.dat

Ошибка исправлена. Правленую версию VPA 3.62c можно взять тут: http://vgap.dailyfun.org/wiki/vpa

Чуть позже соберу более свежую версию, с sf.net и выложу туда же.


cat /dev/zero > /dev/null

Вне форума

#4 19.05.2009 23:28:25

valexey
The Q
Откуда: Москва, Россия
Здесь с 30.11.2006
Сообщений: 1,275

Re: VPA & utilX.dat

Обещаная сборка лежит там же: http://vgap.dailyfun.org/wiki/vpa (т.е. версия vpa 3.63 beta 4)

В принципе, там достоточно много вкусного появилось. Щупайте.


cat /dev/zero > /dev/null

Вне форума

#5 24.05.2009 20:07:58

valexey
The Q
Откуда: Москва, Россия
Здесь с 30.11.2006
Сообщений: 1,275

Re: VPA & utilX.dat

фикс был внесен в основную ветку VPA на sf.net.


cat /dev/zero > /dev/null

Вне форума

Подвал форума

Под управлением FluxBB
Модифицировал Visman