add tutorial 5 explaining melee weapons

shapetextures
Maikel de Vries 2016-01-10 22:51:59 +01:00
parent 9bca345342
commit c35df88ae9
16 changed files with 834 additions and 0 deletions

View File

@ -0,0 +1,7 @@
Räuberhöhle
Archibald the head of the village takes you with him on a journey to a neighbouring village to ask for help. On your way you stumble upon a guy who lost his house to robbers. To make your way to the other village you need to pass through the cave where these robbers hide.
Ziel: Battle your way through the robber's cave.
Lernrunde erklärt: Waffen wie Bogen, Speed, Schwert und Schild.

View File

@ -0,0 +1,7 @@
Robber's Cave
Archibald the head of the village takes you with him on a journey to a neighbouring village to ask for help. On your way you stumble upon a guy who lost his house to robbers. To make your way to the other village you need to pass through the cave where these robbers hide.
Goal: Battle your way through the robber's cave.
Tutorial explains: weapons like bow, javelin, sword and shield.

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,24 @@
[Head]
Icon=6
Title=Tutorial05
Version=7,0
MaxPlayer=1
Difficulty=5
[Definitions]
Definition1=Objects.ocd
Definition2=Decoration.ocd
[Player1]
Crew=Clonk=1
[Landscape]
TopOpen=2
Sky=Clouds1
SkyScrollMode=2
[Weather]
Climate=0,0,0,100
StartSeason=0,0,0,100
YearSpeed=0,0,0,100
Wind=60,20,40,80

View File

