remove old tutorials

shapetextures
Maikel de Vries 2015-09-13 12:06:42 +02:00
parent 89838bf63f
commit bb703d46c7
130 changed files with 0 additions and 3836 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +0,0 @@
[Head]
Index=1

View File

@ -1,8 +0,0 @@
[ParameterDef]
ID=Done
Achievement=Done
[Options]
[Option]
Description=$Completed$
Value=1

View File

@ -1 +0,0 @@
Completed=Abgeschlossen

View File

@ -1 +0,0 @@
Completed=Completed

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,2 +0,0 @@
DE:Lernrunden
US:Tutorials

View File

@ -1,7 +0,0 @@
[DefCore]
id=Goal_ReachFlag
Version=6,0
Category=C4D_StaticBack|C4D_Goal
Width=1
Height=1
Picture=0,0,128,128

View File

@ -1,7 +0,0 @@
[DefCore]
id=TutorialFlag
Version=6,0
Category=C4D_StaticBack
Width=30
Height=40
Offset=-15,-20

View File

@ -1,24 +0,0 @@
material Flag
{
receive_shadows on
technique
{
pass
{
scene_blend alpha_blend
cull_hardware none
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 0.640000 0.640000 0.640000 1.000000
specular 0.000000 0.000000 0.000000 1.000000 12.500000
emissive 0.000000 0.000000 0.000000 1.000000
texture_unit
{
texture flag.png
tex_address_mode wrap
filtering trilinear
}
}
}
}

View File

