tutorial 07: explains airships, gems and ropeladders

This tutorial is not yet connected to the main storyline of the tutorials, but will be later.
shapetextures
Maikel de Vries 2015-12-16 21:52:34 +01:00
parent 1a15b83b4c
commit 01de7048c3
13 changed files with 531 additions and 0 deletions

View File

@ -0,0 +1,10 @@
{\rtf1\ansi\ansicpg1252\deff0\nouicompat{\fonttbl{\f0\froman Arial;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fcharset0 Arial;}}
{\*\generator Riched20 6.2.9200}\viewkind4\uc1
\pard\nowidctlpar\kerning1\b\f0\fs20\lang1033 Wandernder Wipf\b0\f1\fs24\lang1043\par
\b\f0\fs20\lang1033\par
\b0\fs16 Dein bester Freund, ein noch junger und neckischer Wipf, ist mal wieder davon gerannt. Fange ihn bevor er sich verletzt.\f1\fs24\lang1043\par
\par
\f0\fs16\lang1033 Ziel: Finde und fange deinen kleinen Freund.\f1\fs24\lang1043\par
\par
\f0\fs16\lang1033 Lernrunde erkl\f2\'e4rt: Bewegung, Klettern und Schwimmen.\f1\fs24\lang1043\par
}

View File

@ -0,0 +1,34 @@
{\rtf1\ansi\deff3\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\froman\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}{\f4\froman\fprq0\fcharset128 Arial;}{\f5\froman\fprq0\fcharset128 Times New Roman;}{\f6\fswiss\fprq0\fcharset128 Arial;}{\f7\fnil\fprq0\fcharset128 Arial;}{\f8\fnil\fprq0\fcharset128 FreeSans;}{\f9\fnil\fprq2\fcharset0 FreeSans;}{\f10\fswiss\fprq0\fcharset128 FreeSans;}{\f11\fnil\fprq2\fcharset0 Liberation Serif{\*\falt Times New Roman};}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s0\snext0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043 Normal;}
{\s15\sbasedon0\snext16\ql\nowidctlpar\sb240\sa120\keepn\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af9\afs28\alang1081\loch\f6\fs28\lang1043 Heading;}
{\s16\sbasedon0\snext16\sl288\slmult1\ql\nowidctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043 Text Body;}
{\s17\sbasedon16\snext17\sl288\slmult1\ql\nowidctlpar\sb0\sa120\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang1043 List;}
{\s18\sbasedon0\snext18\ql\nowidctlpar\sb120\sa120\noline\ltrpar\cf1\i\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\ai\loch\f5\fs24\lang1043 Caption;}
{\s19\sbasedon0\snext19\ql\nowidctlpar\noline\ltrpar\cf1\kerning1\dbch\af8\langfe2052\dbch\af10\afs24\alang1081\loch\f5\fs24\lang1043 Index;}
}{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment LibreOffice}{\vern67241986}}\deftab720
\viewscale100
{\*\pgdsctbl
{\pgdsc0\pgdscuse451\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Default Style;}}
\formshade{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\sectunlocked1\pgndec\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pgndec\pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043{\cf1\b\rtlch \ltrch\loch\fs20\lang1033\loch\f4
Airborne Mining}
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043\cf1\b\rtlch \ltrch\loch\fs20\lang1033\loch\f4
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
Up high in the skies, far above the stronghold of the evil wipf fraction, one of the villagers has an airbase. The head of Wipfville has asked you to help him mine gems from the sky islands over there. The clunkers can help the villagers hire some men in their fight against the evil fraction.}
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043\cf1\rtlch \ltrch\loch
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
Goal: }{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
Mine some gems from the sky islands.}
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043\cf1\rtlch \ltrch\loch
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
Tutorial explains: }{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
Airship, rope ladder, selling valuables}{\cf1\b0\rtlch \ltrch\loch\fs16\lang1033\loch\f4
.}
\par \pard\plain \s0\ql\nowidctlpar\ltrpar{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\cf1\kerning1\dbch\af7\langfe2052\dbch\af11\afs24\alang1081\loch\f5\fs24\lang1043\rtlch \ltrch\loch
\par }

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,23 @@
[Head]
Icon=8
Title=Tutorial07
Version=6,0
MaxPlayer=1
Difficulty=7
[Definitions]
Definition1=Objects.ocd
[Player1]
Crew=Clonk=1
[Landscape]
BottomOpen=1
Sky=Clouds1
SkyScrollMode=2
[Weather]
Climate=0,0,0,100
StartSeason=0,0,0,100
YearSpeed=0,0,0,100
Wind=1,100,-100,100