@ -0,0 +1,390 @@
/**
Tutorial 05: Robber's Cave
Author: Maikel
Fight your way through a cave with robbers on the way to a fiendly village.
*/
static guide; // guide object.
protected func Initialize()
{
// Tutorial goal.
var goal = CreateObject(Goal_Tutorial);
goal.Name = "$MsgGoalName$";
goal.Description = "$MsgGoalDescription$";
// No power need for the elevator.
CreateObject(Rule_NoPowerNeed);
// Place objects in different sections.
InitBeforeCave();
InitCave();
InitAfterCave();
InitVegetation();
InitAnimals();
InitAI();
// Dialogue options -> repeat round.
SetNextMission("Tutorials.ocf\\Tutorial05.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\\Tutorial06.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
private func InitBeforeCave()
{
// Wooden cabin ruin for the old man.
CreateObjectAbove(Ruin_WoodenCabin, 252, 384)->MakeInvincible();
// A small forest at the start.
Tree_Deciduous->Place(7, Rectangle(0, 260, 100, 160));
Tree_Coniferous2->Place(2, Rectangle(0, 260, 100, 160));
Tree_Coniferous2->Place(2, Rectangle(0, 260, 100, 160));
// A grain field near the wooden cabin.
Wheat->Place(24, Rectangle(100, 260, 100, 160));
CreateObjectAbove(StrawMan, 140, 384);
CreateObjectAbove(StrawMan, 170, 384);
// Create door to block cave entrance until destroyed straw men.
var door = CreateObject(StoneDoor, 396, 362);
door->MakeInvincible();
door.Visibility = VIS_None;
return;
}
private func InitCave()
{
// A chest with javelins to kill the first robber.
var chest = CreateObjectAbove(Chest, 544, 480);
chest->CreateContents(Javelin, 2);
// Some torches to see the enemies.
CreateObjectAbove(Torch, 500, 474)->AttachToWall(true);
CreateObjectAbove(Torch, 506, 628)->AttachToWall(true);
CreateObjectAbove(Torch, 728, 696)->AttachToWall(true);
// A hidden chest with a musket.
var chest = CreateObjectAbove(Chest, 10, 526);
var musket = chest->CreateContents(Musket);
musket->CreateContents(LeadShot);
return;
}
private func InitAfterCave()
{
// A small forest at the start.
Tree_Deciduous->Place(10, Rectangle(640, 200, 140, 160));
Tree_Coniferous2->Place(3, Rectangle(640, 200, 140, 160));
Tree_Coniferous3->Place(5, Rectangle(640, 200, 140, 160));
// Elevator with a shaft down and the case already down.
var elevator = CreateObjectAbove(Elevator, 836, 264);
elevator->SetDir(DIR_Right);
elevator->CreateShaft(440);
var case = elevator->GetCase();
case->SetPosition(case->GetX(), 640);
elevator->MakeInvincible();
case->MakeInvincible();
// Create a column at map end.
CreateObjectAbove(Column, 960, 264);
return;
}
private func InitVegetation()
{
Grass->Place(85);
PlaceObjects(Loam, 10 + Random(5), "Earth");
PlaceObjects(Rock, 25 + Random(5), "Earth");
Branch->Place(28);
Mushroom->Place(24);
Flower->Place(10);
Fern->Place(10);
Seaweed->Place(8);
Coral->Place(4);
return;
}
private func InitAnimals()
{
// Some butterflies as atmosphere.
Butterfly->Place(25);
// Fish in the body of water.
Fish->Place(12);
return;
}
// Initializes the AI: which is all defined in System.ocg
private func InitAI()
{
// An old man without home npc to point to robbers.
var npc_homeless = CreateObjectAbove(Clonk, 220, 384);
npc_homeless->SetName("Dirk");
npc_homeless->SetObjectLayer(npc_homeless);
npc_homeless->SetSkin(3);
npc_homeless->SetDir(DIR_Left);
npc_homeless->SetDialogue("Homeless");
npc_homeless->SetAlternativeSkin("Beggar");
// Village head.
var npc_head = CreateObjectAbove(Clonk, 20, 384);
npc_head->SetName("Archibald");
npc_head->SetObjectLayer(npc_head);
npc_head->SetDir(DIR_Left);
npc_head->SetDialogue("VillageHead");
npc_head->SetAlternativeSkin("Sage");
// Robbers.
var robber1 = CreateObjectAbove(Clonk, 490, 524);
robber1->CreateContents(Bow)->CreateContents(Arrow);
robber1->CreateContents(Arrow);
robber1->CreateContents(Shield);
AI->AddAI(robber1);
AI->SetHome(robber1, 490, 514, DIR_Left);
AI->SetGuardRange(robber1, 300, 400, 400, 200);
AI->SetAllyAlertRange(robber1, 60);
robber1->SetDir(DIR_Left);
robber1->SetAlternativeSkin("Youngster");
robber1.first_robber = true;
var robber2 = CreateObjectAbove(Clonk, 470, 644);
robber2->CreateContents(Sword);
robber2->CreateContents(Shield);
robber2->CreateContents(Bread);
AI->AddAI(robber2);
AI->SetHome(robber2, 470, 634, DIR_Right);
AI->SetGuardRange(robber2, 300, 560, 400, 200);
AI->SetAllyAlertRange(robber2, 60);
robber2->SetDir(DIR_Right);
robber2.second_robber = true;
var robber3 = CreateObjectAbove(Clonk, 800, 706);
robber3->CreateContents(Javelin, 3);
robber3->CreateContents(Shield);
AI->AddAI(robber3);
AI->SetHome(robber3, 800, 696, DIR_Left);
AI->SetGuardRange(robber3, 600, 600, 400, 200);
AI->SetAllyAlertRange(robber3, 60);
robber3->SetDir(DIR_Left);
robber3.last_robber = true;
var robber4 = CreateObjectAbove(Clonk, 830, 706);
robber4->CreateContents(Sword);
robber4->CreateContents(Shield);
AI->AddAI(robber4);
AI->SetHome(robber4, 830, 696, DIR_Left);
AI->SetGuardRange(robber4, 600, 600, 400, 200);
AI->SetAllyAlertRange(robber4, 60);
robber4->SetDir(DIR_Left);
robber4.last_robber = true;
return;
}
/*-- Player Handling --*/
protected func InitializePlayer(int plr)
{
// Position player's clonk.
var clonk = GetCrew(plr);
clonk->SetPosition(10, 374);
clonk->CreateContents(Shovel);
var effect = AddEffect("ClonkRestore", clonk, 100, 10);
effect.to_x = 300;
effect.to_y = 374;
// Add an effect to the clonk to track the goal.
var goal_effect = AddEffect("TrackGoal", nil, 100, 2);
goal_effect.plr = plr;
// Standard player zoom for tutorials.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 400, nil, PLRZOOM_Direct | PLRZOOM_Set);
// Start the intro sequence.
StartSequence("Intro", 0, plr);
// Create tutorial guide and control effect.
guide = CreateObject(TutorialGuide, 0, 0, plr);
guide->HideGuide();
var effect = AddEffect("TutorialTalkedToVillageHead", nil, 100, 5);
effect.plr = plr;
return;
}
/*-- Guide Messages --*/
public func OnIntroSequenceFinished()
{
guide->AddGuideMessage("$MsgTutorialTalkToHead$");
guide->ShowGuide();
guide->ShowGuideMessage();
return;
}
public func OnHasTalkedToVillageHead()
{
RemoveEffect("TutorialTalkedToVillageHead");
return;
}
global func FxTutorialTalkedToVillageHeadTimer()
{
return FX_OK;
}
global func FxTutorialTalkedToVillageHeadStop(object target, proplist effect, int reason, bool temp)
{
if (temp)
return FX_OK;
var use = GetPlayerControlAssignment(effect.plr, CON_Use, true);
guide->AddGuideMessage(Format("$MsgTutorialNotHelpful$", use));
guide->ShowGuideMessage();
var new_effect = AddEffect("TutorialDestroyedStrawMen", nil, 100, 5);
new_effect.plr = effect.plr;
return FX_OK;
}
global func FxTutorialDestroyedStrawMenTimer(object target, proplist effect)
{
if (!FindObject(Find_ID(StrawMan)))
{
// Remove door blocking cave entrance.
RemoveAll(Find_ID(StoneDoor));
guide->AddGuideMessage("$MsgTutorialFirstEnemy$");
guide->ShowGuideMessage();
var new_effect = AddEffect("TutorialKilledFirstRobber", nil, 100, 5);
new_effect.plr = effect.plr;
return FX_Execute_Kill;
}
return FX_OK;
}
public func OnClonkRestore()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Property("first_robber")))
{
guide->AddGuideMessage("$MsgTutorialOnRespawn$");
guide->ShowGuideMessage();
}
return;
}
global func FxTutorialKilledFirstRobberTimer(object target, proplist effect)
{
if (!FindObject(Find_OCF(OCF_CrewMember), Find_Property("first_robber")))
{
// Show previous guide message about alternative way to kill the first robber.
if (guide->GetMessageCount() <= 3)
guide->AddGuideMessage("$MsgTutorialOnRespawn$");
guide->AddGuideMessage("$MsgTutorialKilledFirst$");
guide->ShowGuideMessage();
var new_effect = AddEffect("TutorialKilledSecondRobber", nil, 100, 5);
new_effect.plr = effect.plr;
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxTutorialKilledSecondRobberTimer(object target, proplist effect)
{
if (!FindObject(Find_OCF(OCF_CrewMember), Find_Property("second_robber")))
{
var use = GetPlayerControlAssignment(effect.plr, CON_Use, true);
guide->AddGuideMessage(Format("$MsgTutorialKilledSecond$", use));
guide->ShowGuideMessage();
var new_effect = AddEffect("TutorialKilledLastRobbers", nil, 100, 5);
new_effect.plr = effect.plr;
return FX_Execute_Kill;
}
return FX_OK;
}
global func FxTutorialKilledLastRobbersTimer(object target, proplist effect)
{
if (!FindObject(Find_OCF(OCF_CrewMember), Find_Property("last_robber")))
{
// Start the intro sequence.
guide->HideGuide();
StartSequence("Outro", 0, effect.plr);
return FX_Execute_Kill;
}
return FX_OK;
}
public func ShowLastGuideMessage()
{
guide->AddGuideMessage("$MsgTutorialCompleted$");
guide->ShowGuideMessage();
guide->ShowGuide();
return;
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show the village head.
if (index == 0)
{
TutArrowShowTarget(Dialogue->FindByName("VillageHead")->GetDialogueTarget());
}
// Show the strawmen.
if (index == 1)
{
for (var strawman in FindObjects(Find_ID(StrawMan)))
TutArrowShowTarget(strawman);
}
// Show the first robber.
if (index == 2)
TutArrowShowTarget(FindObject(Find_OCF(OCF_CrewMember), Find_Property("first_robber")));
// Show path to dig and chest.
if (index == 3)
{
TutArrowShowTarget(FindObject(Find_ID(Chest), Sort_Distance(540, 480)));
TutArrowShowPos(490, 420, 135);
}
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 = CreateObject(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;
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObject(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
Rule_BaseRespawn->TransferInventory(target, clonk);
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkRestore");
GameCall("OnClonkRestore", clonk);
}
return FX_OK;
}

View File

@ -0,0 +1,18 @@
# Goal Description
MsgGoalName=Reach the village
MsgGoalDescription=Traverse the cave and reach the village on the other side together with the village head.
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
MsgNextTutorialDesc=Die nächste Lernrunde starten.
MsgRepeatRound=&Lernrunde wiederholen
MsgRepeatRoundDesc=Diese Lernrunde wiederholen.
# Tutorial messages
MsgTutorialTalkToHead=You need to enter the cave and take down the robbers. Talk to the village head first, hopefully he has some idea on how to do this.
MsgTutorialNotHelpful=That was not very helpful, but at least you have a weapon. You can test the axe on the straw men in the grain field, press [%s] to use axe and destroy the straw men.
MsgTutorialFirstEnemy=The first robber in the cave has a bow and shoots arrows at you, maybe there is another way to approach him instead of engaging him head-on. Kill your enemy, if you die in the process you will respawn, so you can try multiple times.
MsgTutorialOnRespawn=Okay, that did not work, maybe you can reach that chest over there by digging through the earth. Then take whatever is in the chest and use that to kill the robber. Some weapons can be thrown, just aim your mouse cursor at where you want to throw that weapon.
MsgTutorialKilledFirst=Well done, that guy is eliminated. You can take its weapons and proceed to explore the cave and find more robbers. The bow can be used to shoot enemies over larger distance, aim with the mouse cursor in the direction you want to shoot.
MsgTutorialKilledSecond=And another one down, you are getting the hang of it! He dropped some bread, pick it up and press [%s] to eat it. Then continue along the cave's path.
MsgTutorialCompleted=Well done! Now you are a trained fighter. There are many more weapons in this game which you can try out in later tutorials or in other rounds.

View File

@ -0,0 +1,18 @@
# Goal Description
MsgGoalName=Reach the village
MsgGoalDescription=Traverse the cave and reach the village on the other side together with the village head.
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutorialTalkToHead=You need to enter the cave and take down the robbers. Talk to the village head first, hopefully he has some idea on how to do this.
MsgTutorialNotHelpful=That was not very helpful, but at least you have a weapon. You can test the axe on the straw men in the grain field, press [%s] to use axe and destroy the straw men.
MsgTutorialFirstEnemy=The first robber in the cave has a bow and shoots arrows at you, maybe there is another way to approach him instead of engaging him head-on. Kill your enemy, if you die in the process you will respawn, so you can try multiple times.
MsgTutorialOnRespawn=Okay, that did not work, maybe you can reach that chest over there by digging through the earth. Then take whatever is in the chest and use that to kill the robber. Some weapons can be thrown, just aim your mouse cursor at where you want to throw that weapon.
MsgTutorialKilledFirst=Well done, that guy is eliminated. You can take its weapons and proceed to explore the cave and find more robbers. The bow can be used to shoot enemies over larger distance, aim with the mouse cursor in the direction you want to shoot.
MsgTutorialKilledSecond=And another one down, you are getting the hang of it! He dropped some bread, pick it up and press [%s] to eat it. Then continue along the cave's path.
MsgTutorialCompleted=Well done! Now you are a trained fighter. There are many more weapons in this game which you can try out in later tutorials or in other rounds.

View File

@ -0,0 +1,55 @@
// Dialogue for homeless guy due to the robbers.
#appendto Dialogue
public func Dlg_Homeless_Init(object clonk)
{
return true;
}
public func Dlg_Homeless_1(object clonk)
{
MessageBox("$DlgHomelessFood$", clonk, dlg_target);
return true;
}
public func Dlg_Homeless_2(object clonk)
{
var food = FindObject(Find_Container(clonk), Find_Func("NutritionalValue"));
if (food)
{
MessageBox(Format("$DlgHomelessYes$", food.Name), clonk, clonk);
food->Enter(dlg_target);
SetDialogueProgress(4);
}
else
{
MessageBox("$DlgHomelessNo$", clonk, clonk);
}
return true;
}
public func Dlg_Homeless_3(object clonk)
{
MessageBox("$DlgHomelessShame$", clonk, dlg_target);
StopDialogue();
SetDialogueProgress(1);
return true;
}
public func Dlg_Homeless_4(object clonk)
{
var food = FindObject(Find_Container(dlg_target), Find_Func("NutritionalValue"));
if (food)
dlg_target->Eat(food);
clonk->CreateContents(Club);
MessageBox("$DlgHomelessReward$", clonk, dlg_target);
StopDialogue();
SetDialogueProgress(1);
return true;
}
public func Dlg_Homeless_Closed(object clonk)
{
return true;
}

View File

@ -0,0 +1,42 @@
// The village head.
#appendto Dialogue
public func Dlg_VillageHead_Init(object clonk)
{
return true;
}
public func Dlg_VillageHead_1(object clonk)
{
MessageBox("$DlgVillageHeadHowToAttack$", clonk, clonk);
return true;
}
public func Dlg_VillageHead_2(object clonk)
{
MessageBox("$DlgVillageHeadNoIdea$", clonk, dlg_target);
if (!FindObject(Find_ID(Axe), Find_Container(clonk)))
clonk->CreateContents(Axe);
return true;
}
public func Dlg_VillageHead_3(object clonk)
{
MessageBox("$DlgVillageHeadThanks$", clonk, clonk);
return true;
}
public func Dlg_VillageHead_4(object clonk)
{
MessageBox("$DlgVillageHeadGoodLuck$", clonk, dlg_target);
StopDialogue();
SetDialogueProgress(1);
return true;
}
public func Dlg_VillageHead_Closed(object clonk)
{
GameCall("OnHasTalkedToVillageHead", clonk);
return true;
}

View File

@ -0,0 +1,6 @@
#appendto AI
func BindInventory(object clonk)
{
return true;
}

View File

@ -0,0 +1,106 @@
// Intro sequence for this tutorial.
#appendto Sequence
public func Intro_Init(int for_plr)
{
this.plr = for_plr;
this.head = Dialogue->FindByName("VillageHead")->GetDialogueTarget();
this.homeless = Dialogue->FindByName("Homeless")->GetDialogueTarget();
this.plr_clonk = GetCrew(for_plr);
this.head->PushActionSpeed("Walk", 38);
this.plr_clonk->PushActionSpeed("Walk", 38);
if (this.head.ActMap == this.head.Prototype.ActMap)
this.head.ActMap = new this.head.ActMap {};
if (this.head.ActMap.Walk == this.head.Prototype.ActMap.Walk)
this.head.ActMap.Walk = new this.head.ActMap.Walk {};
this.head.ActMap.Walk.Speed = 38;
if (this.plr_clonk.ActMap == this.plr_clonk.Prototype.ActMap)
this.plr_clonk.ActMap = new this.plr_clonk.ActMap {};
if (this.plr_clonk.ActMap.Walk == this.plr_clonk.Prototype.ActMap.Walk)
this.plr_clonk.ActMap.Walk = new this.plr_clonk.ActMap.Walk {};
this.plr_clonk.ActMap.Walk.Speed = 38;
return true;
}
public func Intro_JoinPlayer(int plr)
{
SetPlayerZoomByViewRange(plr, 240, nil, PLRZOOM_Direct | PLRZOOM_Set);
return;
}
public func Intro_Start()
{
this.head->SetCommand("MoveTo", nil, this.head->GetX() + 180, this.head->GetY());
this.plr_clonk->SetCommand("MoveTo", nil, this.plr_clonk->GetX() + 180, this.plr_clonk->GetY());
return ScheduleNext(4);
}
public func Intro_1()
{
MessageBox("$MsgVillageHeadAnnoyed$", this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(160);
}
public func Intro_2()
{
MessageBox("$MsgClonkHowToStrike$", this.plr_clonk, this.plr_clonk, this.plr, true);
return ScheduleNext(108);
}
public func Intro_3()
{
MessageBox("$MsgVillageHeadOrganize$", this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(172);
}
public func Intro_4()
{
MessageBox("$MsgClonkPoorGuy$", this.plr_clonk, this.plr_clonk, this.plr, true);
return ScheduleNext(140);
}
public func Intro_5()
{
MessageBox("$MsgHomelessRobbers$", this.plr_clonk, this.homeless, this.plr, true);
return ScheduleNext(140);
}
public func Intro_6()
{
MessageBox("$MsgClonkWhere$", this.plr_clonk, this.plr_clonk, this.plr, true);
return ScheduleNext(140);
}
public func Intro_7()
{
MessageBox("$MsgHomelessLocation$", this.plr_clonk, this.homeless, this.plr, true);
return ScheduleNext(140);
}
public func Intro_8()
{
MessageBox(Format("$MsgVillageHeadTeachThem$", this.plr_clonk->GetName()), this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(140);
}
public func Intro_9()
{
MessageBox("$MsgHomelessHappy$", this.plr_clonk, this.homeless, this.plr, true);
return ScheduleNext(80);
}
public func Intro_10()
{
return Stop();
}
public func Intro_Stop()
{
GameCall("OnIntroSequenceFinished", this.plr);
this.plr_clonk.ActMap.Walk.Speed = Clonk.ActMap.Walk.Speed;
this.head.ActMap.Walk.Speed = Clonk.ActMap.Walk.Speed;
SetPlayerZoomByViewRange(this.for_plr, 400, nil, PLRZOOM_Direct | PLRZOOM_Set);
return true;
}

View File

@ -0,0 +1,101 @@
// Outro sequence for this tutorial.
#appendto Sequence
public func Outro_Init(int for_plr)
{
this.plr = for_plr;
this.head = Dialogue->FindByName("VillageHead")->GetDialogueTarget();
this.plr_clonk = GetCrew(for_plr);
return true;
}
public func Outro_JoinPlayer(int plr)
{
SetPlayerZoomByViewRange(plr, 240, nil, PLRZOOM_Direct | PLRZOOM_Set);
return;
}
public func Outro_Start()
{
this.plr_clonk->SetCommand("MoveTo", nil, 820, 702);
return ScheduleNext(4);
}
public func Outro_1()
{
MessageBox(Format("$MsgClonkSafe$", this.head->GetName()), this.plr_clonk, this.plr_clonk, this.plr, true);
return ScheduleNext(160);
}
public func Outro_2()
{
this.head->SetPosition(392, 726);
this.head->SetCommand("MoveTo", nil, 816, 702);
MessageBox("$MsgVillageHeadComing$", this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(10);
}
public func Outro_3()
{
if (!Inside(this.head->GetX(), 812, 816))
return ScheduleSame(10);
var case = FindObject(Find_ID(ElevatorCase));
case->MoveTo(720);
return ScheduleNext(10);
}
public func Outro_4()
{
var case = FindObject(Find_ID(ElevatorCase));
if (case->GetY() <= 700)
return ScheduleSame(10);
this.head->SetCommand("Grab", case);
case->MoveTo(240);
MessageBox("$MsgVillageHeadTakeElevator$", this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(140);
}
public func Outro_5()
{
var case = FindObject(Find_ID(ElevatorCase));
if (case->GetY() >= 254)
return ScheduleSame(10);
this.head->SetCommand("UnGrab");
this.head.ActMap.Walk.Speed = 38;
this.head->SetCommand("MoveTo", nil, this.head->GetX() + 100, this.head->GetY());
MessageBox("$MsgVillageHeadPassedCave$", this.plr_clonk, this.head, this.plr, true);
return ScheduleNext(30);
}
public func Outro_6()
{
if (this.plr_clonk.ActMap == this.plr_clonk.Prototype.ActMap)
this.plr_clonk.ActMap = new this.plr_clonk.ActMap {};
if (this.plr_clonk.ActMap.Walk == this.plr_clonk.Prototype.ActMap.Walk)
this.plr_clonk.ActMap.Walk = new this.plr_clonk.ActMap.Walk {};
this.plr_clonk.ActMap.Walk.Speed = 38;
this.plr_clonk->SetCommand("MoveTo", nil, this.plr_clonk->GetX() + 90, this.plr_clonk->GetY());
return ScheduleNext(180);
}
public func Outro_7()
{
// Show last guide message and then stop the sequence and fulfill the goal.
GameCall("ShowLastGuideMessage");
return ScheduleNext(108);
}
public func Outro_8()
{
return Stop();
}
public func Outro_Stop()
{
// Fulfill the tutorial goal.
var goal = FindObject(Find_ID(Goal_Tutorial));
if (goal)
goal->Fulfill();
return true;
}

View File

@ -0,0 +1,29 @@
# Dialogue: homeless
DlgHomelessFood=Hey, you have got some food for a poor man?
DlgHomelessNo=No, have nothing on me.
DlgHomelessShame=That's a shame.
DlgHomelessYes=Yes, here is some %s.
DlgHomelessReward=Ah, thanks. I have this old club you can have, it might help against those robbers.
# Dialogue: village head
DlgVillageHeadHowToAttack=How can I stand a chance against these evil robbers?
DlgVillageHeadNoIdea=I have no idea about combat. I can give you this axe, but it is not really a weapon.
DlgVillageHeadThanks=Well thanks, I'll give it a try then.
DlgVillageHeadGoodLuck=Good luck, let me know when it is safe to enter the cave.
# Sequence: intro
MsgVillageHeadAnnoyed=I am really annoyed by the evil faction, we have to strike back.
MsgClonkHowToStrike=How can we strike back? They are many and armed to the teeth.
MsgVillageHeadOrganize=We have to organize ourselves with another village, that is where we are heading.
MsgClonkPoorGuy=Look at this poor guy, his cabin burned down. What has happened?
MsgHomelessRobbers=Some robbers stole my goods and burned down my cabin.
MsgClonkWhere=That is terrible. Do you know where they are?
MsgHomelessLocation=Well they went into the cave ahead, where they also came from.
MsgVillageHeadTeachThem=Well, %s here will teach them a lesson.
MsgHomelessHappy=That would make me very happy.
# Sequence: outro
MsgClonkSafe=%s it is safe down here!
MsgVillageHeadComing=Okay, I am coming down.
MsgVillageHeadTakeElevator=Let's take this elevator up to the surface.
MsgVillageHeadPassedCave=Thanks to you we manage to pass this cave and we can safely make it to the other village!

View File

@ -0,0 +1,29 @@
# Dialogue: homeless
DlgHomelessFood=Hey, you have got some food for a poor man?
DlgHomelessNo=No, have nothing on me.
DlgHomelessShame=That's a shame.
DlgHomelessYes=Yes, here is some %s.
DlgHomelessReward=Ah, thanks. I have this old club you can have, it might help against those robbers.
# Dialogue: village head
DlgVillageHeadHowToAttack=How can I stand a chance against these evil robbers?
DlgVillageHeadNoIdea=I have no idea about combat. I can give you this axe, but it is not really a weapon.
DlgVillageHeadThanks=Well thanks, I'll give it a try then.
DlgVillageHeadGoodLuck=Good luck, let me know when it is safe to enter the cave.
# Sequence: intro
MsgVillageHeadAnnoyed=I am really annoyed by the evil faction, we have to strike back.
MsgClonkHowToStrike=How can we strike back? They are many and armed to the teeth.
MsgVillageHeadOrganize=We have to organize ourselves with another village, that is where we are heading.
MsgClonkPoorGuy=Look at this poor guy, his cabin burned down. What has happened?
MsgHomelessRobbers=Some robbers stole my goods and burned down my cabin.
MsgClonkWhere=That is terrible. Do you know where they are?
MsgHomelessLocation=Well they went into the cave ahead, where they also came from.
MsgVillageHeadTeachThem=Well, %s here will teach them a lesson.
MsgHomelessHappy=That would make me very happy.
# Sequence: outro
MsgClonkSafe=%s it is safe down here!
MsgVillageHeadComing=Okay, I am coming down.
MsgVillageHeadTakeElevator=Let's take this elevator up to the surface.
MsgVillageHeadPassedCave=Thanks to you we manage to pass this cave and we can safely make it to the other village!

View File

@ -0,0 +1,2 @@
DE:Räuberhöhle
US:Robber's Cave