@ -1,18 +0,0 @@
/*--
Flag
--*/
protected func Initialize()
{
PlayAnimation("Wave", 1, Anim_Linear(0, 0, GetAnimationLength("Wave"), 78, ANIM_Loop), Anim_Const(1000));
}
/*-- Proplist --*/
local Name = "$Name$";
func Definition(def)
{
SetProperty("MeshTransformation", Trans_Rotate(60,0,1,0),def);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,48 +0,0 @@
/*--
Script goal
Author: Maikel
The goal is fulfilled if all crew members have reached the flag.
--*/
#include Library_Goal
local flag; // Pointer to the flag
public func IsFulfilled()
{
// No flag, goal fulfilled.
if (!flag)
return true;
// Total crew count.
var crew_count = ObjectCount(Find_OCF(OCF_CrewMember));
// Crew count near the flag.
var flag_count = ObjectCount(Find_OCF(OCF_CrewMember), Find_Distance(50, flag->GetX() - GetX(), flag->GetY() - GetY()));
// If both counts are equal -> fulfilled.
if (crew_count != 0 && crew_count == flag_count)
return true;
// Otherwise unfulfilled.
return false;
}
public func GetDescription(int plr)
{
return this.Description;
}
public func CreateGoalFlag(int x, int y)
{
flag = CreateObjectAbove(TutorialFlag, 0, 0, NO_OWNER);
flag->SetPosition(x, y);
}
protected func Activate(int plr)
{
return MessageWindow(GetProperty("Description", this), plr);
}
/*-- Proplist --*/
local Name = "$Name$";
local Description = "$Description$";

View File

@ -1,2 +0,0 @@
Name=Erreiche die Flagge
Description=Wenn all deine Clonks die Flagge erreicht haben, hast du diese Runde geschafft.

View File

@ -1,3 +0,0 @@
Name=Reach the flag
Description=The scenario is completed if all crew members have reached the flag.

View File

@ -1,7 +0,0 @@
[DefCore]
id=TutorialGuide
Version=6,0
Category=C4D_StaticBack | C4D_IgnoreFoW | C4D_Foreground | C4D_Parallax | C4D_MouseSelect
Width=64
Height=64
Offset=-32,-32

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,185 +0,0 @@
/** Tutorial Guide
* The tutorial guide can be clicked by the player, it supplies the player with information and hints.
* The following callbacks are made to the scenario script:
* - \c OnGuideMessageShown(int plr, int index) when a message is shown
* - \c OnGuideMessageRemoved(int plr, int index) when a message is removed, all events
* @author Maikel
*/
local messages; // A container to hold all messages.
local index; // Progress in reading messages.
protected func Initialize()
{
// parallaxity
this["Parallaxity"] = [0, 0];
// visibility
this["Visibility"] = VIS_Owner;
messages = [];
index = 0;
return;
}
/* Creates the tutorial guide in the upper part of the HUD, returns the guide as a pointer.
* @param plr The player for which the guide should be created.
* @return the guide object.
*/
global func CreateTutorialGuide(int plr)
{
var guide = CreateObjectAbove(TutorialGuide, 0, 0 , plr);
guide->SetPosition(- 128 - 32 - TutorialGuide->GetDefWidth() / 2, 8 + TutorialGuide->GetDefHeight() / 2);
return guide;
}
// Get-Setters for the message index.
public func GetGuideIndex() { return index; }
public func SetGuideIndex(int to_index)
{
index = BoundBy(to_index, 0, GetLength(messages));
return;
}
/* Adds a message to the guide. The internal index is set to this message meaning that this message will
* be shown if the player clicks the guide.
* @param msg Message that should be added to the message stack.
*/
public func AddGuideMessage(string msg)
{
// Automatically set index to current.
index = GetLength(messages);
// Add message to list.
messages[index] = msg;
// Make visible that there is a new message.
AddEffect("NotifyPlayer", this, 100, 0, this);
return;
}
/* Shows a guide message to the player, also resets the internal index to that point.
* @param show_index The message corresponding to this index will be shown.
*/
public func ShowGuideMessage(int show_index)
{
index = Max(0, show_index);
if (!messages[index])
return;
if (GetEffect("MessageShown", this))
RemoveEffect("MessageShown", this);
if (GetEffect("NotifyPlayer", this))
RemoveEffect("NotifyPlayer", this);
GuideMessage(index);
if (GetLength(messages) > index+1)
index++;
return;
}
// Removes the current guide message.
public func ClearGuideMessage()
{
if (GetEffect("MessageShown", this))
RemoveEffect("MessageShown", this);
CustomMessage("", nil, GetOwner(), nil, nil, nil, nil, nil, MSG_HCenter);
return;
}
// Callback: the player has clicked on the guide.
public func MouseSelection(int plr)
{
if (plr != GetOwner())
return;
if (GetEffect("NotifyPlayer", this))
RemoveEffect("NotifyPlayer", this);
// Clear guide message if the latest is already shown.
var effect = GetEffect("MessageShown", this, nil, 0);
if (effect)
{
if (effect.show_index == index)
return ClearGuideMessage();
else
RemoveEffect("MessageShown", this);
}
// Show guide message if there is a new one, and increase index if possible.
if (!messages[index])
return;
GuideMessage(index);
if (GetLength(messages) > index+1)
index++;
return;
}
// Shows a message at the right place in message box.
private func GuideMessage(int show_index)
{
if (GetOwner() == NO_OWNER)
return false;
var message = messages[show_index];
if (!message)
return false;
// Message as regular one, don't stop the player.
CustomMessage(message, nil, GetOwner(), 0, 64 + TutorialGuide->GetDefHeight(), 0xffffff, GUI_MenuDeco, this, MSG_HCenter);
var effect = AddEffect("MessageShown", this, 100, 2 * GetLength(message), this);
effect.show_index = show_index;
// Messages with @ in front are shown infinetely long.
if(GetChar(message, 0) == GetChar("@", 0))
effect.var1 = true;
return true;
}
// Effect exists as long as the message is shown.
// Message index is stored in EffectVar 0.
// For messages with @ in front, EffectVar 1 is true.
protected func FxMessageShownStart(object target, effect, int temporary)
{
if (temporary == 0)
GameCall("OnGuideMessageShown", target->GetOwner(), index);
return 1;
}
protected func FxMessageShownTimer(object target, effect, int time)
{
// Delete effect if time has passed, i.e. message has disappeared.
// But only if it is not a message of infinite length, with @ in front.
if (time && !effect.var1)
return -1;
return 1;
}
protected func FxMessageShownStop(object target, effect, int reason, bool temporary)
{
if (!temporary)
GameCall("OnGuideMessageRemoved", target->GetOwner(), index);
return 1;
}
// Effect to display the player notification for some time.
protected func FxNotifyPlayerStart(object target, effect, int temporary)
{
// Display notifier.
SetGraphics("SpeakBubble", GetID(), 1, GFXOV_MODE_Base);
SetObjDrawTransform(500, 0, -24000, 0, 500, -2000, 1);
return 1;
}
protected func FxNotifyPlayerTimer(object target, effect, int time)
{
// Delete effect if time has passed.
if (time)
return -1;
return 1;
}
protected func FxNotifyPlayerStop(object target, effect, int reason, bool temporary)
{
// Remove notifier.
SetGraphics(nil, nil, 1);
return 1;
}
protected func FxNotifyPlayerEffect(string new_name)
{
if (new_name == "NotifyPlayer")
return -1;
}
local Name = "$Name$";

View File

@ -1 +0,0 @@
Name=Lernrundenführer

View File

@ -1 +0,0 @@
Name=Tutorial guide

View File

@ -1,11 +0,0 @@
[DefCore]
id=TutorialArrow
Version=6,0
Category=C4D_StaticBack
Width=32
Height=32
Offset=-16,-16
Vertices=1
VertexX=0
VertexY=-8
Rotate=1

View File

@ -1,14 +0,0 @@
material TutArrow
{
receive_shadows on
technique
{
pass
{
ambient 1.000000 0.000000 0.000000 1.000000
diffuse 1.000000 0.000000 0.000000 1.000000
specular 0.000000 0.000000 0.000000 1.000000 12.500000
emissive 0.000000 0.000000 0.000000 1.000000
}
}
}

View File

@ -1,164 +0,0 @@
/** Tutorial Arrow
* Arrow to show important stuff to the player, can be created by using one of the global functions.
* @author Sven2, Maikel
*/
// Remove arrow if it was showing a target object which got removed.
protected func AttachTargetLost() { RemoveObject(); }
// Remove arrow if target object entered a container.
protected func Entrance() { RemoveObject(); }
/*-- Arrow Creation --*/
/** Removes all tutorial arrows.
*/
global func TutArrowClear()
{
for (arrow in FindObjects(Find_ID(TutorialArrow)))
arrow->RemoveObject();
return;
}
/** Creates an arrow to indicate a position.
* @param x X-coordinate of the position.
* @param y Y-coordinate of the position.
* @param angle angle at which the arrow should be drawn, standard \c 135 degrees.
* @param dist distance of the arrow to the position, standard 16 pixels.
* @return the arrow created.
*/
global func TutArrowShowPos(int x, int y, int angle, int dist)
{
if (angle == nil)
angle = 135;
if (dist == nil)
dist = 16;
var arrow = CreateObjectAbove(TutorialArrow, x, y, NO_OWNER);
if (!arrow)
return;
// Display bouncing arrow, corrected for arrow size.
dist += 8;
x -= Sin(angle, dist);
y += Cos(angle, dist);
arrow->SetAction("Show");
arrow->SetPosition(x, y);
arrow->SetR(angle);
return arrow;
}
/** Creates an arrow to indicate the target.
* @param target target object which should be indicated by the arrow.
* @param angle angle at which the arrow should be drawn, standard \c 135 degrees.
* @param dist distance of the arrow to the target object, standard 16 pixels.
* @return the arrow created.
*/
global func TutArrowShowTarget(object target, int angle, int dist)
{
var container = target->Contained(), index;
if (container &&
container.Prototype == Clonk &&
(index = GetIndexOf(container.inventory, target)) != -1) // Is the object inventory in a clonk?
{
var itemslot = container.HUDcontroller.inventory[index];
return TutArrowShowGUIPos(itemslot->GetX(), itemslot->GetY(), -90, itemslot->GetDefHeight() / 2);
}
if (angle == nil)
angle = 135;
if (dist == nil)
dist = 16;
var arrow = CreateObjectAbove(TutorialArrow, target->GetX(), target->GetY(), NO_OWNER);
if (!arrow)
return;
// Display spinning arrow, corrected for arrow size.
dist += 8;
arrow->SetAction("Attach", target);
arrow->SetR(angle);
arrow->SetVertex(0, VTX_Y, -dist, VTX_SetPermanentUpd);
return arrow;
}
/** Creates an arrow to indicate a GUI position.
* @param x X-coordinate of the GUI position.
* @param y Y-coordinate of the GUI position.
* @param angle angle at which the arrow should be drawn, standard \c 135 degrees.
* @param dist distance of the arrow to the position, standard 16 pixels.
* @return the arrow created.
*/
global func TutArrowShowGUIPos(int x, int y, int angle, int dist)
{
if (angle == nil)
angle = 135;
if (dist == nil)
dist = 16;
var arrow = CreateObjectAbove(TutorialArrow, x, y, NO_OWNER);
if (!arrow)
return;
// Change arrow category to C4D_Gui.
arrow->SetCategory(C4D_IgnoreFoW | C4D_Foreground | C4D_Parallax);
// Display bouncing arrow, corrected for arrow size.
dist += 8;
x -= Sin(angle, dist);
y += Cos(angle, dist);
arrow->SetAction("Show");
arrow->SetPosition(x, y);
arrow->SetR(angle);
return arrow;
}
/** Creates an arrow to indicate the target.
* @param target GUI object which should be indicated by the arrow.
* @param angle angle at which the arrow should be drawn, standard \c 135 degrees.
* @param dist distance of the arrow to the target object, automatically corrects for GUI object's size.
* @return the arrow created.
*/
global func TutArrowShowGUITarget(object target, int angle, int dist)
{
if (angle == nil)
angle = 135;
if (dist == nil)
dist = 16;
var arrow = CreateObjectAbove(TutorialArrow, target->GetX(), target->GetY(), NO_OWNER);
if (!arrow)
return;
// Change arrow category to C4D_Gui.
arrow->SetCategory(C4D_IgnoreFoW | C4D_Foreground | C4D_Parallax);
// Display spinning arrow, corrected for GUI and arrow size.
dist += 8 + target->GetID()->GetDefHeight() / 2;
arrow->SetAction("Attach", target);
arrow->SetR(angle);
arrow->SetVertex(0, VTX_Y, -dist, VTX_SetPermanentUpd);
return arrow;
}
/*-- Proplist --*/
local Name = "$Name$";
local MeshTransformation = [1400, 0, 0, 0, 0, 1400, 0, 0, 0, 0, 1400, 0];
local Parallaxity = [0, 0];
local ActMap = {
Attach = {
Prototype = Action,
Name = "Attach",
Procedure = DFA_ATTACH,
Length = 20,
Delay = 2,
X = 0,
Y = 0,
Wdt = 32,
Hgt = 32,
NextAction = "Attach",
Animation = "Spin",
},
Show = {
Prototype = Action,
Name = "Show",
Procedure = DFA_FLOAT,
Length = 20,
Delay = 2,
X = 0,
Y = 0,
Wdt = 32,
Hgt = 32,
NextAction = "Show",
Animation = "Bounce",
},
};

View File

@ -1 +0,0 @@
Name=Hinweispfeil

View File

@ -1 +0,0 @@
Name=Notification arrow

View File

@ -1,5 +0,0 @@
{\rtf1\ansi\ansicpg1252\deff0\deflang1043{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\lang1033\b\f0\fs20 Clonk Control\par
\par
\b0\fs16 This tutorial will cover the most basic aspects of controlling a clonk. Amongst these are basic movements, that is walking, jumping, scaling, hangling and swimming. The clonk is also able to control items, the most essential ones are explained. The shovel will be used to dig out tunnels, loam to build bridges and fire stones to blast through rock.\lang1043\fs20\par
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

View File

@ -1,33 +0,0 @@
[Head]
Icon=2
Title=Tutorial01
Version=6,0
MaxPlayer=1
Difficulty=1
[Definitions]
Definition1=Objects.ocd
[Player1]
Crew=Clonk=1
[Player2]
Crew=Clonk=1
[Player3]
Crew=Clonk=1
[Player4]
Crew=Clonk=1
[Landscape]
Sky=Clouds2
MapZoom=10
BottomOpen=0
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

@ -1,267 +0,0 @@
/*--
Tutorial 01
Author: Ringwall
First introduction to the world of OpenClonk: explains movement, shovel, loam and firestones.
--*/
static guide; // guide object
static loam_chest; // chest containing loam
static flint_chest; // chest containing flints
protected func Initialize()
{
// Tutorial goal.
var goal = CreateObject(Goal_ReachFlag, 0, 0, NO_OWNER);
goal->CreateGoalFlag(2330, 1040);
// Environment.
PlaceGrass(85);
CreateObjectAbove(Tree_Coniferous, 900, 629);
CreateObjectAbove(Plane, 950, 605);
// Shovel in water.
var shovel = CreateObjectAbove(Shovel, 1368, 1160, NO_OWNER);
shovel->SetR(150);
AddEffect("ShovelGet", shovel, 100, 36, shovel);
// Chest with loam.
var chest = CreateObjectAbove(Chest, 1815, 1100, NO_OWNER);
var loam = chest->CreateContents(Loam);
AddEffect("LoamGet", loam, 1, 36, loam);
loam->AddRestoreMode(chest);
// Chest with firestones.
chest = CreateObjectAbove(Chest, 2026, 1089, NO_OWNER);
chest->CreateContents(Firestone)->AddRestoreMode(chest);
chest->CreateContents(Firestone)->AddRestoreMode(chest);
// Dialogue options -> repeat round.
SetNextMission("Tutorial.ocf\\Tutorial01.ocs", "$MsgRepeatRound$", "$MsgRepeatRoundDesc$");
return;
}
// Gamecall from goals, set next mission.
protected func OnGoalsFulfilled()
{
// Achievement star
GainScenarioAchievement("Done");
// Dialogue options -> next round.
SetNextMission("Tutorial.ocf\\Tutorial02.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
protected func InitializePlayer(int plr)
{
var clonk = GetCrew(plr, 0);
clonk->SetPosition(230, 955);
var effect = AddEffect("ClonkRestore", clonk, 100, 10);
effect.var1 = 230;
effect.var2 = 955;
// Standard player zoom for tutorials, player is not allowed to zoom in/out.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 400, nil, PLRZOOM_Direct | PLRZOOM_LimitMin | PLRZOOM_LimitMax);
// Create tutorial guide, add messages, show first.
guide = CreateTutorialGuide(plr);
guide->AddGuideMessage("@$MsgTutIntro0$");
guide->ShowGuideMessage(0);
AddEffect("TutorialIntro1", nil, 100, 36 * 3);
AddEffect("TutorialScale", nil, 100, 5);
return;
}
/*-- Guide Messages --*/
// Finds when the Clonk has done 'X', and changes the message.
global func FxTutorialIntro1Stop()
{
guide->AddGuideMessage("@$MsgTutIntro1$");
guide->ShowGuideMessage(1);
AddEffect("TutorialIntro2", nil, 100, 36 * 3);
return 1;
}
global func FxTutorialIntro2Stop()
{
guide->AddGuideMessage("@$MsgTutIntro2$");
guide->ShowGuideMessage(2);
AddEffect("TutorialIntro3", nil, 100, 36 * 10);
return 1;
}
global func FxTutorialIntro3Stop()
{
guide->AddGuideMessage("$MsgTutIntro3$");
guide->ShowGuideMessage(3);
guide->AddGuideMessage("$MsgTutMovement$");
return 1;
}
global func FxTutorialScaleTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(650, 990, 140, 90)))
{
while (GetEffect("TutorialIntro*"))
RemoveEffect("TutorialIntro*");
guide->ClearGuideMessage();
guide->AddGuideMessage("$MsgTutScale$");
AddEffect("TutorialHangle", nil, 100, 18);
return -1;
}
}
global func FxTutorialHangleTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(820, 940, 190, 140)))
{
guide->AddGuideMessage("$MsgTutHangle$");
AddEffect("TutorialSwim", nil, 100, 18);
return -1;
}
}
global func FxTutorialSwimTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(1120, 1030, 140, 60)))
{
guide->AddGuideMessage("$MsgTutSwim$");
AddEffect("TutorialDig", nil, 100, 18);
return -1;
}
}
global func FxTutorialDigTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(1530, 1040, 130, 60)))
{
return -1;
}
return 1;
}
global func FxTutorialDigStop()
{
guide->AddGuideMessage("$MsgTutDig$");
return 1;
}
global func FxShovelGetTimer(object target, effect, int timer)
{
if (target->Contained() != nil)
{
if (GetEffect("TutorialDig"))
RemoveEffect("TutorialDig");
guide->AddGuideMessage("$MsgTutTools$");
AddEffect("TutorialChest", nil, 100, 18);
AddEffect("TutorialFlint", nil, 100, 18);
return -1;
}
}
global func FxTutorialChestTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(1750, 1030, 130, 80)))
{
guide->AddGuideMessage("$MsgTutChest$");
return -1;
}
}
global func FxLoamGetTimer(object target, effect, int timer)
{
if (!target->Contained() || target->Contained()->GetID() != Chest)
{
guide->AddGuideMessage("$MsgTutLoam$");
RemoveEffect("TutorialChest");
AddEffect("TutorialFlint", nil, 100, 18);
return -1;
}
}
global func FxTutorialFlintTimer(object target, effect, int timer)
{
if (FindObject(Find_ID(Clonk), Find_InRect(1990, 1020, 130, 90)))
{
guide->AddGuideMessage("$MsgTutFlint$");
return -1;
}
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show the player his clonk.
if (index == 1)
TutArrowShowTarget(GetCrew(GetPlayerByIndex()), 225, 24);
// Show where the goal is located in the HUD.
if (index == 2)
// TODO: adapt to new controls.
// Show where the guide is located in the HUD.
if (index == 3)
TutArrowShowGUIPos(- 128 - 32 - TutorialGuide->GetDefWidth() / 2, 8 + TutorialGuide->GetDefHeight() / 2, 0, 40);
// Show wall to climb.
if (index == 5)
TutArrowShowPos(800, 1030, 90);
// Show ceiling to hangle.
if (index == 6)
TutArrowShowPos(1030, 1030, 45);
// Show shovel under water.
if (index == 8)
TutArrowShowTarget(FindObject(Find_ID(Shovel)), 225);
// Show inventory slots.
if (index == 9)
{
// TODO: adapt to new controls.
}
return;
}
protected func OnGuideMessageRemoved(int plr, int index)
{
TutArrowClear();
return;
}
/*-- Clonk restoring --*/
global func FxClonkRestoreTimer(object target, effect, int time)
{
// Respawn to new location if reached bow & arrow chest.
if (FindObject(Find_ID(Clonk), Find_InRect(1120, 1030, 140, 60)))
{
effect.var1 = 1240;
effect.var2 = 1070;
}
// Respawn to new location if reached brick climb.
if (FindObject(Find_ID(Clonk), Find_InRect(1990, 1020, 130, 90)))
{
effect.var1 = 2010;
effect.var2 = 1020;
}
return 1;
}
// 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.var1;
var to_y = effect.var2;
// 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 1;
}

View File

