Soldiers of Empires 2

Неофициальный моддинг SoE2

"Солдаты Империй II" ("Солдаты Империй 2") - высокодетализированный пошаговый варгейм (turn-based wargame) по Второй Мировой войне.

Re: Неофициальный моддинг SoE2

Postby Igor Kulakov » October 21st, 2015, 6:04 pm

Darth Maximius wrote:К Игорю: скажите, что где в записи игры хранится -это секрет? Может, Олега осчастливите? Подскажите ему, пожалуйста, чтобы он не бился головой об стену :lol: с утилитой.



Мне не жалко. Ковыряйтесь. Олегу или любому другому, разбирающемуся в программировании, этого будет достаточно, чтобы понять формат файла записи состояния игры. И написать полноценный редактор сейвов если в голову взбредет.

примечание: массив событий и скриптов реально не используются. просто задел на будущее.


// saving game state -------------------------------------------------------- //
procedure save_game_state;
var
F : File;
i,ii: longint;

S : TMap_Massive;
S2: TUnit_Massive;
S3: TTown_Massive;
S6: TAirbase_Massive;
S7: TFort_Massive;

S4: THeader_Scn;
S5: byte;
S8: integer;
S9: word;
S10: TLost_data;
S11: TEvents;
S12: TCurScript;

name_f:string;

begin
// обязательно!!!
config_ai_help_turn[1]:=0;
config_ai_help_turn[2]:=0;
config_ai_help_turn[3]:=0;
config_ai_help_turn[4]:=0;
config_ai_help_turn[5]:=0;
number_ai_help_turn:=0;


name_f:='game' +inttostr(sav_list.current_pos) + '.sav';


//
sell_number:=1;
load_sav_string:=load_sav_texts[47];
form1.logo_at_loading_scenario;


//
load_sav_string2:=load_sav_texts[25];
form1.logo_at_loading_scenario;


// тоже пока временно
Hdr_Massive.x_map_left_top:=x_map;
Hdr_Massive.y_map_left_top:=y_map;
for i:=1 to 321{361}{362}{874}{878}{956} do Hdr_Massive.temporary[i]:=0;


//
sell_number:=1;
load_sav_string2:=load_sav_texts[26];