View File

@ -0,0 +1,333 @@
/**
Tutorial 07: Airborne Mining
Author: Maikel
Mine valuable gems from a ruby stalactite.
Following controls and concepts are explained:
* Airship controls
* Rope ladders
* Gem materials
* Selling at the flagpole
*/
static guide; // guide object
protected func Initialize()
{
// Tutorial goal.
var goal = CreateObject(Goal_Tutorial);
goal.Name = "$MsgGoalName$";
goal.Description = "$MsgGoalDescription$";
CreateObject(Rule_NoPowerNeed);
// Place objects in different sections.
InitMountain();
InitRubyIsland();
InitIslands();
InitVegetation();
InitAnimals();
InitAI();
// Environment.
Time->Init();
Time->SetTime(22 * 60 + 30);
Time->SetCycleSpeed(0);
// Wealth shown at all time
GUI_Controller->ShowWealth();
// Dialogue options -> repeat round.
SetNextMission("Tutorials.ocf\\Tutorial07.ocs", "$MsgRepeatRound$", "$MsgRepeatRoundDesc$");
return;
}
// Gamecall from goals, set next mission.
protected func OnGoalsFulfilled()
{
// Achievement: Tutorial completed.
GainScenarioAchievement("TutorialCompleted", 3);
// Dialogue options -> next round.
SetNextMission("Tutorials.ocf\\Tutorial08.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
private func InitMountain()
{
// Shipyard with lantern and flagpole.
CreateObjectAbove(Flagpole, 55, 504);
var shipyard = CreateObjectAbove(Shipyard, 90, 504);
var lamp = shipyard->CreateContents(Lantern);
lamp->TurnOn();
// Indestructible airship.
var airship = CreateObjectAbove(Airship, 120, 504);
airship->MakeInvincible();
// Lorry with dynamite and tools.
var lorry = CreateObjectAbove(Lorry, 120, 498);
for (var cnt = 0; cnt < 4; cnt ++)
{
var dynamite_box = lorry->CreateContents(DynamiteBox);
dynamite_box->SetDynamiteCount(3);
}
lorry->CreateContents(Pickaxe);
lorry->CreateContents(TeleGlove);
return;
}
private func InitRubyIsland()
{
// Two rope ladders give access to the ruby stalactite.
CreateObjectAbove(Ropeladder, 740, 160)->Unroll(-1, COMD_Up);
CreateObjectAbove(Ropeladder, 780, 160)->Unroll(-1, COMD_Up);
return;
}
private func InitIslands()
{
// Armory on the lower island with weaponry to kill bats.
CreateObjectAbove(WindGenerator, 700, 648);
var armory = CreateObjectAbove(Armory, 654, 648);
armory->CreateContents(Wood, 10);
armory->CreateContents(Metal, 5);
return;
}
// Vegetation throughout the scenario.
private func InitVegetation()
{
PlaceGrass(85);
PlaceObjects(Firestone, 25 + Random(5), "Earth");
PlaceObjects(Loam, 15 + Random(5), "Earth");
Branch->Place(40);
Trunk->Place(10);
Tree_Deciduous->Place(40);
return;
}
private func InitAnimals()
{
// The sky islands are a natural place for bats to hide.
var bats = Bat->Place(6);
// Make the bats a bit weaker so that they are killed with a single arrow.
for (var bat in bats)
{
bat.MaxEnergy = 7000;
bat->DoEnergy(bat.MaxEnergy - bat->GetEnergy());
}
return;
}
// Initializes the AI: which is all defined in System.ocg
private func InitAI()
{
// A pilot npc for explaining the sky islands.
var npc_pilot = CreateObjectAbove(Clonk, 108, 496);
npc_pilot->SetColor(0xffff00);
npc_pilot->SetName("Chris");
npc_pilot->SetObjectLayer(npc_pilot);
npc_pilot->SetSkin(2);
npc_pilot->SetDir(DIR_Right);
npc_pilot->CreateContents(TeleGlove);
npc_pilot->SetDialogue("Pilot", true);
return;
}
/*-- Player Handling --*/
protected func InitializePlayer(int plr)
{
// Position player's clonk.
var clonk = GetCrew(plr, 0);
clonk->SetPosition(60, 494);
var effect = AddEffect("ClonkRestore", clonk, 100, 10);
effect.to_x = 60;
effect.to_y = 494;
// Items for the clonk.
clonk->CreateContents(Shovel);
var dynamite_box = clonk->CreateContents(DynamiteBox);
dynamite_box->SetDynamiteCount(3);
// Take ownership of the flags.
for (var flag in FindObjects(Find_Or(Find_Func("IsFlagpole"), Find_ID(WindGenerator))))
flag->SetOwner(plr);
// Knowledge to construct bow and arrow.
SetPlrKnowledge(plr, Bow);
SetPlrKnowledge(plr, Arrow);
// Add an effect to the clonk to track the goal.
var track_goal = AddEffect("TrackGoal", nil, 100, 2);
track_goal.plr = plr;
// Standard player zoom for tutorials, player is not allowed to zoom in/out.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 400, nil, PLRZOOM_Direct | PLRZOOM_LimitMax);
// Determine player movement keys.
var left = GetPlayerControlAssignment(plr, CON_Left, true, true);
var right = GetPlayerControlAssignment(plr, CON_Right, true, true);
var up = GetPlayerControlAssignment(plr, CON_Up, true, true);
var down = GetPlayerControlAssignment(plr, CON_Down, true, true);
var interact = GetPlayerControlAssignment(plr, CON_Interact, true, true);
var control_keys = Format("[%s] [%s] [%s] [%s]", up, left, down, right);
// Create tutorial guide, add messages, show first.
guide = CreateObjectAbove(TutorialGuide, 0, 0, plr);
guide->AddGuideMessage(Format("$MsgTutorialFindRubies$", interact, control_keys));
guide->ShowGuideMessage(0);
AddEffect("TutorialFindStalactite", nil, 100, 2);
return;
}
/*-- Intro, Tutorial Goal & Outro --*/
global func FxTrackGoalTimer(object target, proplist effect, int time)
{
if (GetWealth(effect.plr) >= 250)
{
var outro = AddEffect("GoalOutro", target, 100, 5);
outro.plr = effect.plr;
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxGoalOutroStart(object target, proplist effect, int temp)
{
if (temp)
return FX_OK;
// Show guide message congratulating.
guide->AddGuideMessage("$MsgTutorialCompleted$");
guide->ShowGuideMessage(5);
return FX_OK;
}
global func FxGoalOutroTimer(object target, proplist effect, int time)
{
if (time >= 60)
{
var goal = FindObject(Find_ID(Goal_Tutorial));
goal->Fulfill();
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxGoalOutroStop(object target, proplist effect, int reason, bool temp)
{
if (temp)
return FX_OK;
return FX_OK;
}
/*-- Guide Messages --*/
// Finds when the Clonk has done 'X', and changes the message.
global func FxTutorialFindStalactiteTimer(object target, proplist effect, int timer)
{
var clonk = FindObject(Find_ID(Clonk), Find_Distance(150, 780, 200));
if (clonk)
{
guide->AddGuideMessage(Format("$MsgTutorialParkAirship$"));
guide->ShowGuideMessage(1);
AddEffect("TutorialAirshipParked", nil, 100, 2);
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxTutorialAirshipParkedTimer(object target, proplist effect, int timer)
{
var clonk = FindObject(Find_ID(Clonk), Find_Distance(30, 700, 230));
var airship = FindObject(Find_ID(Airship), Find_Distance(30, 700, 230));
if (clonk && airship)
{
var plr = clonk->GetOwner();
var left = GetPlayerControlAssignment(plr, CON_Left, true, true);
var right = GetPlayerControlAssignment(plr, CON_Right, true, true);
guide->AddGuideMessage(Format("$MsgTutorialLadderJump$", left, right));
guide->ShowGuideMessage(2);
AddEffect("TutorialOnStalactite", nil, 100, 2);
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxTutorialOnStalactiteTimer(object target, proplist effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(810, 150, 24, 72)))
{
guide->AddGuideMessage("$MsgTutorialBlastGems$");
guide->ShowGuideMessage(3);
AddEffect("TutorialCollectGems", nil, 100, 2);
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxTutorialCollectGemsTimer(object target, proplist effect, int timer)
{
if (FindObject(Find_ID(Ruby)))
{
guide->AddGuideMessage("$MsgTutorialCollectGems$");
guide->ShowGuideMessage(4);
return FX_Execute_Kill;
}
return FX_OK;
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show airship parking space.
if (index == 1)
TutArrowShowPos(700, 240, 135);
// Show dynamite placement location.
if (index == 3)
TutArrowShowPos(800, 200, 60);
return;
}
protected func OnGuideMessageRemoved(int plr, int index)
{
TutArrowClear();
return;
}
/*-- Clonk restoring --*/
global func FxClonkRestoreTimer(object target, proplist effect, int time)
{
// Respawn clonk to new location if reached certain position.
return FX_OK;
}
// Relaunches the clonk, from death or removal.
global func FxClonkRestoreStop(object target, effect, int reason, bool temporary)
{
if (reason == 3 || reason == 4)
{
var restorer = CreateObjectAbove(ObjectRestorer, 0, 0, NO_OWNER);
var x = BoundBy(target->GetX(), 0, LandscapeWidth());
var y = BoundBy(target->GetY(), 0, LandscapeHeight());
restorer->SetPosition(x, y);
var to_x = effect.to_x;
var to_y = effect.to_y;
var airship = FindObject(Find_ID(Airship));
to_x = airship->GetX();
to_y = airship->GetY();
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObjectAbove(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkRestore");
}
return FX_OK;
}

View File

@ -0,0 +1,17 @@
# Goal Description
MsgGoalName=Edelsteine abbauen
MsgGoalDescription=Find and mine the gem stalactite, then sell the gems at the flagpole.
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutorialFindRubies=You are high up in the sky in an area with several sky islands. Talk to the pilot for some advice about the area and then take the airship and find the ruby stalactite hanging from one of the islands. You can grab the airship with [%s] and then steer it with %s.
MsgTutorialParkAirship=Ah you found the ruby stalactite. Now it is time to blast it to gems! Park your airship in front of the rope ladders over there.
MsgTutorialLadderJump=Good, now your companion will control the airship and you can jump to the ruby stalactite. Jump towards a hanging rope ladder and you will automatically grab it. You can switch sides or let go of the ladder by pressing the movement keys [%s]/[%s]. Instead of letting go you can also jump off the ladder if you press the movement key corresponding to the side your a hanging on while climbing up.
MsgTutorialBlastGems=Okay, you can now plant some dynamite sticks on the stalactite and get back on board of the airship. Then fuse the dynamite to blast the stalactite.
MsgTutorialCollectGems=Perfect blast! Now collect at least five gems and sell them back at the flagpole, you can sell them by transfering them into the flagpole using the interaction menu. If you are lazy you can use the teleglove to pick up the gems from the sky island below.
MsgTutorialCompleted=Well done, you have stolen enough rubies from the evil Wipf fraction to hire some clonks for your attack on the fraction's stronghold.

View File

@ -0,0 +1,17 @@
# Goal description
MsgGoalName=Mine gems
MsgGoalDescription=Find and mine the gem stalactite, then sell the gems at the flagpole.
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutorialFindRubies=You are high up in the sky in an area with several sky islands. Talk to the pilot for some advice about the area and then take the airship and find the ruby stalactite hanging from one of the islands. You can grab the airship with [%s] and then steer it with %s.
MsgTutorialParkAirship=Ah you found the ruby stalactite. Now it is time to blast it to gems! Park your airship in front of the rope ladders over there.
MsgTutorialLadderJump=Good, now your companion will control the airship and you can jump to the ruby stalactite. Jump towards a hanging rope ladder and you will automatically grab it. You can switch sides or let go of the ladder by pressing the movement keys [%s]/[%s]. Instead of letting go you can also jump off the ladder if you press the movement key corresponding to the side your a hanging on while climbing up.
MsgTutorialBlastGems=Okay, you can now plant some dynamite sticks on the stalactite and get back on board of the airship. Then fuse the dynamite to blast the stalactite.
MsgTutorialCollectGems=Perfect blast! Now collect at least five gems and sell them back at the flagpole, you can sell them by transfering them into the flagpole using the interaction menu. If you are lazy you can use the teleglove to pick up the gems from the sky island below.
MsgTutorialCompleted=Well done, you have stolen enough rubies from the evil Wipf fraction to hire some clonks for your attack on the fraction's stronghold.

View File

@ -0,0 +1,9 @@
// Also find pilots in other layers.
#appendto Airship
private func AirshipPilot()
{
// Looks for a clonk within the gondola.
return FindObject(Find_ID(Clonk), Find_OCF(OCF_Alive), Find_InRect(gondola[0], gondola[1], gondola[2], gondola[3]), Find_AnyLayer());
}

View File

@ -0,0 +1,70 @@
// A pilot which tells about the sky islands.
#appendto Dialogue
public func Dlg_Pilot_Init(object clonk)
{
AddEffect("IntPilot", clonk, 100, 5, this);
return true;
}
public func Dlg_Pilot_1(object clonk)
{
MessageBox(Format("$DlgPilotHello$", dlg_target->GetName()), clonk, dlg_target);
return true;
}
public func Dlg_Pilot_2(object clonk)
{
MessageBox("$DlgPilotReply$", clonk, clonk);
return true;
}
public func Dlg_Pilot_3(object clonk)
{
MessageBox("$DlgPilotBats$", clonk, dlg_target);
return true;
}
public func Dlg_Pilot_4(object clonk)
{
MessageBox("$DlgPilotAgainstBats$", clonk, clonk);
return true;
}
public func Dlg_Pilot_5(object clonk)
{
MessageBox("$DlgPilotBowArrow$", clonk, dlg_target);
return true;
}
public func Dlg_Pilot_6(object clonk)
{
MessageBox("$DlgPilotHaveBow$", clonk, clonk);
return true;
}
public func Dlg_Pilot_7(object clonk)
{
MessageBox("$DlgPilotArmory$", clonk, dlg_target);
StopDialogue();
SetDialogueProgress(1);
return true;
}
public func Dlg_Pilot_Closed(object clonk)
{
GameCall("OnHasTalkedToFireman", clonk);
return true;
}
public func FxIntPilotStart(object target, proplist effect)
{
return FX_OK;
}
public func FxIntPilotTimer(object target, proplist effect, int time)
{
return FX_OK;
}

View File

@ -0,0 +1,8 @@
# Dialogue: Pilot
DlgPilotHello=Hello I am %s, have you seen sky islands before?
DlgPilotReply=No, but I have been told they are home to gem stalactites.
DlgPilotBats=Yes, indeed. But you have to be careful, they are also home to bats which become active during night.
DlgPilotAgainstBats=Oh, what can I do against bats?
DlgPilotBowArrow=Well, if they attack you... You can fend them off using the bow and arrows.
DlgPilotHaveBow=I see, well, do you have a bow for me?
DlgPilotArmory=I think you can produce one in the armory together with arrows, I have built an armory on the island to the lower right from here.

View File

@ -0,0 +1,8 @@
# Dialogue: Pilot
DlgPilotHello=Hello I am %s, have you seen sky islands before?
DlgPilotReply=No, but I have been told they are home to gem stalactites.
DlgPilotBats=Yes, indeed. But you have to be careful, they are also home to bats which become active during night.
DlgPilotAgainstBats=Oh, what can I do against bats?
DlgPilotBowArrow=Well, if they attack you... You can fend them off using the bow and arrows.
DlgPilotHaveBow=I see, well, do you have a bow for me?
DlgPilotArmory=I think you can produce one in the armory together with arrows, I have built an armory on the island to the lower right from here.

View File

@ -0,0 +1,2 @@
DE:Luftmine
US:Airborne Mining