@ -1,20 +0,0 @@
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
MsgNextTutorialDesc=Die nächste Lernrunde starten.
MsgRepeatRound=&Lernrunde wiederholen
MsgRepeatRoundDesc=Diese Lernrunde wiederholen.
# Tutorial messages
MsgTutIntro0=Willkommen bei OpenClonk!
MsgTutIntro1=Dies ist dein Clonk.
MsgTutIntro2=Das Ziel der Lernrunde ist, mit deinem Clonk durch die Höhle an den rechten Kartenrand zu kommen. Das Spielziel wird in jeder Runde in der oberen rechten Ecke des Bildschirms angezeigt.
MsgTutIntro3=Wenn du an einer Stelle einen Tipp brauchst, klicke auf mein Bildchen in der oberen rechten Ecke des Bildschirms. Klicke nochmal, um den Tipp wieder zu schließen.
MsgTutMovement=Clonks werden durch die WASD Tasten gesteuert. Drücke [A] oder [D], um nach links oder rechts zu gehen. Mit [W] springst du.
MsgTutScale=Hier musst du an der Wand hochklettern, um weiterzukommen. Dein Clonk fängt automatisch an zu klettern, wenn du gegen eine Wand läufst oder springst. Dann kannst du mit [W] hoch- und [S] runterklettern.
MsgTutHangle=Um zu hangeln, springe einfach an die Decke. Dann kannst du normal nach links oder rechts hangeln. Um schließlich loszulassen, drücke [S].
MsgTutSwim=Im Wasser kannst du in jede Richtung schwimmen. Wenn du untertauchst, hält dein Clonk den Atem an. Pass auf, rechtzeitig wieder aufzutauchen, sonst ertrinkt er.
MsgTutDig=Hier brauchst du eine Schaufel um hindurchzugraben. Was ist das da unter Wasser?
MsgTutTools=Das Inventar deines Clonks am linken Bildschirmrand zeigt nun die Schaufel. Dieses hat mehrere Slots, zwei davon können als aktiv markiert werden. Mit der linken Maustaste weist du den Slot der linken Hand zu; mit der rechten Maustaste der rechten Hand.||Wenn du mit der Maus über die Schaufel im Inventar fährst, wird eine eine kurze Beschreibung angezeigt, die erklärt wie sie funktioniert.
MsgTutChest=Um hier weiterzukommen, musst du eine Lehmbrücke bauen. In der Truhe ist ein Lehmklumpen. Stell dich vor die Truhe und drücke [E], um das Inventarmenü zu öffnen. Um den Lehmklumpen dann einzusammeln, klicke im Menü darauf oder ziehe ihn in den Kreis vom Clonk. Drücke nochmal [E] um das Menü wieder zu schließen.
MsgTutLoam=Um eine Lehmbrücke zu bauen, halte die Maustaste gedrückt. Die Konstruktion funktioniert wie das Graben, nur statt einem Tunnel wird eine Lehmbrücke gebaut.
MsgTutFlint=Oh! was ist das? Der Höhlenausgang ist durch solides Gestein versperrt. Mit der Schaufel kommst du da nicht durch.|In der Truhe sind Feuersteine, die bei Aufprall explodieren. Hole sie dir und wirf sie auf die Felswand, um dir einen Weg freizusprengen (ziele und werfe mit der Maus).

View File

@ -1,20 +0,0 @@
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutIntro0=Welcome to OpenClonk!
MsgTutIntro1=This is your clonk.
MsgTutIntro2=Travel through the cave to the right to complete the tutorial. Your current goal is always shown in the upper right corner of the screen.
MsgTutIntro3=If at any time you need help, click on my icon in the upper right corner of the screen. Once you're done reading, click again on the icon to hide the message.
MsgTutMovement=Clonks are controlled with the WASD keys. Press [A] or [D] to make the clonk walk left or right. Pressing [W] will make the clonk jump.
MsgTutScale=Here you will need to scale the wall to advance. To scale, walk towards the wall until your clonk grabs on. Once you have grabbed on, you may scale up or down the wall by holding [W] or [S].
MsgTutHangle=To hangle, jump towards the ceiling. When your clonk grabs on, you will be able to move left or right. To release, press [S].
MsgTutSwim=Swimming is controlled simply by pressing in the direction you wish your clonk to move. While underwater make certain you resurface before your breath runs out, otherwise you will drown!
MsgTutDig=You'll need a shovel to dig through here. What's that under the water?
MsgTutTools=The shovel is now shown in your clonk's inventory on the left side of the screen. It has several slots, of which two can be selected as active. Left-clicking assigns the slot to the left hand; right-clicking, to the right. To use a item, simply click the corresponding button.||Place the mouse over the shovel in your inventory slot to get a brief description on how it works.
MsgTutChest=You'll need to make a loam bridge to cross this obstacle. In the chest there is a chunk of loam. Go in front of the chest and press [E] to open the contents-menu. It will show the contents of the clonk's inventory and the chest. In this menu, click on the chunk of loam or drag it into the clonk's circle to collect it.||Press [E] again to close the menu.
MsgTutLoam=Hold down the mouse button to build a loam bridge. Building a loam bridge works like digging with the shovel, only that you don't dig a tunnel but build a bridge out of loam.
MsgTutFlint=Oh! What's this? The cave's exit has been blocked with solid rock. You can't dig through solid rock with the shovel. In the chest are firestones which explode on impact. Collect them and throw them at the wall to blow a hole into it (aim and throw with the mouse).

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,2 +0,0 @@
DE:Clonksteuerung
US:Clonk Control

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

@ -1,38 +0,0 @@
[Head]
Icon=3
Title=Tutorial02
Version=6,0
MaxPlayer=1
Difficulty=2
[Definitions]
Definition1=Objects.ocd
[Player1]
Crew=Clonk=2
[Player2]
Crew=Clonk=2
[Player3]
Crew=Clonk=2
[Player4]
Crew=Clonk=2
[Landscape]
Vegetation=Mushroom=1;Fern=1
VegetationLevel=100
InEarth=Rock=2;Gold=1
InEarthLevel=25
MapZoom=10
Sky=Clouds1
TopOpen=1
BottomOpen=0
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

