Вы не вошли.
Страницы 1
По ходу дела выяснилось что не только 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
Вне форума
Да, я использовал исходники vpa 3.62c а не с cvs. Поэтому номеру строк будут чуть-чуть отличаться. Но фикс таки всё равно требуется.
cat /dev/zero > /dev/null
Вне форума
Ошибка исправлена. Правленую версию VPA 3.62c можно взять тут: http://vgap.dailyfun.org/wiki/vpa
Чуть позже соберу более свежую версию, с sf.net и выложу туда же.
cat /dev/zero > /dev/null
Вне форума
Обещаная сборка лежит там же: http://vgap.dailyfun.org/wiki/vpa (т.е. версия vpa 3.63 beta 4)
В принципе, там достоточно много вкусного появилось. Щупайте.
cat /dev/zero > /dev/null
Вне форума
фикс был внесен в основную ветку VPA на sf.net.
cat /dev/zero > /dev/null
Вне форума
Страницы 1