// запись заголовка сценария
// временный вариант
AssignFile(F,ExtractFilePath(Application.ExeName) + 'save\' + name_f);


FileMode:=2;
Rewrite(F,1);
move(Hdr_Massive, S4, 1024);
BlockWrite(F,S4,1024);

// запись карты
for ii:=0 to map_height-1 do begin
for i:=0 to map_width-1 do begin
with Map_Massive [ii,i] do
begin
S:=Map_Massive[ii,i];
BlockWrite(F,S,9);
end;
end;
form1.logo_at_loading_scenario;
end;


//
sell_number:=1;
load_sav_string2:=load_sav_texts[27];
form1.logo_at_loading_scenario;

// запись списка типов юнитов для данного сценария
for i:=1 to 2800 do
begin
S5:=list_type_units_scen[i];
BlockWrite(F,S5,1);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[28];
form1.logo_at_loading_scenario;

// запись списка данных о городах и портах
for ii:=1 to 6000 do begin
with Twn_Massive [ii] do
begin
S3:=Twn_Massive[ii];
BlockWrite(F,S3,50);
end;
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[29];
form1.logo_at_loading_scenario;

// запись списка данных о аэродромах
for ii:=6001 to 8000 do begin
with Arb_Massive [ii] do
begin
S6:=Arb_Massive[ii];
BlockWrite(F,S6,50);
end;
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[30];
form1.logo_at_loading_scenario;

// запись списка данных о фортах
for ii:=8001 to 10000 do begin
with Frt_Massive [ii] do
begin
S7:=Frt_Massive[ii];
BlockWrite(F,S7,50);
end;
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[31];
form1.logo_at_loading_scenario;

// запись списка юнитов
for ii:=0 to 19999 do begin
with Unt_Massive [ii] do
begin
S2:=Unt_Massive[ii];
BlockWrite(F,S2,200);
end;
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[32];
form1.logo_at_loading_scenario;

// запись листа техники для данного сценария
for i:=1 to 3000 do
begin
S5:=list_tech_scen[i];
BlockWrite(F,S5,1);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[33];
form1.logo_at_loading_scenario;

// запись техники в запасе в быстром пуле
for i:=1 to 114000 do
begin
S8:=fast_pool_tech[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[34];
form1.logo_at_loading_scenario;

// запись техники в запасе в медленном пуле
for i:=1 to 114000 do
begin
S8:=slow_pool_tech[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[35];
form1.logo_at_loading_scenario;

// запись техники в ремонте
for i:=1 to 114000 do
begin
S8:=remont_pool_tech[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[36];
form1.logo_at_loading_scenario;

// запись техники в производстве
for i:=1 to 114000 do
begin
S9:=proizv_pool_tech[i];
BlockWrite(F,S9,2);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[37];
form1.logo_at_loading_scenario;

// запись массива потерь
for i:=1 to 38 do
begin
S10:=lost_data[i];
BlockWrite(F,S10,200);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[38];
form1.logo_at_loading_scenario;

// запись массива элитного резерва
for i:=1 to 38 do
begin
S8:=elite_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[39];
form1.logo_at_loading_scenario;

// запись массива необученного резерва
for i:=1 to 38 do
begin
S8:=conscript_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[40];
form1.logo_at_loading_scenario;

// запись массива раненых
for i:=1 to 38 do
begin
S8:=wounded_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[41];
form1.logo_at_loading_scenario;

// запись массива авто на складах
for i:=1 to 38 do
begin
S8:=avto_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[42];
form1.logo_at_loading_scenario;

// запись массива авто в ремонте
for i:=1 to 38 do
begin
S8:=avto_remont_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[43];
form1.logo_at_loading_scenario;

// запись массива лошадей в запасе
for i:=1 to 38 do
begin
S8:=horses_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[44];
form1.logo_at_loading_scenario;

// запись массива пулеметов на складах
for i:=1 to 38 do
begin
S8:=mg_reserv[i];
BlockWrite(F,S8,4);
end;

//
sell_number:=1;
load_sav_string2:=load_sav_texts[45];
form1.logo_at_loading_scenario;

// запись массива событий
for i:=1 to 1024 do
begin
S11:=events_list[i];
BlockWrite(F,S11,256);
end;

// запись массива приказов по производству техники...
for i:=1 to 114000 do
begin
S5:=proizv_orders[i];
BlockWrite(F,S5,1);
end;

// запись массива скриптов для списка из 20000 юнитов...
for i:=1 to 20000 do
begin
S12:=scripts_list[i];
BlockWrite(F,S12,32);
end;



CloseFile(F);

//
sell_number:=1;
load_sav_string2:=load_sav_texts[46];
form1.logo_at_loading_scenario;


// контроль слотов
test_cat2;
end;
User avatar
Igor Kulakov
IgorLab Software TEAM
IgorLab Software TEAM
 
Posts: 2560
Joined: November 21st, 2011, 11:18 am
Location: Evil Empire

Re: Неофициальный моддинг SoE2

Postby trurle » October 22nd, 2015, 12:26 pm

Апдейт утилиты моддинга:
1) Устранен баг, приводящий к аварийному завершению программы при попытке загрузить исполняемый файл игры, в утилитах экстракции или передачи вооружений .
2) Добавлен индикатор типа оружия и уровня "жути" оружия в утилите передачи вооружений.
Attachments
EDITOR_WIN32.zip
unpack and run under cygwin. See previous posts for details.
(52.01 KiB) Downloaded 79 times
editorScreenshot.png
Учите историю - может быть, в версии, которую пишут сейчас, вы уже в гробу.
Learn history - to be sure you are not overwritten by modern historians
User avatar
trurle
Major
Major
 
Posts: 524
Joined: September 22nd, 2013, 11:20 am
Location: Kyoto, Japan

Previous

Return to Солдаты Империй II

Who is online

Users browsing this forum: No registered users and 1 guest

cron