@ -1,634 +0,0 @@
/*--
Tutorial 02
Author: Maikel
In this tutorial the player will be familiarized with crew selection, backpack control and some tools.
--*/
static guide; // guide object.
protected func Initialize()
{
// Create goal, all crew members should reach the flag on the far right side.
var goal = CreateObject(Goal_ReachFlag, 0, 0, NO_OWNER);
goal->CreateGoalFlag(2950, 280);
// Create all objects, vehicles, chests used by the player.
var effect, firestone, chest, grapple, dynamite;
// Dynamite box to blast through mine.
var dyn1 = CreateObjectAbove(Dynamite, 242, 665, NO_OWNER);
var dyn2 = CreateObjectAbove(Dynamite, 272, 665, NO_OWNER);
var dyn3 = CreateObjectAbove(Dynamite, 272, 685, NO_OWNER);
var dyn4 = CreateObjectAbove(Dynamite, 242, 685, NO_OWNER);
var dyn5 = CreateObjectAbove(Dynamite, 257, 675, NO_OWNER);
CreateObjectAbove(Fuse, 255, 675, NO_OWNER)->Connect(dyn1, dyn2);
CreateObjectAbove(Fuse, 255, 675, NO_OWNER)->Connect(dyn2, dyn3);
CreateObjectAbove(Fuse, 255, 675, NO_OWNER)->Connect(dyn3, dyn4);
CreateObjectAbove(Fuse, 255, 675, NO_OWNER)->Connect(dyn4, dyn5);
var igniter = CreateObjectAbove(Igniter, 110, 710, NO_OWNER);
CreateObjectAbove(Fuse, 240, 685, NO_OWNER)->Connect(dyn5, igniter);
igniter->SetGraphics("Picture", Igniter, 1, GFXOV_MODE_Picture);
// Miner's hut and chest with catapult stuff.
//var hut = CreateObjectAbove(WoodenCabin, 570, 740, NO_OWNER);
//hut->SetObjectLayer(hut);
chest = CreateObjectAbove(Chest, 510, 740, NO_OWNER);
for (var i = 0; i < 3; i++)
{
firestone = CreateObjectAbove(Firestone, 0, 0, NO_OWNER);
firestone->Enter(chest);
firestone->AddRestoreMode(chest);
}
// Cannon to blast through rock & chest with powderkeg and firestones.
/* var cannon = CreateObjectAbove(Cannon, 700, 420, NO_OWNER);
effect = AddEffect("CannonRestore", cannon, 100, 10);
effect.to_x = 700;
effect.to_y = 420;*/
// Catapult to blast through rock & chest with firestones.
var catapult = CreateObjectAbove(Catapult, 700, 420, NO_OWNER);
effect = AddEffect("CatapultRestore", catapult, 100, 10);
effect.to_x = 700;
effect.to_y = 420;
// Chest with flints and dynamite to blast underwater rocks.
chest = CreateObjectAbove(Chest, 870, 680, NO_OWNER);
for (var i = 0; i < 2; i++)
{
firestone = CreateObjectAbove(Firestone, 0, 0, NO_OWNER);
firestone->Enter(chest);
firestone->AddRestoreMode(chest);
}
dynamite = CreateObjectAbove(DynamiteBox, 0, 0, NO_OWNER);
dynamite->Enter(chest);
effect = AddEffect("DynamiteRestore", dynamite, 100, 10);
effect.to_container = chest;
// Another chest with flints and dynamite to blast underwater rocks.
chest = CreateObjectAbove(Chest, 950, 600, NO_OWNER);
for (var i = 0; i < 2; i++)
{
dynamite = CreateObjectAbove(DynamiteBox, 0, 0, NO_OWNER);
dynamite->Enter(chest);
effect = AddEffect("DynamiteRestore", dynamite, 100, 10);
effect.to_container = chest;
}
firestone = CreateObjectAbove(Firestone, 0, 0, NO_OWNER);
firestone->Enter(chest);
firestone->AddRestoreMode(chest);
// Chest with Grapplebows for the final leap.
chest = CreateObjectAbove(Chest, 1520, 700, NO_OWNER);
for (var i = 0; i < 3; i++)
{
grapple = CreateObjectAbove(GrappleBow, 0, 0, NO_OWNER);
grapple->Enter(chest);
effect = AddEffect("ClonkContentRestore", grapple, 100, 10);
effect.to_container = chest;
}
var shovel = CreateObjectAbove(Shovel, 0, 0, NO_OWNER);
shovel->Enter(chest);
effect = AddEffect("ClonkContentRestore", shovel, 100, 10);
effect.to_container = chest;
// Chest with boompack for fast players.
chest = CreateObjectAbove(Chest, 1800, 660, NO_OWNER);
chest->CreateContents(Boompack, 2);
// Set the mood.
SetSkyParallax(0, 20, 20);
PlaceGrass(85);
// Dialogue options -> repeat round.
SetNextMission("Tutorial.ocf\\Tutorial02.ocs", "$MsgRepeatRound$", "$MsgRepeatRoundDesc$");
return;
}
// Gamecall from goals, set next mission.
protected func OnGoalsFulfilled()
{
// Achievement star
GainScenarioAchievement("Done");
// Dialogue options -> next round.
SetNextMission("Tutorial.ocf\\Tutorial03.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
protected func InitializePlayer(int plr)
{
var clonk, effect, grapple, ropeladder;
// Standard player zoom for tutorials.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 400, nil, PLRZOOM_Direct);
// First clonk.
clonk = GetCrew(plr, 0);
clonk->SetPosition(200, 440);
effect = AddEffect("ClonkOneRestore", clonk, 100, 10);
effect.to_x = 200;
effect.to_y = 440;
grapple = CreateObjectAbove(GrappleBow, 0, 0, NO_OWNER);
grapple->Enter(clonk);
effect = AddEffect("ClonkContentRestore", grapple, 100, 10);
effect.to_container = clonk;
effect = AddEffect("EquipmentRestore", grapple, 100, 10);
effect.to_container = clonk;
ropeladder = CreateObjectAbove(Ropeladder, 0, 0, NO_OWNER);
ropeladder->Enter(clonk);
effect = AddEffect("ClonkContentRestore", ropeladder, 100, 10);
effect.to_container = clonk;
effect = AddEffect("EquipmentRestore", ropeladder, 100, 10);
effect.to_container = clonk;
// Second clonk.
clonk = GetCrew(plr, 1);
clonk->SetPosition(30, 680);
effect = AddEffect("ClonkTwoRestore", clonk, 100, 10);
effect.to_x = 30;
effect.to_y = 680;
// Select first clonk
SetCursor(plr, GetCrew(plr, 0));
// Create tutorial guide, add messages, show first.
guide = CreateTutorialGuide(plr);
guide->AddGuideMessage("$MsgTutWelcome$");
guide->ShowGuideMessage(0);
AddEffect("TutorialGrappleUp", nil, 100, 36 * 5);
return;
}
/*-- Guide Messages --*/
global func FxTutorialGrappleUpStop()
{
guide->AddGuideMessage("$MsgTutGrappleUp$");
AddEffect("TutorialReachedEdge", nil, 100, 5);
return 1;
}
global func FxTutorialReachedEdgeTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_InRect(160, 220, 100, 160)))
return -1;
return 1;
}
global func FxTutorialReachedEdgeStop()
{
guide->AddGuideMessage("$MsgTutCrewSelection$");
return 1;
}
// Player mastered crew selection
public func OnClonkSelection()
{
if (FrameCounter() == 0)
return;
if (GetEffect("TutorialCrewSelected"))
return;
AddEffect("TutorialCrewSelected", nil, 100, 1000);
if (GetEffect("TutorialGrappleUp", nil))
RemoveEffect("TutorialGrappleUp", nil);
if (GetEffect("TutorialReachedEdge", nil))
RemoveEffect("TutorialReachedEdge", nil);
guide->AddGuideMessage("$MsgTutBlowUpGold$");
AddEffect("TutorialBlastedThrough", nil, 100, 5);
return;
}
global func FxTutorialCrewSelectedTimer()
{
return 1;
}
global func FxTutorialBlastedThroughTimer()
{
if (GetPathLength(150, 670, 350, 655))
{
guide->AddGuideMessage("$MsgTutFreeOtherClonk$");
AddEffect("TutorialFoundInteractable", nil, 100, 5);
return -1;
}
return 1;
}
// TODO move this around a little
global func FxTutorialFoundInteractableTimer(object target, effect)
{
var clonk = GetCursor(GetPlayerByIndex(0));
var catapult = FindObject(Find_ID(Catapult));
//var chest = FindObject(Find_ID(Chest), Find_Distance(40, 510, 740));
if (clonk->GetAction() == "Push")
{
var act_trg = clonk->GetActionTarget(0);
if (act_trg == catapult)
{
if (clonk->FindContents(Firestone))
{
if (!effect.toldabout_catapult)
guide->AddGuideMessage("$MsgTutCatapult$");
if (!effect.toldabout_chest)
guide->AddGuideMessage("$MsgTutExplosivesChest$");
guide->AddGuideMessage("$MsgTutFireCatapult$");
AddEffect("TutorialRockBlasted", nil, 100, 5);
return -1;
}
else if (!effect.toldabout_catapult)
{
guide->AddGuideMessage("$MsgTutCatapult$");
effect.toldabout_catapult = true;
}
}
}
if (!effect.toldabout_chest && FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 510, 740)))
{
guide->AddGuideMessage("$MsgTutExplosivesChest$");
effect.toldabout_chest = true;
}
return 1;
}
global func FxTutorialRockBlastedTimer()
{
if (GetPathLength(280, 230, 420, 230))
{
guide->AddGuideMessage("$MsgTutGrappleSwing$");
AddEffect("TutorialReachedPlatform", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedPlatformTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 680, 260)))
{
guide->AddGuideMessage("$MsgTutRopeladder$");
AddEffect("TutorialReachedLake", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedLakeTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 960, 360)))
{
guide->AddGuideMessage("$MsgTutDive$");
AddEffect("TutorialReachedGranite", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedGraniteTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 1560, 350)))
{
guide->AddGuideMessage("$MsgTutBlastGranite$");
AddEffect("TutorialPassedGranite", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialPassedGraniteTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_InRect(1800, 0, 1200, 750)))
{
guide->AddGuideMessage("$MsgTutBlastedGranite$");
AddEffect("TutorialReachedAcid", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedAcidTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 2130, 330)))
{
guide->AddGuideMessage("$MsgTutLastGrapple$");
return -1;
}
return 1;
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show the guide location again.
if (index == 0)
{
var guide = FindObject(Find_ID(TutorialGuide));
if (guide)
TutArrowShowGUITarget(guide, 0);
}
// Show grapple hook position.
if (index == 1)
TutArrowShowPos(60, 280, 0);
// Show crew selection in the HUD.
if (index == 2)
for (var crew_sel in FindObjects(Find_ID(GUI_CrewSelector)))
TutArrowShowGUITarget(crew_sel, 0);
// Show dynamite detonator.
if (index == 3)
{
var detonator = FindObject(Find_ID(Igniter), Find_InRect(0, 600, 300, 150));
if (detonator)
TutArrowShowTarget(detonator, 225, 16);
}
// Show where to shoot with catapult.
if (index == 7)
TutArrowShowPos(380, 240, 270);
// Show grapple jump & hook position.
if (index == 8)
{
TutArrowShowPos(440, 310, 225);
TutArrowShowPos(580, 170, 0);
}
// Show ropeladder position.
if (index == 9)
TutArrowShowPos(630, 310, 135);
// Show resurface locations.
if (index == 10)
{
TutArrowShowPos(1160, 590, 0);
TutArrowShowPos(1285, 520, 0);
TutArrowShowPos(1230, 510, 0);
}
// Show granite blast location.
if (index == 11)
TutArrowShowPos(1705, 345, 90);
// Show grapple tunnel
if (index == 12)
TutArrowShowPos(1500, 480, 135);
// Show grapple aim positions.
if (index == 13)
{
TutArrowShowPos(2270, 225, 0);
TutArrowShowPos(2340, 225, 0);
TutArrowShowPos(2435, 260, 0);
TutArrowShowPos(2515, 230, 0);
TutArrowShowPos(2680, 260, 0);
}
return;
}
protected func OnGuideMessageRemoved(int plr, int index)
{
TutArrowClear();
return;
}
/*-- Clonk restoring --*/
global func FxClonkOneRestoreTimer(object target, effect, int time)
{
// Restore clonk to its original location if there is no hanging rope ladder and clonk has fallen down in first sector.
if (target->GetY() > 360 && Inside(target->GetX(), 360, 720) && !FindObject(Find_InRect(340, 310, 30, 80), Find_Func("IsLadder")))
{
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;
restorer->SetRestoreObject(target, nil, to_x, to_y, 0, "ClonkOneRestore");
return -1;
}
// Respawn to new location if reached cliff to grapple from.
if (Distance(target->GetX(), target->GetY(), 400, 250) < 40)
{
effect.to_x = 400;
effect.to_y = 250;
}
// Respawn to new location if reached ledge.
if (Distance(target->GetX(), target->GetY(), 680, 260) < 40)
{
effect.to_x = 680;
effect.to_y = 260;
}
// Respawn to new location if reached lake.
if (Distance(target->GetX(), target->GetY(), 960, 360) < 40)
{
effect.to_x = 960;
effect.to_y = 360;
}
// Respawn to new location if reached granite blasting.
if (Distance(target->GetX(), target->GetY(), 1560, 350) < 40)
{
effect.to_x = 1560;
effect.to_y = 350;
}
// Respawn to new location if reached acid lake.
if (Distance(target->GetX(), target->GetY(), 2130, 330) < 40)
{
effect.to_x = 2130;
effect.to_y = 330;
}
return 1;
}
// Relaunches the clonk, from death or removal.
global func FxClonkOneRestoreStop(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;
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObjectAbove(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
if (GetCursor(plr) == target)
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
// Transfer contents(grapple bow and shovel).
for (var transfer in FindObjects(Find_Container(target), Find_Or(Find_ID(Shovel), Find_ID(GrappleBow))))
{
var obj = CreateObjectAbove(transfer->GetID(), 0, 0, NO_OWNER);
obj->Enter(clonk);
var new_effect = AddEffect("ClonkContentRestore", obj, 100, 10);
new_effect.to_container = clonk;
}
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkOneRestore");
}
return 1;
}
global func FxClonkTwoRestoreTimer(object target, effect, int time)
{
// Respawn to new location if reached ledge.
if (Distance(target->GetX(), target->GetY(), 680, 260) < 40)
{
effect.to_x = 680;
effect.to_y = 260;
}
// Respawn to new location if reached lake.
if (Distance(target->GetX(), target->GetY(), 960, 360) < 40)
{
effect.to_x = 960;
effect.to_y = 360;
}
// Respawn to new location if reached granite blasting.
if (Distance(target->GetX(), target->GetY(), 1560, 350) < 40)
{
effect.to_x = 1560;
effect.to_y = 350;
}
// Respawn to new location if reached acid lake.
if (Distance(target->GetX(), target->GetY(), 2130, 330) < 40)
{
effect.to_x = 2130;
effect.to_y = 330;
}
return 1;
}
// Relaunches the clonk, from death or removal.
global func FxClonkTwoRestoreStop(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;
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObjectAbove(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
if (GetCursor(plr) == target)
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
// Transfer contents(grapple bow and shovel).
for (var transfer in FindObjects(Find_Container(target), Find_Or(Find_ID(Shovel), Find_ID(GrappleBow))))
{
var obj = CreateObjectAbove(transfer->GetID(), 0, 0, NO_OWNER);
obj->Enter(clonk);
var new_effect = AddEffect("ClonkContentRestore", obj, 100, 10);
new_effect.to_container = clonk;
}
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkTwoRestore");
}
return 1;
}
/*-- Item restoring --*/
// All done through global effects, which use ObjectRestorer.
// In all cases the effects have:
// Timer interval: 10 frames.
// Effectvar 0: Container to which must be restored.
// Effectvar 1: x-coordinate to which must be restored.
// Effectvar 2: y-coordinate to which must be restored.
// Dynamite box, needs seperate effect since changedef call.
global func FxDynamiteRestoreStop(object target, effect, int reason, bool temporary)
{
if (reason == 3)
{
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_container = effect.to_container;
var restored = CreateObjectAbove(DynamiteBox, 0, 0, target->GetOwner());
restorer->SetRestoreObject(restored, to_container, nil, nil, nil, "DynamiteRestore");
}
return 1;
}
// Dynamite box, effect timer is always needed.
global func FxDynamiteRestoreTimer(object target, effect, int time)
{
return 1;
}
// Catapult, restore position if pushed to far to the right.
global func FxCatapultRestoreTimer(object target, effect, int time)
{
if ((target->GetX() < 595 && target->GetY() > 415) && !target->Contained())
{
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;
restorer->SetRestoreObject(target, nil, to_x, to_y, 0, "CatapultRestore");
return -1;
}
return 1;
}
// Ropeladder, restore if thrown away to unreachable location.
global func FxEquipmentRestoreTimer(object target, effect, int time)
{
if (target->GetX() < 680 && target->GetY() > 340 && !target->Contained())
{
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_container = effect.to_container;
restorer->SetRestoreObject(target, to_container, nil, nil, 0, "RopeladderRestore");
return -1;
}
return 1;
}
// Ropeladder, restore if destroyed.
global func FxRopeladderRestoreStop(object target, effect, int reason, bool temporary)
{
if (reason == 3)
{
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_container = effect.to_container;
var restored = CreateObjectAbove(Ropeladder, 0, 0, target->GetOwner());
restorer->SetRestoreObject(restored, to_container, nil, nil, 0, "RopeladderRestore");
}
return 1;
}
// Clonk content, set new restore location to last clonk.
global func FxClonkContentRestoreTimer(object target, effect, int time)
{
// Content objects to the container containing them last.
if (target->Contained())
effect.to_container = target->Contained();
return 1;
}
// Clonk content, restore if destroyed.
global func FxClonkContentRestoreStop(object target, effect, int reason, bool temporary)
{
if (reason == 3)
{
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_container = effect.to_container;
var restored = CreateObjectAbove(target->GetID(), 0, 0, target->GetOwner());
restorer->SetRestoreObject(restored, to_container, nil, nil, 0, "ClonkContentRestore");
}
return 1;
}

View File

