First Steps in Modding
From Original War Support Wiki
Tutorial By: Serpent
This tutorial shows you how to create a mod with one playable mission.
Create Mod
At the beginning we need to create mod. Go to your Original War main folder and run ow_editor.exe.
Click "Create Mod". Fill ModName and ShortName inputs and select "Extract Campaigns", "Extract data, gallery..".
Now click on "Create" button to confirm operation.
Copy existing map
We want to use one of the existing map. For example third mission from Russian Campaign.
Go to /Original War/mods/<your_mod>/Missions/__RU and copy 03 folder. Back to Missions directory, go to __AR folder and paste map here.
Next step is renameing map directory from 03 to 01.
Now open 01 folder and delete all of files from list:
- amici.src
- amici.src.old
- amici.src.older
- arabi.src
- arabi.src.old
- arabi.src.older
- dialogy.src
- difficulty.src
- Main.src
- Omikron AI.src
- rusi.src
- uvod.src
Open sources.txt files and delete this lines:
ENABLED "Omikron AI" ENABLED Main ENABLED uvod ENABLED dificulty ENABLED rusi ENABLED dialogy ENABLED jednotky ENABLED amici ENABLED arabi
Save operation and close file.
Create first mission
Back to OWEditor and click "Select Mod".
In Setup Wizard choose Load Map, click Next, click two times on __AR and again click two times on 01. Editor should load your map now.
Clean up some mess
Now look on the right panel. There are all areas of the map. We don't need it, so just delete it.
In next step delete all units. Click on Selection -> All or press CTRL + A. Now click Delete Unit (selected hexes) button on the upper panel.
Go to Files -> Map Preferences.
Change player on Side 2 (yellow) and side fog on Side 2 (yellow).
Select Description, change Russian Camp. to Arabian Camp and set mission number to 01. Confirm operation by clicking Accept.
Save changes - click on Files -> Save or press CTRL + S.
Mission plan
Main commander "Robert Farmer" with small force try to capture russian base and defend from enemy counterstrike.
ToDo List
- Create Robert Farmer and small arabian forces.
- Create russian base with personel and simple AI.
- Prepare counterattack when player capture base.
- Display medals and win screen if all enemy units died.
- Display YouLost message when Robert Farmer dies.
- Add some dialogs.
- Add crates spawn.
- Block some techs and buildings.
ToDo #1 - Create Robert Farmer and small arabian forces
We gonna use SAIL to create every unit in this mission (expect buildings).
Click SAIL and open SAIL Editor.
In SAIL Editor click File -> New module, write "Main" and confirm.
Now it's time for some coding.
Starting begin ResetFog; // prepare fog of war, not must be but I recommend to use it End;
It first block. Executed on the begin, when the mission started. Click Commands -> Compile or press CTRL + F9 to compile and save changes in code.
Time to create Farmer and his friends.
Go to File and create another module named "Farmer".
Paste this code to Farmer module:
Export Farmer; // prepare global variable - Farmer
Export Function PrepareFarmer;
var i;
begin
uc_side := 2; // set units color to yellow
uc_nation := nation_arabian; // or 2
hc_gallery := 'ru'; // gallery name
hc_face_number := 44; // face number in gallery
hc_name := 'Robert Farmer';
hc_importance := 100; // make farmer hero
PrepareHuman(sex_male, class_soldier, 3); // sex, class, basic_skill_value
Farmer := CreateHuman; // create Farmer
result := result ^ Farmer; // add Farmer to array
hc_importance := 0; // only Farmer is hero here
hc_gallery := ''; // random gallery
hc_name := ''; // random name
for i = 1 to 7 do // for loop
begin
PrepareHuman(false, i div 2 + 1, 3);
result := result ^ CreateHuman; // add new unit to array
end;
// spawn units
for i in result do
PlaceUnitXYR(i, 53, 8, 10, false);
// center camera on Farmer
CenterNowOnUnits(Farmer);
End;
In Main module:
Starting begin ResetFog; PrepareFarmer; // insert this line to use function from Farmer module End;
Time for the first test. Click Commands -> Run or press F9. The game should create Farmer and his friends.
ToDo #2 - Create Russian base with personel and simple AI
Time for some build. Close SAIL Editor and click button "Create Unit".
Change side to 3, nation to Russian and choose Russian depot from list.
Find some place on the map and press LPM + Left Shift. Building should stand strong :)
Feel free to use all buildings from the list and create Russian base.
Back to SAIL Editor and create third module "Russians" and paste this code:
Export Function PrepareRussian;
var i;
begin
uc_side := 3; // red color
uc_nation := nation_russian;
// if there is some bunkers
if FilterAllUnits([[f_side, 3], [f_btype, b_bunker]]) then
begin
for i = 1 to 2 do
begin
PrepareHuman(false, class_soldier, 2);
// place soldier in empty bunker
PlaceHumanInUnit(CreateHuman, FilterAllUnits([[f_side, 3], [f_btype, b_bunker], [f_empty]])[1]);
end;
end;
// add some engineers
for i = 1 to 2 do
begin
PrepareHuman(false, class_engineer, 2);
PlaceUnitXYR(CreateHuman, 102, 72, 4, false);
end;
End;
// AI
// Repair building or back to depot
Every 0$01 trigger FilterAllUnits([[f_side, 3], [f_class, 2]]) do
var i, b, engs, depot;
begin
enable; // repeat and repeat and repeat ...
b := FilterAllUnits([[f_side, 3], [f_type, unit_building], [f_not, [f_lives, 1000]]]); // find every russian buildings without full hp
engs := FilterAllUnits([[f_side, 3], [f_class, 2]]); // find every russian engineers
depot := FilterAllUnits([[f_side, 3], [f_btype, b_depot]])[1]; // get russian depot id
if not b then // everything is fine
begin
if UnitFilter(engs, [f_not, [f_inside]]) then
for i in UnitFilter(engs, [f_not, [f_inside]]) do
ComEnterUnit(i, depot); // go to depot
end
else // there is something to repair
begin
for i in engs do
if IsInUnit(i) then // eng is in depot
ComExitBuilding(i) // get out
else
if not HasTask(i) then // if not has any task
ComRepairBuilding(i, b[1]); // then go to work
end;
End;
// Event AI
// if tower is on red hp then solider should run and hide into armoury
On UnitGoesToRed(un) do
var i;
begin
if FilterAllUnits([[f_side, 3], [f_btype, b_armoury]]) then // if there is still place to hide...
begin
if GetBType(un) = b_bunker and GetSide(un) = 3 then
begin
i := UnitsInside(un)[1]; // get soldier id
if i then
ComEnterUnit(i, FilterAllUnits([[f_side, 3], [f_btype, b_armoury]])[1]);
end;
end;
End
In Main module:
Starting begin ResetFog; PrepareFarmer; PrepareRussian; // insert this line End;
ToDo #3 - Prepare counterattack when player capture base
Create next new module "Mission" and add code:
// when player capture depot
On BuildingCaptured(building, side, human) Do
begin
if GetBType(building) = b_depot then
begin
Wait(5$00); // wait 5 minutes
SendCounterAttack; // and send attack
end;
end;
Export attackers, count;
Export Function SendCounterAttack;
var i, un;
begin
attackers := [];
count := 0;
uc_side := 3;
uc_nation := 3;
// prepare 2 tanks and 3 soldiers
for i = 1 to 2 do
begin
vc_chassis := ru_medium_tracked;
vc_engine := engine_combustion;
vc_control := control_manual;
vc_weapon := ru_heavy_machine_gun;
un := CreateVehicle;
PlaceUnitXYR(un, 6, 5, 10, false);
PrepareHuman(false, class_mechanic, 3);
PlaceHumanInUnit(CreateHuman, un);
attackers := attackers ^ un;
// alternative u can use: attackers := Insert(attackers, attackers+1, un);
end;
for i = 1 to 3 do
begin
PrepareHuman(false, 1, 3);
un := CreateHuman;
attackers := Insert(attackers, attackers+1, un);
PlaceUnitXYR(un, 6, 5, 10, false);
end;
End;
// AI - Attack if attackers exists
Every 0$01 trigger attackers do
var i;
begin
enable;
for i in attackers do // attack nearest enemy unit
ComAttackUnit(i, NearestUnitToUnit(FilterAllUnits([f_enemy, 3]), i));
End;
On UnitDestroyed(un) do
begin
if un in attackers then
begin
attackers := attackers diff un; // delete unit from attackers
count := count + 1;
end;
End;
ToDo #4 - Display medals and win screen if all enemy units died
Stay in Mission module and add this code:
// Win!
Every 0$01 trigger not attackers and count >= 5 do
begin
AddMedal('good_job', 1);
AddMedal('good_job', 1);
AddMedal('good_job', 1);
GiveMedals('MAIN'); // display medals screen
RewardPeople(FilterAllUnits([f_side, your_side])); // reward exp.
YouWin; // end mission
End;
Now compile code, save changes and close OWEditor. Open Original War/mods/<your_mod>/campaigns/Ru and copy Txt01.wri file. Do one step back and create new "Ar" folder in campaigns directory. Paste Txt01.wri file here.
Open file using Windows Notepad (or diffrent text editor), press CTRL+A and delete everything.
Paste this code:
// this is first line ^MAIN * good_job + Good Job! - Bad Job! *
Save changes.
- - I recommended to use my DialogEditor.
ToDo #5 - Display YouLost message when Robert Farmer dies
In Txt01.wri:
// this is first line | farmer_die Farmer is dead. ^MAIN * good_job + Good Job! - Bad Job! *
In Mission module:
On UnitDestroyed(un) do
begin
if un in attackers then
begin
attackers := attackers diff un; // delete unit from attackers
count := count + 1;
end;
if un = Farmer then // <--- add this line
begin // <--- add this line
YouLost('farmer_die'); // <--- add this line
end; // <--- add this line
End;
ToDo #6 - Add some dialogs
We want add some dialogs for Farmer.
Open Txt01.wri:
// this is first line $ farm-1 - Hello! My name is Robert. $ farm-2 - We want capture Russian base! $ farm-3 - Help us! | farmer_die Farmer is dead. ^MAIN * good_job + Good Job! - Bad Job! *
In Main module:
Starting begin ResetFog; PrepareFarmer; PrepareRussian; Say(Farmer, 'farm-1'); // add this line Say(Farmer, 'farm-2'); // add this line Say(Farmer, 'farm-3'); // add this line End;
ToDo #7 - Add some crates spawn
In Mission module:
// Spawn crates Every 0$33 do begin enable; CreateCratesXYR(Rand(1,5), 96, 68, 20, true); End;
ToDo #8 - Block some techs and buildings
You can manipulate technologies and buildings status. Just click Missions and Technologies/Restrictions.
Summary
On this stage your files should looks like it:
Main module
Starting begin ResetFog; PrepareFarmer; PrepareRussian; Say(Farmer, 'farm-1'); // add this line Say(Farmer, 'farm-2'); // add this line Say(Farmer, 'farm-3'); // add this line End;
Farmer module
Export Farmer; // prepare global variable - Farmer
Export Function PrepareFarmer;
var i;
begin
uc_side := 2; // set units color to yellow
uc_nation := nation_arabian; // or 2
hc_gallery := 'ru'; // gallery name
hc_face_number := 44; // face number in gallery
hc_name := 'Robert Farmer';
hc_importance := 100; // make farmer hero
PrepareHuman(sex_male, class_soldier, 3); // sex, class, basic_skill_value
Farmer := CreateHuman; // create Farmer
result := result ^ Farmer; // add Farmer to array
hc_importance := 0; // only Farmer is hero here
hc_gallery := ''; // random gallery
hc_name := ''; // random name
for i = 1 to 7 do // for loop
begin
PrepareHuman(false, i div 2 + 1, 3);
result := result ^ CreateHuman; // add new unit to array
end;
// spawn units
for I in result do
PlaceUnitXYR(i, 53, 8, 10, false);
// center camera on Farmer
CenterNowOnUnits(Farmer);
End;
Russians module
Export Function PrepareRussian;
var i;
begin
uc_side := 3; // red color
uc_nation := nation_russian;
// if there is some bunkers
if FilterAllUnits([[f_side, 3], [f_btype, b_bunker]]) then
begin
for i = 1 to 2 do
begin
PrepareHuman(false, class_soldier, 2);
// place soldier in empty bunker
PlaceHumanInUnit(CreateHuman, FilterAllUnits([[f_side, 3], [f_btype, b_bunker], [f_empty]])[1]);
end;
end;
// add some engineers
for i = 1 to 2 do
begin
PrepareHuman(false, class_engineer, 2);
PlaceUnitXYR(CreateHuman, 102, 72, 4, false);
end;
End;
// AI
// Repair building or back to depot
Every 0$01 trigger FilterAllUnits([[f_side, 3], [f_class, 2]]) do
var i, b, engs, depot;
begin
enable; // repeat and repeat and repeat ...
b := FilterAllUnits([[f_side, 3], [f_type, unit_building], [f_not, [f_lives, 1000]]]); // find every russian buildings without full hp
engs := FilterAllUnits([[f_side, 3], [f_class, 2]]); // find every russian engineers
depot := FilterAllUnits([[f_side, 3], [f_btype, b_depot]])[1]; // get russian depot id
if not b then // everything is fine
begin
if UnitFilter(engs, [f_not, [f_inside]]) then
for i in UnitFilter(engs, [f_not, [f_inside]]) do
ComEnterUnit(i, depot); // go to depot
end
else // there is something to repair
begin
for i in engs do
if IsInUnit(i) then // eng is in depot
ComExitBuilding(i) // get out
else
if not HasTask(i) then // if not has any task
ComRepairBuilding(i, b[1]); // then go to work
end;
End;
// Event AI
// if tower is on red hp then solider should run and hide into armoury
On UnitGoesToRed(un) do
var i;
begin
if FilterAllUnits([[f_side, 3], [f_btype, b_armoury]]) then // if there is still place to hide...
begin
if GetBType(un) = b_bunker and GetSide(un) = 3 then
begin
i := UnitsInside(un)[1]; // get soldier id
if I then
ComEnterUnit(i, FilterAllUnits([[f_side, 3], [f_btype, b_armoury]])[1]);
end;
end;
End;
Mission module
// when player capture depot
On BuildingCaptured(building, side, human) Do
begin
if GetBType(building) = b_depot then
begin
Wait(5$00); // wait 5 minutes
SendCounterAttack; // and send attack
end;
end;
Export attackers, count;
Export Function SendCounterAttack;
var i, un;
begin
attackers := [];
count := 0;
uc_side := 3;
uc_nation := 3;
// prepare 2 tanks and 3 soldiers
for i = 1 to 2 do
begin
vc_chassis := ru_medium_tracked;
vc_engine := engine_combustion;
vc_control := control_manual;
vc_weapon := ru_heavy_machine_gun;
un := CreateVehicle;
PlaceUnitXYR(un, 6, 5, 10, false);
PrepareHuman(false, class_mechanic, 3);
PlaceHumanInUnit(CreateHuman, un);
attackers := attackers ^ un;
// alternative u can use: attackers := Insert(attackers, attackers+1, un);
end;
for i = 1 to 3 do
begin
PrepareHuman(false, 1, 3);
un := CreateHuman;
attackers := Insert(attackers, attackers+1, un);
PlaceUnitXYR(un, 6, 5, 10, false);
end;
End;
// AI - Attack if attackers exists
Every 0$01 trigger attackers do
var i;
begin
enable;
for I in attackers do // attack nearest enemy unit
ComAttackUnit(i, NearestUnitToUnit(FilterAllUnits([f_enemy, 3]), i));
End;
On UnitDestroyed(un) do
begin
if un in attackers then
begin
attackers := attackers diff un; // delete unit from attackers
count := count + 1;
end;
if un = Farmer then
begin
YouLost('farmer_die');
end;
End;
// Win!
Every 0$01 trigger not attackers and count >= 5 do
begin
AddMedal('good_job', 1);
AddMedal('good_job', 1);
AddMedal('good_job', 1);
GiveMedals('MAIN'); // display medals screen
RewardPeople(FilterAllUnits([f_side, your_side])); // reward exp.
YouWin; // end mission
End;
// Spawn crates
Every 0$33 do
begin
enable;
CreateCratesXYR(Rand(1,5), 96, 68, 20, true);
End;
Txt01.wri in Original War/mods/<your_mod>/campaigns/Ar
// this is first line $ farm-1 - Hello! My name is Robert. $ farm-2 - We want capture Russian base! $ farm-3 - Help us! | farmer_die Farmer is dead. ^MAIN * good_job + Good Job! - Bad Job! *
Campaign Settings
From <your_mod>/campaigns/Ru copy missions.dat file to <your_mod>/campaigns/Ar directory. Of course you can edit this file using notepad (or diffrent text editor).
Arabian Button in Main Menu
If you wanna run your mission ingame you need arabian button in main menu.
You can download button package here.
Last step is paste package into your main mod directory and unpacked archive (use WinRar or 7-Zip).