@ -1,21 +0,0 @@
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
MsgNextTutorialDesc=Die nächste Lernrunde starten.
MsgRepeatRound=&Runde wiederholen
MsgRepeatRoundDesc=Diese Runde wiederholen.
# Tutorial messages
MsgTutWelcome=Willkommen zur zweiten Lernrunde. In dieser Lernrunde hast Du zwei Clonks zur Verfügung. Das Spielziel dieser Runde ist wieder, den Fahnenmast am rechten Rand der Karte zu erreichen, diesmal aber mit beiden Clonks. Klicke auf mein Bildchen in der oberen linken Ecke des Bildschirmes für Tipps. Du kannst jederzeit mit dem Mausrad oder mit F5/F6 zoomen.
MsgTutGrappleUp=Der Clonk kann nicht hoch genug springen, um über die Klippe zu kommen. Ziele und schieße mit dem Enterhaken in deinem Inventar an die angezeigte Position. Du kannst mit [W] und [S] das Seil hoch- und runterklettern sowie mit [A] und [D] hin- und herschaukeln.
MsgTutCrewSelection=Es gibt momentan nichts mehr was du mit diesem Clonk machen kannst. Um ein anderes Crewmitglied anzuwählen, klicke entweder auf das Bildchen des Clonks in der linken oberen Ecke des Bildschirms, drücke [Strg] + die Nummer des auszuwählenden Clonks oder wähle den nächsten Clonk an indem du [R] oder [T] drückst.
MsgTutBlowUpGold=Sieht aus, als hätten Bergarbeiter einen verdrahteten Zünder in dieser Goldmine zurückgelassen. Sammle ihn auf und drücke [Benutzen], um das Gold, dass deinen Weg versperrt, wegzusprengen.
MsgTutFreeOtherClonk=Jetzt wo sich dein Clonk freigesprengt hat, versuche einen Weg zu finden, wie du deinen anderen Clonk befreien kannst. Denk daran, dass dein Clonk mit vielen Dingen interagieren kann, die in der Landschaft herumstehen. Du kannst sie benutzen, indem du dich vor sie stellst und [Interagieren] (Leertaste) drückst. Objekte, mit denen dein Clonk interagieren kann, tauchen auch wie die Truhe als Bildchen unten am Bildschirmrand auf.
MsgTutCatapult=Ah, du hast das Katapult gefunden. Mit dem Katapult kann man Objekte über große Distanzen verschießen.
MsgTutExplosivesChest=Die Bergarbeiter haben einige Sprengstoffe in der Truhe zurückgelassen. Stell dich vor die Truhe und drücke die [Leertaste], um die Truhe zu öffnen. Sobald der Inhalt der Truhe angezeigt wird, kannst du ihn in die Hand nehmen.
MsgTutFireCatapult=Um ein Gegenstand mit dem Katapult zu verschießen, fasse das Katapult mit der Leertaste an und halte eine Maustaste gedrückt, um den Arm zu spannen. Je weiter du den Mauszeiger vom Katapult wegziehst, desto stärker schießt es. Mit der linken Maustaste verschießt du, was du in der linken Hand hast und mit der rechten Maustaste, was du in der rechten Hand hast. Du musst dich durch den Fels dort sprengen, um deinen anderen Clonk zu befreien. Suche nach einigen Feuersteinen in der Goldmine.
MsgTutGrappleSwing=Wähle jetzt deinen anderen Clonk aus und bewege ihn an den Rand zum Pfeil. Springe und schieße mit dem Enterhaken an die Decke, dort wo der andere Pfeil ist. Dann kannst Du dich mit [A] und [D] über den Abgrund schwingen.
MsgTutRopeladder=Gut gemacht! Jetzt kannst du deine Strickleiter benutzen um deinem Freund auf die Klippe zu helfen. Gehe zum Pfeil und lass die Strickleiter herab, indem du links neben deinen Clonk klickst. An Strickleitern kann man wie an normalen Wänden klettern.
MsgTutDive=Um am nächsten Hindernis vorbeizukommen, musst du tauchen. Clonks können nur begrenzt lange die Luft anhalten, deshalb musst du regelmäßig auftauchen. Du kannst an den Stellen Luft holen, die von den Pfeilen angezeigt werden. In den Truhen unter dem See findest du Sprengstoff, welchen du brachst, um das Lernrunde zu schaffen.
MsgTutBlastGranite=Benutze den Sprengstoff, den du unter dem See findest, um durch das Granit zu sprengen. Die beste Stelle wird vom Pfeil angezeigt.
MsgTutBlastedGranite=Gut gemacht! Um die letzte Hürde zu bestehen, brauchst du zwei Enterhaken pro Clonk. Diese findest du im Tunnel, wenn du ein Stück zurück gehst.
MsgTutLastGrapple=Oh oh, das sieht ja wie ein Säuresee aus. Du hast keine Chance hier unbeschadet hinüber zu schwimmen. Der einfachste Weg hinüber ist mit Hilfe der Enterhaken: Schieß den ersten Enterhaken an die Himmelsinsel und während du am ersten Seil hoch kletterst, kannst du den anderen Enterhaken benutzen, indem du ihn weiter vorne befestigst. Wiederhole das bis du den ganzen Säuresee überquert hast.

View File

@ -1,21 +0,0 @@
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutWelcome=Welcome to the second tutorial. In this tutorial you have two clonks at your disposal, and your goal will be to reach the flag on the far right side with both clonks. At any time you can click on the guide for helpful hints; note that you can zoom in and out with F5/F6 or the mouse wheel.
MsgTutGrappleUp=The clonk is not able to jump that high; you can use the grappling hook in your inventory. Use the mouse to aim and shoot the hook into the rock at the indicated position. You can use [W] and [S] to climb the rope, and [A] and [D] to swing back and forth.
MsgTutCrewSelection=There is nothing else you can do with this clonk for the moment. To select another crew member you can either click on the clonk you want to control in the upper left corner of the screen, press [Ctrl] + the number key corresponding to the clonk, or cycle through your crew by pressing [R] or [T].
MsgTutBlowUpGold=It seems like miners left behind a wired detonator in this gold mine. Collect it and press [Use] to blow up the gold blocking your way out.
MsgTutFreeOtherClonk=Now that this clonk is free, look for a way to free your other clonk. Note that your clonk can interact with many objects, most of them containers, vehicles and buildings. You can interact with them by standing in front of them and pressing [Interact] (Space bar); also for every interactable, a clickable icon will appear on the lower side of the screen.
MsgTutCatapult=Ah! You found the catapult; it can be used to fire objects over great distances. But you will firestones to blast through the rock pillar. These can be found in the chest near the blasted gold.
MsgTutExplosivesChest=The miners left some explosives in this chest. Open it with [Interact]; the chest's contents will then appear. Click on an item to collect it into your inventory.
MsgTutFireCatapult=Good! You have brought some ammunition. To fire an object with the catapult, click in the landscape to winch the catapult. The farer away you move the mouse cursor, the more tension you put on the catapult. Left click will shoot your left-hand item, right click your right-hand one. You need to blast through the rock over there to free your other clonk.
MsgTutGrappleSwing=Now, select your other clonk and move to the edge indicated by the arrow. Jump from there and shoot with the grappler to the granite ceiling, the other arrow. Then, use [A] and [D] to swing across the cliff.
MsgTutRopeladder=Well done! You can now use your rope ladder to help your friend up to get on this ledge. Move to the arrow and release the rope ladder by clicking to the left of your clonk. Rope ladders can be climbed just as normal walls.
MsgTutDive=To make it past the next obstacle you would need to dive. Clonks have limited breath, so you need to resurface regularly. You can resurface at the locations indicated by the arrows. In the chests under the lake explosives can be found; these are crucial for completing the tutorial.
MsgTutBlastGranite=Use the explosives, which can be found under the lake, to blast through the granite. The best location is indicated by the arrow.
MsgTutBlastedGranite=Good job! For the last hurdle you need some grappling hooks. Two per clonk, to be precise; these can be found a tunnel a little back.
MsgTutLastGrapple=Ouch! That looks like an acid lake. No chance swimming across here, the easiest way over is by alternate use of two grappling hooks. Shoot the first hook into the granite, then while scaling the rope, use the second one. Repeat this till you made your way across the acid lake.

View File

@ -1,8 +0,0 @@
// Enter the catapult - not in this scenario!
#appendto Catapult
public func ActivateEntrance(object clonk) {
clonk->Message("$CatapultEntryDeactivated$");
return;
}

View File

@ -1,9 +0,0 @@
// Callback to scenario script, to notify the tutorial guide.
#appendto Clonk
public func CrewSelection(bool unselect)
{
GameCall("OnClonkSelection");
return _inherited(unselect, ...);
}

View File

@ -1 +0,0 @@
CatapultEntryDeactivated=Mit dieser Funktion könnte man sogar einen Clonk mit dem Katapult verschießen. Aber für die Lernrunde ist dies deaktiviert.

View File

@ -1 +0,0 @@
CatapultEntryDeactivated=This button is used to make the catapult shoot clonks. But it is deactived in this tutorial round.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,2 +0,0 @@
DE:Mehrere Clonks
US:Multiple Clonks

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,35 +0,0 @@
[Head]
Icon=4
Title=Tutorial03
Version=6,0
MaxPlayer=1
Difficulty=3
[Definitions]
Definition1=Objects.ocd
[Player1]
Crew=Clonk=1
[Player2]
Crew=Clonk=1
[Player3]
Crew=Clonk=1
[Player4]
Crew=Clonk=1
[Landscape]
Vegetation=Seaweed=5
VegetationLevel=70
InEarth=Rock=1;Gold=1;Loam=1
InEarthLevel=20,0,0,100
Sky=Clouds2
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

@ -1,266 +0,0 @@
/*--
Tutorial 03
Author: Ringwall
In this tutorial the player will be familiarized with some ranged weapons.
--*/
static guide; // guide object.
protected func Initialize()
{
// Environment
PlaceGrass(85);
// Goal: flag goal also checks if all targets are destroyed.
var goal = CreateObject(Goal_ReachFlag, 0, 0, NO_OWNER);
goal->CreateGoalFlag(2230, 292);
// A chest with javelins.
var chest = CreateObjectAbove(Chest, 240, 656, NO_OWNER);
var javelin = CreateObjectAbove(Javelin, 0, 0, NO_OWNER);
javelin->Enter(chest);
//javelin->AddRestoreMode(chest);
// A chest with bow & arrows.
var chest = CreateObjectAbove(Chest, 785, 560, NO_OWNER);
var bow = CreateObjectAbove(Bow, 0, 0, NO_OWNER);
bow->CreateContents(Arrow);
bow->Enter(chest);
//bow->AddRestoreMode(chest);
// Create practice targets.
var target;
// Two flying targets above the chest.
MakeTarget(280, 580, true);
MakeTarget(180, 560, true);
// A static target which opens the sand barrier.
var target = MakeTarget(410, 580, false);
AddEffect("Blast", target, 1, 0, target);
// A moving target.
var target = MakeTarget(380, 300, true)->GetActionTarget();
AddEffect("HorizontalMoving", target, 1, 1, target);
// A flying target which drops a flint.
var target = MakeTarget(686, 400, true);
AddEffect("FlintDrop", target, 1, 0, target);
// A moving and a static target.
var target = MakeTarget(880, 520, true)->GetActionTarget();
AddEffect("HorizontalMoving", target, 1, 1, target);
MakeTarget(1250, 450, true);
// A flying target dropping a flint.
var target = MakeTarget(1367, 300, true);
AddEffect("FlintDrop", target, 1, 0, target);
// Three flying targets and a moving target.
MakeTarget(1660, 450, true);
var target = MakeTarget(1560, 320, true)->GetActionTarget();
AddEffect("HorizontalMoving", target, 1, 1, target);
MakeTarget(1710, 230, true);
MakeTarget(1800, 260, true);
// The final target, creates a ropeladder.
var target = MakeTarget(2140, 250, true);
AddEffect("Ropeladder", target, 1, 0, target);
// Dialogue options -> repeat round.
SetNextMission("Tutorial.ocf\\Tutorial03.ocs", "$MsgRepeatRound$", "$MsgRepeatRoundDesc$");
return;
}
// Gamecall from goals, set next mission.
protected func OnGoalsFulfilled()
{
// Achievement star
GainScenarioAchievement("Done");
// Dialogue options -> next round.
SetNextMission("Tutorial.ocf\\Tutorial04.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
protected func InitializePlayer(int plr)
{
// Two times standard player zoom for tutorials, since targets can be distant.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 800, nil, PLRZOOM_Direct);
// Clonk to position and add restore effect.
var clonk = GetCrew(plr, 0);
clonk->SetPosition(30, 620);
var effect = AddEffect("ClonkRestore", clonk, 100, 10);
effect.var1 = 30;
effect.var2 = 620;
// Create tutorial guide, add messages, show first.
guide = CreateTutorialGuide(plr);
guide->AddGuideMessage("$MsgTutWelcome$");
guide->ShowGuideMessage(0);
AddEffect("TutorialJavelin", nil, 100, 36 * 5);
return;
}
/*-- Guide control --*/
global func FxTutorialJavelinStop()
{
guide->AddGuideMessage("$MsgTutJavelin$");
AddEffect("TutorialHasJavelin", nil, 100, 5);
return 1;
}
global func FxTutorialHasJavelinTimer()
{
var clonk = FindObject(Find_OCF(OCF_CrewMember));
if (!clonk)
return 1;
if (FindObject(Find_Container(clonk), Find_ID(Javelin)))
{
guide->AddGuideMessage("$MsgTutJumpThrow$");
AddEffect("TutorialBow", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialBowTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_InRect(680, 500, 100, 100)))
{
guide->AddGuideMessage("$MsgTutBow$");
AddEffect("TutorialHighBalloon", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialHighBalloonTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_InRect(1200, 400, 150, 150)))
{
guide->AddGuideMessage("$MsgTutHighBalloon$");
return -1;
}
return 1;
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show first three targets with the arrow.
if (index == 0)
for (var target in FindObjects(Find_ID(PracticeTarget), Find_InRect(100, 450, 350, 150)))
TutArrowShowTarget(target, RandomX(-45, 45), 24);
// Show javelin chest with an arrow.
if (index == 1)
TutArrowShowPos(240, 650);
// Show bow chest with an arrow.
if (index == 3)
TutArrowShowPos(785, 550);
// Show high balloon.
if (index == 4)
{
var target = FindObject(Find_ID(PracticeTarget), Find_Distance(25, 1364, 300));
if (target)
TutArrowShowTarget(target, RandomX(-45, 45), 24);
}
return;
}
protected func OnGuideMessageRemoved(int plr, int index)
{
TutArrowClear();
return;
}
/*-- Target control --*/
private func MakeTarget(int x, int y, bool flying)
{
var target = CreateObjectAbove(PracticeTarget, x, y, NO_OWNER);
if (flying)
{
var balloon = CreateObjectAbove(TargetBalloon, x, y-30, NO_OWNER);
target->SetAction("Attach", balloon);
CreateParticle("Flash", x, y - 50, 0, 0, 8, Particles_Flash());
}
else
{
CreateParticle("Flash", x, y, 0, 0, 8, Particles_Flash());
target->SetAction("Float");
}
return target;
}
// Blasts the first sand barrier on destruction.
global func FxBlastStop(object target, effect, int reason, bool temporary)
{
CreateObjectAbove(Rock, AbsX(430), AbsY(618), NO_OWNER)->Explode(25);
return 1;
}
// Creates a ropeladder on destruction to reach the final edge.
global func FxRopeladderStop(object target, effect, int reason, bool temporary)
{
CreateObjectAbove(Ropeladder, AbsX(2140), AbsY(320), NO_OWNER)->Unroll(-1);
return 1;
}
// Target moves horizontal.
global func FxHorizontalMovingTimer(object target, effect, int time)
{
target->SetXDir(Sin(time, 20));
return 1;
}
// Drops a firestone on destruction.
global func FxFlintDropStop(object target, effect, int reason, bool temporary)
{
CreateObjectAbove(Firestone, 0, 0, NO_OWNER);
return 1;
}
/*-- Clonk restoring --*/
global func FxClonkRestoreTimer(object target, effect, int time)
{
// Respawn to new location if reached bow & arrow chest.
if (Distance(target->GetX(), target->GetY(), 830, 560) < 40)
{
effect.var1 = 830;
effect.var2 = 560;
}
// Respawn to new location if reached brick climb.
if (Distance(target->GetX(), target->GetY(), 1490, 470) < 40)
{
effect.var1 = 1490;
effect.var2 = 470;
}
return 1;
}
// 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.var1;
var to_y = effect.var2;
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObjectAbove(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
// Transfer contents.
var transfer, index = target->ContentsCount();
while (transfer = target->Contents(--index))
transfer->Enter(clonk);
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkRestore");
}
return 1;
}
/*-- Item restoring --*/
// TODO: Is done in WeaponFade.c currently.

View File

@ -1,13 +0,0 @@
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
MsgNextTutorialDesc=Die nächste Lernrunde starten.
MsgRepeatRound=&Runde wiederholen
MsgRepeatRoundDesc=Diese Runde wiederholen.
# Tutorial messages
MsgTutWelcome=Willkommen zur Schießübung. Benutze den Speer und den Bogen um die Ballons zu treffen. Damit machst du den Weg zur Flagge auf der rechten Seite frei.
MsgTutJavelin=Nimm die Speere aus der Truhe und benutze sie um die ersten paar Ballons zu treffen. Du kannst auch mit Rechtsklick auf den Speer in der linken unteren Bildschirmhälfte klicken, um Hinweise zur Benutzung zu bekommen.
MsgTutJumpThrow=Wenn du Probleme beim Treffen mit dem Speer hast, wirf ihn während du springst. Auf diese Weise kannst du den Speer höher werfen.
MsgTutBow=Manche Ballons sind mit dem Speer nicht zu erreichen. Benutze statt dessen den Bogen aus dieser Truhe.
MsgTutHighBalloon=Den Ballon ganz oben kannst du besser treffen, wenn du springst während du schießt. Ziele zuerst mit dem Bogen auf das Ziel, indem du [Benutzen] gedrückt hälst. Dann springst du und lässt [Benutzen] los.

View File

@ -1,12 +0,0 @@
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutWelcome=Welcome to the target practice. Use the javelin and the bow to hit the balloon targets and make your way to the flag on the far right side.
MsgTutJavelin=Retrieve the javelins from the chest and use them to hit the first few targets. Right click on the javelin in the HUD to get some hints on how to use it.
MsgTutJumpThrow=If you have problems hitting targets with the javelin, throw it while jumping. That way you can throw the javelin a lot higher.
MsgTutBow=There is a bow in that chest. Some targets might not be reachable by throwing javelins, use the bow instead.
MsgTutHighBalloon=That balloon up high is hit more easily when shooting while jumping. Aim the bow first by holding [Use], then jump and release [Use] during the jump.

View File

@ -1 +0,0 @@
// Prevents the clonk from collecting items other than the ranged weapons. #appendto Clonk protected func RejectCollect(id objid, object obj) { if (objid != Bow && objid != Arrow && objid != Javelin) return true; return _inherited(objid, obj); }

View File

@ -1,38 +0,0 @@
// Flag goal also checks if all targets are destroyed.
#appendto Goal_ReachFlag
protected func Initialize()
{
// Set new goal description corresponding to the functionality.
SetProperty("Description", "$NewGoalDescription$", this);
return _inherited(...);
}
public func IsFulfilled()
{
// No flag, goal fulfilled.
if (!flag)
return true;
var clonk = FindObject(Find_OCF(OCF_CrewMember), Find_Distance(50, flag->GetX() - GetX(), flag->GetY() - GetY()));
if (clonk)
{
var balloon_count = ObjectCount(Find_ID(PracticeTarget));
if (balloon_count == 0)
{
// Balloon_count zero, hence goal fulfilled.
return true;
}
else
{
// Notify the player.
if (balloon_count == 1)
flag->Message("$MsgOneTargetLeft$");
else
flag->Message("$MsgTargetsLeft$", balloon_count);
}
}
// Otherwise unfulfilled.
return false;
}

View File

@ -1,9 +0,0 @@
// Ropeladder cannot be pulled in to prevent the scenario from being unfinishable.
#appendto Ropeladder_Grabber
public func IsInteractable(object clonk)
{
return false;
}

View File

@ -1,3 +0,0 @@
MsgOneTargetLeft=Noch ein Ziel zum vernichten übrig.
MsgTargetsLeft=Noch %d Ziele zum vernichten übrig.
NewGoalDescription=Das Szenario ist abgeschlossen, wenn alle Ziele zerstört sind und dein Crewmitglied die Flagge ganz rechts erreicht hat.

View File

@ -1,3 +0,0 @@
MsgOneTargetLeft=Still one target left to destroy.
MsgTargetsLeft=Still %d targets left to destroy.
NewGoalDescription=The scenario is completed if all targets are destroyed and your crew member has reached the flag on the far right side.

View File

@ -1,77 +0,0 @@
// Weapons fade out after some time, and return to their owner.
#appendto Arrow
#appendto Javelin
#appendto Bow
protected func Departure(object container)
{
if (GetID() != Bow) return;
if (container->GetOCF() & OCF_CrewMember)
AddEffect("Fade", this, 100, 1, this);
return _inherited(container, ...);
}
protected func Hit()
{
AddEffect("Fade", this, 100, 1, this);
return _inherited(...);
}
public func HitObject(object obj)
{
if(obj->GetOCF() & OCF_CrewMember)
return;
return _inherited(obj, ...);
}
protected func FxFadeTimer(object target, effect, int time)
{
if (Contained() != nil)
{
SetObjAlpha(255);
return -1;
}
if (time > 210)
target->SetObjAlpha(255 - (time - 210) * 2);
if (time >= 330)
{
target->SetObjAlpha(255);
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_container = FindObject(Find_OCF(OCF_CrewMember));
restorer->SetRestoreObject(target, to_container);
return -1;
}
return 1;
}
// Only one fade effect allowed.
protected func FxFadeEffect(string new_name, object target)
{
if (new_name == "Fade")
return -1;
return -2;
}
protected func Destruction()
{
if (Inside(GetX(), 0, LandscapeWidth()) && Inside(GetY(), 0, LandscapeHeight())) return;
var restorer = CreateObjectAbove(ObjectRestorer, 0, 0, NO_OWNER);
var x = BoundBy(GetX(), 0, LandscapeWidth());
var y = BoundBy(GetY(), 0, LandscapeHeight());
var duplicate = CreateObjectAbove(GetID(), x, y, GetOwner());
var cnt = this->~GetStackCount();
duplicate->~SetStackCount(cnt);
if (GetID() == Bow) duplicate->CreateContents(Arrow)->SetStackCount(FindContents(Arrow)->GetStackCount());
restorer->SetPosition(x, y);
var to_container = FindObject(Find_OCF(OCF_CrewMember));
restorer->SetRestoreObject(duplicate, to_container);
if (GetEffect("RestoreMode", this))
RemoveEffect("RestoreMode", this, nil, true);
}

View File

@ -1,13 +0,0 @@
[DefCore]
id=PracticeTarget
Version=6,0
Category=C4D_Vehicle
Width=25
Height=25
Offset=-12,-12
Vertices=3
VertexX=0,10,-10
VertexY=-6,6,6
VertexFriction=50
Mass=15
Rotate=1

View File

@ -1,20 +0,0 @@
material Target
{
receive_shadows on
technique
{
pass
{
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 0.640000 0.640000 0.640000 1.000000
specular 0.000000 0.000000 0.000000 1.000000 0.250000
emissive 0.000000 0.000000 0.000000 1.000000
texture_unit
{
texture target.png
tex_address_mode wrap
filtering trilinear
}
}
}
}

View File

@ -1,94 +0,0 @@
/*-- Arrow target --*/
protected func Initialize()
{
SetAction("Attach");
PlayAnimation("idle", 1, Anim_Linear(0, 0, GetAnimationLength("idle"), 1000, ANIM_Loop), Anim_Const(1000));
}
public func IsProjectileTarget(target,shooter)
{
return 1;
}
public func OnProjectileHit()
{
//Makes balloon fly away
if(GetActionTarget()!=nil)
{
GetActionTarget()->AddEffect("FlyOff",GetActionTarget(),1,1,GetActionTarget());
}
Burst();
return 1;
}
public func Burst()
{
CreateParticle("Straw", 0, 0, PV_Random(-30, 30), PV_Random(-30,30), PV_Random(30, 120), Particles_Straw(), 200);
RemoveObject();
}
public func Hit()
{
Burst();
}
protected func Tumble()
{
SetRDir(-4+Random(8));
}
func Definition(def) {
SetProperty("Name", "$Name$", def);
SetProperty("ActMap", {
Fall = {
Prototype = Action,
Name = "Fall",
Procedure = DFA_FLIGHT,
Speed = 200,
Accel = 16,
Directions = 1,
FlipDir = 0,
Length = 1,
Delay = 1,
X = 0,
Y = 0,
Wdt = 25,
Hgt = 25,
NextAction = "Fall",
StartCall = "Tumble",
},
Attach = {
Prototype = Action,
Name = "Attach",
Procedure = DFA_ATTACH,
Directions = 1,
FlipDir = 0,
Length = 40,
Delay = 15,
X = 0,
Y = 0,
Wdt = 25,
Hgt = 25,
NextAction = "Attach",
// Animation = "idle",
},
Float = {
Prototype = Action,
Name = "Float",
Procedure = DFA_FLOAT,
Directions = 1,
FlipDir = 0,
Length = 1,
Delay = 1,
X = 0,
Y = 0,
Wdt = 25,
Hgt = 25,
NextAction = "FLOAT",
},
}, def);}

View File

@ -1 +0,0 @@
Name=Zielscheibe

View File

@ -1,13 +0,0 @@
[DefCore]
id=BurntBalloon
Version=6,0
Category=C4D_Vehicle
Width=64
Height=64
Offset=-32,-32
Vertices=2
VertexX=0,0
VertexY=10,-32
VertexFriction=100
Mass=15
Rotate=1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -1,41 +0,0 @@
/*-- Burnt Target Balloon --*/
protected func Initialize()
{
SetRDir(-2+Random(4));
SetAction("Fall");
SetComDir(COMD_None);
AddEffect("Fade",this,1,1,this);
}
func FxFadeTimer(object target, effect, int time)
{
if(GetYDir()<10) SetYDir(GetYDir()+1);
SetClrModulation(RGBa(255-(time/2),255-(time/2),-(time/2),255-time));
if(time>=255)
{
RemoveObject();
return -1;
}
return 1;
}
func Definition(def) {
SetProperty("Name", "Burnt Balloon", def);
SetProperty("ActMap", {
Fall = {
Prototype = Action,
Name = "Fall",
Procedure = DFA_FLOAT,
Directions = 1,
FlipDir = 0,
Length = 1,
Delay = 1,
X = 0,
Y = 0,
Wdt = 64,
Hgt = 64,
NextAction = "Fall",
},
}, def);}

View File

@ -1,12 +0,0 @@
[DefCore]
id=TargetBalloon
Version=6,0
Category=C4D_Vehicle
Width=64
Height=64
Offset=-32,-32
Vertices=2
VertexX=0,0
VertexY=32,-32
VertexFriction=50
Mass=15

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,20 +0,0 @@
material Target_Balloon
{
receive_shadows on
technique
{
pass
{
ambient 0.500000 0.500000 0.500000 2.000000
diffuse 0.640000 0.640000 0.640000 2.000000
specular 0.000000 0.000000 0.000000 1.000000 12.500000
emissive 0.000000 0.000000 0.000000 1.000000
texture_unit
{
texture target_balloon.png
tex_address_mode wrap
filtering trilinear
}
}
}
}

View File

@ -1,69 +0,0 @@
/*-- Target Balloon --*/
local ysin;
protected func Initialize()
{
ysin = 0;
SetAction("Float");
SetComDir(COMD_None);
AddEffect("Float",this,1,1,this);
}
func FxFloatTimer(object target, effect, int time)
{
if(ysin >= 360) ysin = 0;
if(ysin <= 360)
{
++ysin;
}
target->SetYDir(Sin(ysin,2));
}
public func IsProjectileTarget(target,shooter)
{
return 1;
}
public func OnProjectileHit()
{
CreateParticle("Air", 0, -10, PV_Random(-30, 30), PV_Random(-30,30), PV_Random(30, 120), Particles_Air(), 10);
Sound("BalloonPop");
RemoveObject();
}
func FxFlyOffTimer(target, effect, time)
{
RemoveEffect("Float", this);
RemoveEffect("HorizontalMoving", this);
if(GetYDir()>-30)
{
SetYDir(GetYDir()-1);
}
if(GetY()<0)
{
RemoveObject();
return -1;
}
}
func Definition(def) {
SetProperty("Name", "$Name$", def);
SetProperty("ActMap", {
Float = {
Prototype = Action,
Name = "Float",
Procedure = DFA_FLOAT,
Directions = 1,
FlipDir = 0,
Length = 1,
Delay = 1,
X = 0,
Y = 0,
Wdt = 64,
Hgt = 64,
NextAction = "Float",
},
}, def);}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,2 +0,0 @@
DE:Fernkampfwaffen
US:Ranged Weapons

View File

@ -1,18 +0,0 @@
{\rtf1\ansi\deff1\adeflang1025
{\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;}{\f1\fswiss\fprq0\fcharset0 Arial;}{\f2\fswiss\fprq2\fcharset0 Arial;}{\f3\fswiss\fprq0\fcharset0 Arial;}{\f4\fnil\fprq2\fcharset0 MS Mincho;}{\f5\fnil\fprq2\fcharset0 Tahoma;}{\f6\fnil\fprq0\fcharset0 Tahoma;}}
{\colortbl;\red0\green0\blue0;\red128\green128\blue128;}
{\stylesheet{\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang4105\loch\f1\fs24\lang4105\snext1 Normal;}
{\s2\sb240\sa120\keepn\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af5\afs28\lang255\ltrch\dbch\af4\langfe255\hich\f2\fs28\lang4105\loch\f2\fs28\lang4105\sbasedon1\snext3 Heading;}
{\s3\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang4105\loch\f1\fs24\lang4105\sbasedon1\snext3 Body Text;}
{\s4\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang4105\loch\f1\fs24\lang4105\sbasedon3\snext4 List;}
{\s5\sb120\sa120\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ai\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang4105\i\loch\f1\fs24\lang4105\i\sbasedon1\snext5 caption;}
{\s6\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af6\afs24\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs24\lang4105\loch\f1\fs24\lang4105\sbasedon1\snext6 Index;}
}
{\info{\creatim\yr0\mo0\dy0\hr0\min0}{\revtim\yr0\mo0\dy0\hr0\min0}{\printim\yr0\mo0\dy0\hr0\min0}{\comment StarWriter}{\vern6800}}\deftab720
{\*\pgdsctbl
{\pgdsc0\pgdscuse195\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\pgdscnxt0 Standard;}}
{\*\pgdscno0}\paperh15840\paperw12240\margl1800\margr1800\margt1440\margb1440\sectd\sbknone\pgwsxn12240\pghsxn15840\marglsxn1800\margrsxn1800\margtsxn1440\margbsxn1440\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
\pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs20\lang255\ab\ltrch\dbch\af1\langfe255\hich\f1\fs20\lang1033\b\loch\f1\fs20\lang1033\b {\rtlch \ltrch\loch\f1\fs20\lang1033\i0\b Melee Weapons}
\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs20\lang255\ab\ltrch\dbch\af1\langfe255\hich\f1\fs20\lang1033\b\loch\f1\fs20\lang1033\b
\par \pard\plain \ltrpar\s1\cf0{\*\hyphen2\hyphlead2\hyphtrail2\hyphmax0}\rtlch\af1\afs16\lang255\ltrch\dbch\af1\langfe255\hich\f1\fs16\lang1033\loch\f1\fs16\lang1033 {\rtlch \ltrch\loch\f1\fs16\lang1033\i0\b0 This tutorial shows you how to use the basic melee weapons, the sword and the shield. After a short introduction, you will fight against computer controlled opponents.}
\par }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,35 +0,0 @@
[Head]
Icon=5
Title=Tutorial04
Version=6,0
MaxPlayer=1
Difficulty=4
[Definitions]
Definition1=Objects.ocd
[Player1]
Crew=Clonk=1
[Player2]
Crew=Clonk=1
[Player3]
Crew=Clonk=1
[Player4]
Crew=Clonk=1
[Landscape]
Vegetation=Seaweed=4;Fern=4
VegetationLevel=70
InEarth=Rock=1;Gold=1;Loam=1
InEarthLevel=20,0,0,100
Sky=Clouds2
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

@ -1,354 +0,0 @@
/*--
Tutorial 04
Author: Maikel
In this tutorial the player will be familiarized with some melee weapons.
--*/
static guide; // guide object.
protected func Initialize()
{
// Environment
PlaceGrass(85);
Cloud->Place(15);
var time = CreateObject(Environment_Time);
time->SetTime(22*60);
time->SetCycleSpeed(0);
Sound("WindLoop", true, 40, nil, 1);
// Goal: Melee, all opponents must be killed.
CreateObject(Goal_Melee, 0, 0, NO_OWNER);
// First section: Some straw targets to be struck with the sword.
CreateObjectAbove(SwordTarget, 190, 673, NO_OWNER)->SetR(RandomX(-10, 10));
CreateObjectAbove(SwordTarget, 280, 619, NO_OWNER)->SetR(RandomX(-10, 10) + 180);
CreateObjectAbove(SwordTarget, 340, 649, NO_OWNER)->SetR(RandomX(-10, 10));
CreateObjectAbove(SwordTarget, 430, 603, NO_OWNER)->SetR(RandomX(-10, 10) + 180);
// Gate that opens if all targets have been destroyed.
var gate = CreateObjectAbove(StoneDoor, 556, 640, NO_OWNER);
DrawMaterialQuad("Tunnel-brickback", 552, 638, 552, 640, 560, 640, 560, 638);
AddEffect("IntOpenGate", gate, 100, 5);
// Script player as opponent.
SetMaxPlayer(2);
CreateScriptPlayer("$NameOpponent$", RGB(40,30,20), nil, CSPF_FixedAttributes);
// Second section: gate that can be opened with a spin wheel.
var gate = CreateObjectAbove(StoneDoor, 1220, 552, NO_OWNER);
DrawMaterialQuad("Tunnel-brickback", 1216, 550, 1216, 552, 1224, 552, 1224, 550);
var wheel = CreateObjectAbove(SpinWheel, 1140, 568, NO_OWNER);
wheel->SetStoneDoor(gate);
// Third section: gate that can be opened with a spin wheel.
var gate = CreateObjectAbove(StoneDoor, 1852, 504, NO_OWNER);
DrawMaterialQuad("Tunnel-brickback", 1848, 502, 1848, 504, 1856, 504, 1856, 502);
var wheel = CreateObjectAbove(SpinWheel, 1782, 352, NO_OWNER);
wheel->SetStoneDoor(gate);
// Chest with some extra weapons.
var chest = CreateObjectAbove(Chest, 2260, 632, NO_OWNER);
chest->CreateContents(Club);
// Dialogue options -> repeat round.
SetNextMission("Tutorial.ocf\\Tutorial04.ocs", "$MsgRepeatRound$", "$MsgRepeatRoundDesc$");
return;
}
// Gamecall from goals, set next mission.
protected func OnGoalsFulfilled()
{
// Achievement star
GainScenarioAchievement("Done");
// Dialogue options -> next round.
SetNextMission("Tutorial.ocf\\Tutorial05.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}
protected func InitializePlayer(int plr)
{
// Initiate script player.
if (GetPlayerType(plr) == C4PT_Script)
return InitializeScriptPlayer(plr);
// Standard player zoom for tutorials.
SetPlayerViewLock(plr, true);
SetPlayerZoomByViewRange(plr, 600, nil, PLRZOOM_Direct);
// Clonk to position and add restore effect.
var clonk = GetCrew(plr, 0);
clonk->SetPosition(30, 620);
var effect = AddEffect("ClonkRestore", clonk, 100, 10);
effect.var1 = 30;
effect.var2 = 620;
// Clonk starts with sword and shield.
clonk->CreateContents(Sword);
clonk->CreateContents(Shield);
// Create tutorial guide, add messages, show first.
guide = CreateTutorialGuide(plr);
guide->AddGuideMessage("$MsgTutWelcome$");
guide->ShowGuideMessage(0);
AddEffect("TutorialStrawTargets", nil, 100, 5);
return;
}
private func InitializeScriptPlayer(int plr)
{
// Remove old crew.
var index = 0;
while (GetCrew(plr, index))
{
GetCrew(plr, index)->RemoveObject();
index++;
}
// Second section: Weak opponent with javelins.
var spearman1 = CreateObjectAbove(Clonk, 1050, 592, plr);
spearman1->MakeCrewMember(plr);
spearman1->SetMaxEnergy(40);
spearman1->CreateContents(Javelin);
spearman1->AI_GuardArea(800, 400, 400, 250);
AddEffect("IntContentRemoval", spearman1, 100, 0);
spearman1->AddEnergyBar();
// Third section: Two opponents in a tower.
// Lower part: a weak spearman.
var spearman2 = CreateObjectAbove(Clonk, 1756, 432, plr);
spearman2->MakeCrewMember(plr);
spearman2->SetMaxEnergy(40);
spearman2->CreateContents(Javelin);
spearman2->AI_GuardArea(1350, 200, 500, 400);
AddEffect("IntContentRemoval", spearman2, 100, 0);
spearman2->AddEnergyBar();
// Upper part: a normal bowman.
var bowman = CreateObjectAbove(Clonk, 1732, 352, plr);
bowman->MakeCrewMember(plr);
bowman->SetMaxEnergy(45);
bowman->CreateContents(Bow)->CreateContents(Arrow);
bowman->AI_GuardArea(1350, 200, 500, 400);
AddEffect("IntContentRemoval", bowman, 100, 0);
bowman->AddEnergyBar();
// Fourth section: Opponent with sword and shield.
var swordman = CreateObjectAbove(Clonk, 2250, 360, plr);
swordman->MakeCrewMember(plr);
swordman->SetMaxEnergy(60);
swordman->CreateContents(Shield);
swordman->CreateContents(Sword);
swordman->AI_GuardArea(2050, 300, 300, 100);
AddEffect("IntContentRemoval", swordman, 100, 0);
swordman->AddEnergyBar();
return;
}
// Opens the gate if all sword targets are destroyed.
global func FxIntOpenGateTimer(object target)
{
if (ObjectCount(Find_ID(SwordTarget)) == 0)
{
// Open gate.
target->OpenDoor();
return -1;
}
return 1;
}
/*-- Guide control --*/
global func FxTutorialStrawTargetsTimer()
{
if (ObjectCount(Find_ID(SwordTarget)) == 0)
{
guide->AddGuideMessage("$MsgTutGateOpened$");
AddEffect("TutorialReachedSecondSection", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedSecondSectionTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 635, 450)))
{
guide->AddGuideMessage("$MsgTutFirstEnemy$");
AddEffect("TutorialCompletedSecondSection", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialCompletedSecondSectionTimer()
{
var opponent = FindObject(Find_OCF(OCF_CrewMember), Find_InRect(800, 400, 400, 250), Find_Not(Find_Owner(0)));
var crew = FindObject(Find_OCF(OCF_CrewMember), Find_Owner(0));
if (!opponent || (crew && crew->GetX() > 1220))
{
guide->AddGuideMessage("$MsgTutOpenGate$");
AddEffect("TutorialReachedThirdSection", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedThirdSectionTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 1370, 545)))
{
guide->AddGuideMessage("$MsgTutTwoEnemies$");
AddEffect("TutorialCompletedThirdSection", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialCompletedThirdSectionTimer()
{
var opponent = FindObject(Find_OCF(OCF_CrewMember), Find_InRect(1350, 200, 500, 400), Find_Not(Find_Owner(0)));
var crew = FindObject(Find_OCF(OCF_CrewMember), Find_Owner(0));
if (!opponent || (crew && crew->GetX() > 1860 && crew->GetY() > 460))
{
guide->AddGuideMessage("$MsgTutMoveOn$");
AddEffect("TutorialReachedFourthSection", nil, 100, 5);
return -1;
}
return 1;
}
global func FxTutorialReachedFourthSectionTimer()
{
if (FindObject(Find_OCF(OCF_CrewMember), Find_Distance(40, 2200, 420)))
{
guide->AddGuideMessage("$MsgTutLastEnemy$");
return -1;
}
return 1;
}
protected func OnGuideMessageShown(int plr, int index)
{
// Show first four targets with the arrow.
if (index == 0)
for (var target in FindObjects(Find_ID(SwordTarget)))
{
var angle = RandomX(-45, 45);
if (target->GetY() > 620)
angle = RandomX(135, 225);
TutArrowShowTarget(target, angle, 24);
}
// Show way through gate.
if (index == 1)
{
TutArrowShowPos(570, 625, 90);
TutArrowShowPos(610, 540, 315);
}
// Show opponent in second section.
if (index == 2)
{
var target = FindObject(Find_OCF(OCF_CrewMember), Find_InRect(800, 400, 400, 250), Find_Not(Find_Owner(0)));
if (target)
TutArrowShowTarget(target);
}
// Show spin wheel.
if (index == 3)
{
var wheel = FindObject(Find_ID(SpinWheel), Find_Distance(40, 1140, 560));
if (wheel)
TutArrowShowTarget(wheel);
}
// Show two opponents in third section.
if (index == 4)
{
for (var target in FindObjects(Find_OCF(OCF_CrewMember), Find_InRect(1350, 200, 500, 400), Find_Not(Find_Owner(0))))
if (target)
TutArrowShowTarget(target);
}
// Show spin wheel and way to last opponent.
if (index == 5)
{
var wheel = FindObject(Find_ID(SpinWheel), Find_Distance(40, 1782, 341));
if (wheel)
TutArrowShowTarget(wheel);
TutArrowShowPos(1970, 490, 90);
}
// Show opponent in fourth section.
if (index == 6)
{
var target = FindObject(Find_OCF(OCF_CrewMember), Find_InRect(1900, 250, 400, 200), Find_Not(Find_Owner(0)));
if (target)
TutArrowShowTarget(target);
}
return;
}
protected func OnGuideMessageRemoved(int plr, int index)
{
TutArrowClear();
return;
}
/*-- Clonk restoring --*/
global func FxClonkRestoreTimer(object target, effect, int time)
{
// Respawn to new location if reached second section.
if (Distance(target->GetX(), target->GetY(), 635, 450) < 40)
{
effect.var1 = 635;
effect.var2 = 450;
}
// Respawn to new location if reached third section.
if (Distance(target->GetX(), target->GetY(), 1370, 545) < 40)
{
effect.var1 = 1370;
effect.var2 = 545;
}
// Respawn to new location if reached fourth section.
if (Distance(target->GetX(), target->GetY(), 1910, 485) < 40)
{
effect.var1 = 1910;
effect.var2 = 485;
}
return 1;
}
// 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.var1;
var to_y = effect.var2;
// Respawn new clonk.
var plr = target->GetOwner();
var clonk = CreateObjectAbove(Clonk, 0, 0, plr);
clonk->GrabObjectInfo(target);
SetCursor(plr, clonk);
clonk->DoEnergy(100000);
// Transfer contents.
var transfer, index = target->ContentsCount();
while (transfer = target->Contents(--index))
transfer->Enter(clonk);
restorer->SetRestoreObject(clonk, nil, to_x, to_y, 0, "ClonkRestore");
}
return 1;
}
/*-- Item restoring --*/
// Removes content on death.
global func FxIntContentRemovalStop(object target, effect, int reason)
{
if (reason != 4)
return 1;
for (var obj in FindObjects(Find_Container(target)))
obj->RemoveObject();
return 1;
}

View File

@ -1,17 +0,0 @@
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
MsgNextTutorialDesc=Die nächste Lernrunde starten.
MsgRepeatRound=&Runde wiederholen
MsgRepeatRoundDesc=Diese Runde wiederholen.
# Tutorial messages
MsgTutWelcome=Willkommen, du wurdest mit einem Schwert und einem Schild ausgerüstet. Benutze das Schwert um die vier Strohpuppen zu zerschlagen. Du kannst auch zuschlagen, während du springst.
MsgTutGateOpened=Nicht schlecht! Deine nächste Herausforderung ist, gegen einen lebendigen Gegner zu kämpfen. Gehe durch das Tor oben auf dem Felsen, doch sei vorsichtig wenn du dich deinem Gegner näherst.
MsgTutFirstEnemy=Ein Gegner wirft Speere auf dich, benutze das Schild um seine Angriffe aus der Entfernung abzuwehren und schlage ihn mit dem Schwert, wenn du in seiner Nähe bist.
MsgTutOpenGate=Nicht wirklich eine Herausforderung, oder? Fass die Winde an und drücke [Hoch] um das Tor zu öffnen und zu den nächsten Gegnern zu gelangen.
MsgTutTwoEnemies=Dort sind zwei Feinde, die diesen Turm bewachen. Weiche ihren Angriffen aus der Ferne aus oder benutze dein Schild und laufe in den Turm um sie von hinten anzugreifen.
MsgTutMoveOn=Gut gemacht! Öffne das Tor mit der Winde im Turm und geh weiter zum letzten Gegner.
MsgTutLastEnemy=Der letzte Gegner ist da drüben. Er ist mit einem Schwert und einem Schild ausgerüstet. Besiege ihn, um die Lernrunde erfolgreich zu beenden.
#Opponent Name
NameOpponent=Tutorial Gegner

View File

@ -1,17 +0,0 @@
# Dialogue options
MsgNextTutorial=&Next tutorial
MsgNextTutorialDesc=Start the next tutorial scenario.
MsgRepeatRound=&Repeat this round
MsgRepeatRoundDesc=Restart this scenario.
# Tutorial messages
MsgTutWelcome=Welcome, you have been equipped with sword and shield. Use the sword to strike the four straw men, you can strike with the sword while jumping.
MsgTutGateOpened=Not bad, but the next challenge will be a living opponent. Move through the gate up the ledge, be careful when approaching your enemy.
MsgTutFirstEnemy=There is an enemy throwing javelins, use the shield to block his ranged attacks, and strike him with the sword from nearby.
MsgTutOpenGate=No challenge at all, right? Grab the spin wheel and press [Up] to open the gate and advance to the next enemies.
MsgTutTwoEnemies=There are two enemies occupying that tower. Evade or block their ranged attacks and make it into the tower to attack them from behind.
MsgTutMoveOn=Well done! Open the gate with the wheel in tower, and move on to the last enemy.
MsgTutLastEnemy=The last enemy is over there, he is equipped with sword and shield. Eliminate him to complete this tutorial.
#Opponent Name
NameOpponent=Tutorial Opponent

View File

@ -1,13 +0,0 @@
[DefCore]
id=SwordTarget
Version=6,0
Category=C4D_Vehicle
Width=12
Height=20
Offset=-6,-10
Vertices=5
VertexX=0,0,-4,4,0
VertexY=-9,9,-2,-2,13
VertexFriction=50
Mass=15
Rotate=1

Some files were not shown because too many files have changed in this diff Show More