Merge branch 'master' into shapetextures

shapetextures
Tobias Zwick 2016-01-15 22:38:12 +01:00
commit 9c597047f1
57 changed files with 406 additions and 294 deletions

View File

@ -26,5 +26,5 @@ SET(C4XVER1 7)
SET(C4XVER2 0)
# Set this variable to any string for pre-release versions, like "alpha" or
# "rc1". Don't supply a value for release versions.
SET(C4VERSIONEXTRA "alpha0")
# "rc1". Don't supply a value (FALSE) for release versions.
SET(C4VERSIONEXTRA FALSE)

View File

@ -210,13 +210,13 @@ public func OnBuySelection(int callback_idx)
else
{
// Regular item: Buy into inventory
// Get rid of current item (unless it's the same we already want)
// Get rid of current item
if (last_item)
SellItem(last_item);
var item;
// Create item
if (!item) item = cursor->CreateContents(entry.item);
if (!item) return false;
cursor->Switch2Items(cursor->GetItemPos(last_item), cursor->GetItemPos(item));
if (last_item) SellItem(last_item);
if (!item) return false; // ???
// for later sale
item.GidlValue = entry.cost;
// ammo up!

View File

@ -25,10 +25,10 @@ static shared_wealth_remainder;
func Initialize()
{
// dev stuff (we will forget to turn this off for release)
AddMsgBoardCmd("waveinfo", "GameCall(\"ShowWaveInfo\")");
AddMsgBoardCmd("next", "GameCall(\"SetNextWave\", \"%s\")");
AddMsgBoardCmd("nextwait", "GameCall(\"SetNextWave\", \"%s\", true)");
AddMsgBoardCmd("scrooge", "GameCall(\"DoWealthForAll\", 1000000000)");
//AddMsgBoardCmd("waveinfo", "GameCall(\"ShowWaveInfo\")");
//AddMsgBoardCmd("next", "GameCall(\"SetNextWave\", \"%s\")");
//AddMsgBoardCmd("nextwait", "GameCall(\"SetNextWave\", \"%s\", true)");
//AddMsgBoardCmd("scrooge", "GameCall(\"DoWealthForAll\", 1000000000)");
// Init door dummies
g_doorleft.dummy_target = g_doorleft->CreateObject(DoorDummy, -6, 6);
g_doorright.dummy_target = g_doorright->CreateObject(DoorDummy, +6, 6);

View File

@ -27,10 +27,10 @@ static shared_wealth_remainder;
func Initialize()
{
// dev stuff (we will forget to turn this off for release)
AddMsgBoardCmd("waveinfo", "GameCall(\"ShowWaveInfo\")");
AddMsgBoardCmd("next", "GameCall(\"SetNextWave\", \"%s\")");
AddMsgBoardCmd("nextwait", "GameCall(\"SetNextWave\", \"%s\", true)");
AddMsgBoardCmd("scrooge", "GameCall(\"DoWealthForAll\", 1000000000)");
//AddMsgBoardCmd("waveinfo", "GameCall(\"ShowWaveInfo\")");
//AddMsgBoardCmd("next", "GameCall(\"SetNextWave\", \"%s\")");
//AddMsgBoardCmd("nextwait", "GameCall(\"SetNextWave\", \"%s\", true)");
//AddMsgBoardCmd("scrooge", "GameCall(\"DoWealthForAll\", 1000000000)");
// Wealth shown at all time
GUI_Controller->ShowWealth();
// static variable init

View File

@ -1022,29 +1022,32 @@ func FxIntSwimTimer(pTarget, effect, iTime)
// Swimming
else if(!GBackSemiSolid(0, -5))
{
var percent = GetAnimationPosition(GetRootAnimation(5))*200/GetAnimationLength("Swim");
percent = (percent%100);
if( percent < 40 )
if (GBackLiquid()) // re-check water background before effects to prevent waves in wrong color
{
if(iTime%5 == 0)
var percent = GetAnimationPosition(GetRootAnimation(5)) * 200 / GetAnimationLength("Swim");
percent = (percent % 100);
if (percent < 40)
{
var phases = PV_Linear(0, 7);
if (GetDir() == 1) phases = PV_Linear(8, 15);
var color = GetAverageTextureColor(GetTexture(0, 0));
var particles =
if (iTime % 5 == 0)
{
Size = 16,
Phase = phases,
CollisionVertex = 750,
OnCollision = PC_Die(),
R = (color >> 16) & 0xff,
G = (color >> 8) & 0xff,
B = (color >> 0) & 0xff,
Attach = ATTACH_Front,
};
CreateParticle("Wave", 0, -4, (RandomX(-5,5)-(-1+2*GetDir())*4)/4, 0, 16, particles);
var phases = PV_Linear(0, 7);
if (GetDir() == 1) phases = PV_Linear(8, 15);
var color = GetAverageTextureColor(GetTexture(0, 0));
var particles =
{
Size = 16,
Phase = phases,
CollisionVertex = 750,
OnCollision = PC_Die(),
R = (color >> 16) & 0xff,
G = (color >> 8) & 0xff,
B = (color >> 0) & 0xff,
Attach = ATTACH_Front,
};
CreateParticle("Wave", 0, -4, (RandomX(-5, 5) - (-1 + 2 * GetDir()) * 4) / 4, 0, 16, particles);
}
Sound("Liquids::Swim?");
}
Sound("Liquids::Splash?");
}
// Animation speed by X
if(effect.animation_name != "Swim")

View File

@ -510,8 +510,12 @@ public func OnInteractionMenuOpen(object menu)
{
_inherited(menu, ...);
var surrounding = CreateObject(Helper_Surrounding);
surrounding->InitFor(this, menu);
// Allow picking up stuff from the surrounding only if not in a container itself.
if (!Contained())
{
var surrounding = CreateObject(Helper_Surrounding);
surrounding->InitFor(this, menu);
}
}
/* Mesh transformations */

View File

@ -63,7 +63,7 @@ private func OpenWeaponMenu(object clonk)
menu = CreateObject(MenuStyle_Default, nil, nil, clonk->GetOwner());
menu->SetPermanent();
menu->SetTitle(Format("$MsgWeapon$", time / 36));
clonk->SetMenu(menu);
clonk->SetMenu(menu, true);
for (var weapon in weapons)
menu->AddItem(weapon, weapon->GetName(), nil, this, "OnWeaponSelected", weapon);

View File

@ -147,7 +147,16 @@ func FxIntCheckObjectsStart(target, effect fx, temp)
func FxIntCheckObjectsTimer(target, effect fx)
{
var new_objects = FindObjects(Find_AtRect(target->GetX() - 5, target->GetY() - 10, 10, 20), Find_NoContainer(), Find_Layer(target->GetObjectLayer()),
// If contained, leave the search area intact, because otherwise we'd have to pass a "nil" parameter to FindObjects (which needs additional hacks).
// This is a tiny bit slower (because the area AND the container have to be checked), but the usecase of contained Clonks is rare anyway.
var container_restriction = Find_NoContainer();
var container = target->Contained();
if (container)
{
container_restriction = Find_Or(Find_Container(container), Find_InArray([container]));
}
var new_objects = FindObjects(Find_AtRect(target->GetX() - 5, target->GetY() - 10, 10, 20), container_restriction, Find_Layer(target->GetObjectLayer()),
// Find all containers and objects with a custom menu.
Find_Or(Find_Func("IsContainer"), Find_Func("HasInteractionMenu")),
// Do not show objects with an extra slot though - even if they are containers. They count as items here.

View File

@ -167,7 +167,7 @@ public func OnRopeBreak()
/*-- Grapple rope controls --*/
public func FxIntGrappleControlControl(object target, proplist effect, int ctrl, int x, int y, int strength, repeat, release)
public func FxIntGrappleControlControl(object target, proplist effect, int ctrl, int x, int y, int strength, repeat, release)
{
// Cancel this effect if clonk is now attached to something.
if (target->GetProcedure() == "ATTACH")
@ -337,9 +337,20 @@ public func FxIntGrappleControlTimer(object target, proplist effect, int time)
return FX_OK;
}
private func Trans_RotX(int rotation, int ox, int oy)
public func FxIntGrappleControlOnCarryHeavyPickUp(object target, proplist effect, object heavy_object)
{
return Trans_Mul(Trans_Translate(-ox, -oy), Trans_Rotate(rotation, 0, 0, 1), Trans_Translate(ox, oy));
// Remove the control effect when a carry-heavy object is picked up.
// The rope will then be drawn in automatically.
RemoveEffect(nil, target, effect);
return;
}
public func FxIntGrappleControlRejectCarryHeavyPickUp(object target, proplist effect, object heavy_object)
{
// Block picking up carry-heavy objects when this clonk is hanging on a rope.
if (rope->PullObjects())
return true;
return false;
}
public func FxIntGrappleControlStop(object target, proplist effect, int reason, int tmp)
@ -361,6 +372,11 @@ public func FxIntGrappleControlStop(object target, proplist effect, int reason,
return FX_OK;
}
private func Trans_RotX(int rotation, int ox, int oy)
{
return Trans_Mul(Trans_Translate(-ox, -oy), Trans_Rotate(rotation, 0, 0, 1), Trans_Translate(ox, oy));
}
public func RejectWindbagForce() { return true; }
// Only the grappler is stored.

View File

@ -18,10 +18,24 @@ protected func RejectCollect(id objid, object obj)
// Carry heavy only gets picked up if none held already
if(this.inventory.force_collection && obj->~IsCarryHeavy())
{
// collection of that object magically disabled?
// Collection of that object magically disabled?
if(GetEffect("NoCollection", obj)) return true;
// Do callbacks to control effects to see if the effect blocks picking up a carry heavy object.
var block_carry_heavy = false;
var count = GetEffectCount("*Control*", this), control_effect;
while (count--)
{
control_effect = GetEffect("*Control*", this, count);
if (control_effect && EffectCall(this, control_effect, "RejectCarryHeavyPickUp", obj))
{
block_carry_heavy = true;
break;
}
}
if(IsCarryingHeavy())
// Don't pick up if already carrying a heavy object or if it is blocked.
if (IsCarryingHeavy() || block_carry_heavy)
{
CustomMessage("$TxtHandsFull$", this, this->GetController(), 0, 0, 0xff0000);
return true;
@ -120,6 +134,15 @@ public func CarryHeavy(object target)
// Update attach stuff
this->~OnSlotFull();
// Do callbacks to control effects for this clonk that a carry heavy object has been picked up.
var count = GetEffectCount("*Control*", this), control_effect;
while (count--)
{
control_effect = GetEffect("*Control*", this, count);
if (control_effect)
EffectCall(this, control_effect, "OnCarryHeavyPickUp", target);
}
return true;
}

View File

@ -378,6 +378,10 @@ func GetInteractableObjects(array sort)
if (interactable->GetOCF() & OCF_Grab)
{
var priority = 19;
// not if swimming because the grab command cannot really fix that (unlike e.g. scale/hangle)
if (GetProcedure() == "SWIM")
if (!this->~CanGrabUnderwater(interactable)) // unless it's a special clonk that can grab underwater. It needs to define a callback then.
continue;
// high priority if already grabbed
if (GetActionTarget() == interactable) priority = 0;

View File

@ -407,6 +407,7 @@ func Ejection(object obj)
for(var c = 0; c < ContentsCount(); ++c)
{
var o = Contents(c);
if (!o) continue; // safety in case callbacks delete some objects
if(o->~IsCarryHeavy())
continue;
if (GetItemPos(o) == nil)

View File

@ -619,8 +619,10 @@ protected func FxProcessProductionStart(object target, proplist effect, int temp
// But first hold the production until the power system gives it ok.
// Always register the power request even if power need is zero. The
// power network handles this correctly and a producer may decide to
// change its power need during production.
RegisterPowerRequest(this->PowerNeed());
// change its power need during production. Only do this for producers
// which are power consumers.
if (this->~IsPowerConsumer())
RegisterPowerRequest(this->PowerNeed());
return FX_OK;
}
@ -659,8 +661,6 @@ protected func FxProcessProductionTimer(object target, proplist effect, int time
// Add effect interval to production duration.
effect.Duration += effect.Interval;
//Log("Production in progress on %i, %d frames, %d time", effect.Product, effect.Duration, time);
// Check if production time has been reached.
if (effect.Duration >= ProductionTime(effect.Product))
return FX_Execute_Kill;
@ -673,21 +673,20 @@ protected func FxProcessProductionStop(object target, proplist effect, int reaso
if (temp)
return FX_OK;
// no need to consume power anymore
// always unregister even if there's a queue left to process, because OnNotEnoughPower relies on it
// and it gives other producers the chance to get some power
UnregisterPowerRequest();
// No need to consume power anymore. Always unregister even if there's a queue left to
// process, because OnNotEnoughPower relies on it and it gives other producers the chance
// to get some power. Do not unregister if this producer does not consumer power.
if (this->~IsPowerConsumer())
UnregisterPowerRequest();
if (reason != 0)
return FX_OK;
// Callback to the producer.
//Log("Production finished on %i after %d frames", effect.Product, effect.Duration);
this->~OnProductionFinish(effect.Product);
// Create product.
var product = CreateObject(effect.Product);
OnProductEjection(product);
return FX_OK;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -31,7 +31,7 @@ Stickinthemud - Clonk (http://www.freesound.org/people/Stickinthemud/sounds/27
Toby Knowles - Fanfare (http://www.freesound.org/people/tobyk/sounds/26198/)
ERH - WindLoop (http://www.freesound.org/people/ERH/sounds/34338/)
TicTacShutUp - Click (http://www.freesound.org/people/TicTacShutUp/sounds/406/), UI::Confirmed (modified)
CGEffex - Splash1-3 (http://www.freesound.org/people/CGEffex/sounds/98335/)
CGEffex - Splash1-3 (http://www.freesound.org/people/CGEffex/sounds/98335/), Swim1-3 (modified by Sven2 from Splash1-3)
Mirors_ - Pshshsh (http://www.freesound.org/people/Mirors_/sounds/81205/)
juskiddink - SoftHit1 (http://www.freesound.org/people/juskiddink/sounds/108617/)
jenc - BlastMetal (http://www.freesound.org/people/jenc/sounds/511/)

View File

@ -620,7 +620,7 @@ IDS_MSG_TEAMDIST_HOST=Per &Host
IDS_MSG_TEAMDIST_NONE=&Keine
IDS_MSG_TEAMDIST_RND=&Zufällig
IDS_MSG_TEAMDIST_RNDINV=Zufällig und &Unsichtbar
IDS_MSG_TOOFEWPLAYERS=Dieses Szenario ist auf mindestens %i Teilnehmer ausgelegt. Bitte in der Spielerauswahl die entsprechenden Teilnehmer auswählen und aktivieren.
IDS_MSG_TOOFEWPLAYERS=Dieses Szenario ist auf mindestens %i Teilnehmer ausgelegt. Bitte starte das Szenario als Netzwerkspiel und warte auf weitere Teilnehmer aus dem Netzwerk.
IDS_MSG_TOOFEWPLAYERSNET=Der Spielmodus dieses Szenarios ist auf mehr Spieler ausgelegt, als auf diesem Rechner aktiviert sind. Beim Start der Runde muss auf weitere Teilnehmer aus dem Netzwerk gewartet werden.
IDS_MSG_TOOMANYPLAYERS=Dieses Szenario ist auf maximal %i Teilnehmer ausgelegt.
IDS_MSG_TOPICIN=Thema in %s: %s

View File

@ -620,7 +620,7 @@ IDS_MSG_TEAMDIST_HOST=by &Host
IDS_MSG_TEAMDIST_NONE=&none
IDS_MSG_TEAMDIST_RND=&random
IDS_MSG_TEAMDIST_RNDINV=&surprise random!
IDS_MSG_TOOFEWPLAYERS=This scenario is designed for a minimum of %i players. Please go to the Player Selection dialog and activate the participants for this round.
IDS_MSG_TOOFEWPLAYERS=This scenario is designed for a minimum of %i players. Please start the round as a network game and wait for additional players to join.
IDS_MSG_TOOFEWPLAYERSNET=This scenario is set for more participants than are activated on this computer. On start, you will have to wait for additional players to join from the network.
IDS_MSG_TOOMANYPLAYERS=This scenario is designed for a maximum of %i players.
IDS_MSG_TOPICIN=Topic in %s: %s

View File

@ -145,11 +145,15 @@ private func InitializeMenu()
};
var prop_text =
{
Target = this,
ID = 2,
Left = Format("0%%%s", ToEmString(10 * menu_height + text_margin)),
Right = Format("100%%%s", ToEmString(- 5 * menu_height - text_margin)),
Text = nil,
// Wrap the text again to scroll only one window instead of also scrolling e.g. the portrait.
text =
{
Target = this,
ID = 2,
Text = nil,
}
};
prop_next =
{
@ -218,8 +222,8 @@ private func ShowGuideMenu(int index)
private func UpdateGuideMenu(string guide_message, bool has_next, bool has_prev, bool has_close)
{
// Update the text message entry.
prop_menu.text.Text = guide_message;
GuiUpdate(prop_menu.text, id_menu, prop_menu.text.ID, this);
prop_menu.text.text.Text = guide_message;
GuiUpdateText(guide_message, id_menu, prop_menu.text.text.ID, this);
// Update the next/close button.
if (has_next || has_close)

View File

@ -1,7 +1,7 @@
Carry & Construct
Tragen & Bauen
Roger has lead you to Wipfville, a small village full of wipfs. Finally he has found his friends and is happy. However, the villagers of Wipfville are less so. Their village has been under attack by an evil faction threatening to capture their wipf population. The first attack they could fend off, but has lead to lots of damage to the village. You decide to stay and help the villagers, because the Roger can make a lot of friends here.
Rüdiger hat dich zu einem Ort namens Wipfdort geführt, ein kleines Dorf voller Wipfe. Endlich hat er seine Freunde gefunden und ist fröhlich. Die Dorfbewohner von Wipfdorf aber brauchen Hilfe. Ihr Dorf wurde von einer dunklen Fraktion angegriffen, die gedroht hat, all ihre Wipfe zu entführen. Den ersten Angriff konnten Sie abwehren, aber ihr Dorf wurde dabei zerstört. Du hast dich entschlossen, den Bewohnern zu helfen, da Rüdiger sich hier wohl zu fühlen scheint.
Goal: Help the villagers rebuild there village.
Ziel: Hilf den Dorfbewohner ihr Dorf wieder aufzubauen.
Tutorial explains: constructing buildings, basic materials (metal, wood, rock) and mining.
Lernrunde erklärt: Errichten von Gebäuden, Standardmaterial (Metall, Holz, Stein) und Bergbau.

View File

@ -538,7 +538,7 @@ protected func OnGuideMessageShown(int plr, int index)
if (index == 4)
{
var clonk = FindObject(Find_OCF(OCF_CrewMember), Find_Owner(plr));
var rock = FindObject(Find_ID(Rock), Sort_Distance(clonk->GetX(), clonk->GetY()));
var rock = FindObject(Find_ID(Rock), Find_NoContainer(), Find_OCF(OCF_InFree), Find_Distance(60, clonk->GetX(), clonk->GetY()), Sort_Distance(clonk->GetX(), clonk->GetY()));
TutArrowShowTarget(rock);
}
// Show the sawmill construction site.

View File

@ -13,7 +13,7 @@ MsgTutorialWipfville=Auf dem Wegweiser steht Wipfdorf - wahrscheinlich der Grund
MsgTutorialFindRock=Okay, wir müssen etwas Stein finden um das Sägewerk da fertig zu stellen. Lass uns einen Blick in die Minen des Dorfes werfen. Vielleicht finden wir da etwas.
MsgTutorialDynamiteLorry=Da steht eine Lore voll mit Dynamit! Du kommst an den Inhalt von vielen Fahrzeugen und Gebäuden heran, indem du [%s] drückst um das Interaktionsmenü zu öffnen. Du kannst mit einem Klick Gegenstände hin- und hertauschen. Hol dir etwas Dynamit!
MsgTutorialBlastRock=Perfekt, mit Dynamit kannst du den Stein an der Decke sprengen. Stein wird als Baumaterial gebraucht. Hangel dich an den Stein und wähle das Dynamit aus. Drücke dann die linke Maustaste einmal um das Dynamit zu zünden und dann ziele auf den Stein und klicke noch einmal um das Dynamit in die Wand zu stecken. Dann hau ab!
MsgTutorialPickUpRock=Schön! Sammel drei Steine, so dass du das Sägewerk fertig bauen kannst.
MsgTutorialPickUpRock=Schön! Sammle drei Steine ein, so dass du damit das Sägewerk fertig bauen kannst. Beachte, dass einige Stein durch die Explosion in der Lore gelandet sein könnten.
MsgTutorialSawmill=Geh hoch zur Baustelle und tue die drei Steine mit dem Interaktionsmenü in die Baustelle (drücke dazu [%s]). Die Baustelle wird automatisch vollendet, sobald alles Baumaterial da ist.
MsgTutorialTalkToFireman=Die Dorfbewohner brauchen noch mehr Hilfe. Rede mit dem Feuerwehrmann neben der verbrannten Hütte und mit dem Bauarbeiter beim Mineneingang.
MsgTutorialConstructFlagpole=Hol dir den Hammer aus der Kiste und benutze ihn um das Baumenü zu öffnen. Im Baumenü kannst du ein Gebäude auswählen und danach platzieren. Wähle die Flagge aus und platziere sie an der markierten Position.

View File

@ -13,7 +13,7 @@ MsgTutorialWipfville=This guidepost reads Wipfville, probably the reason why Rog
MsgTutorialFindRock=Okay, we need to find some rock to finish the construction of this sawmill over here. Let's have a look at the mines of this village, maybe we can find something there.
MsgTutorialDynamiteLorry=There is a lorry filled with dynamite. You can access the contents of many vehicles and buildings by pressing [%s], which opens the interaction menu. You can interchange items between different containers by clicking them. Grab a stick of dynamite!
MsgTutorialBlastRock=Perfect, with dynamite you can blast the rock at the ceiling, rock is used as a construction material. Hang onto the rock material and select one of the dynamite sticks, press the left mouse button once to fuse it and press it another time in the direction of the rock to stick it into the wall. Then jump off and run!
MsgTutorialPickUpRock=Great, pick up three pieces of rock, so that you can finish the sawmill construction.
MsgTutorialPickUpRock=Great, pick up three pieces of rock, so that you can finish the sawmill construction. Note that the explosion could have flung some pieces of rock into the lorry.
MsgTutorialSawmill=Go up to the sawmill construction site and put the three pieces of rock into construction site via the interaction menu (press [%s] to open). If all building materials are put into a construction site the building will be constructed automatically.
MsgTutorialTalkToFireman=The villagers seem to need a little more help, talk to the fireman standing next to the burned hut and to the builder next to the mine entrance.
MsgTutorialConstructFlagpole=Get the hammer from the chest, then use it to open the construction menu. From the construction menu you can select a building you wish to construct, select the flagpole and place it at the indicated position.

View File

@ -1,41 +1,41 @@
# Dialogue: Lumberjack
DlgLumberjackHello=Hello I am %s, the lumberjack of this small village.
DlgLumberjackReply=My name is %s, you seem sad.
DlgLumberjackSawmill=Yes, indeed. My sawmill got destroyed and I can't find any rock to rebuild it. Can you help me?
DlgLumberjackRock=Yes, I'll find you some rock.
DlgLumberjackWellDone=Thanks a lot, for constructing the sawmill. Can I do anything for you?
DlgLumberjackFavor=Actually you can, I need wood, do you happen to have an axe?
DlgLumberjackMines=No, I don't, but I have dropped my axe in the mines when I was hiding there during the attack.
DlgLumberjackLook=Ok, I'll have a look.
DlgLumberjackHello=Hallo, ich bin %s, die Holzfällerin des Dorfes.
DlgLumberjackReply=Ich heiße %s. Du schaust traurig aus.
DlgLumberjackSawmill=Ja, das stimmt. Mein Sägewerk wurde zerstört und ich finde keine Steine, um es wieder aufzubauen. Kannst du mir helfen?
DlgLumberjackRock=Ja, ich werde dir Steine finden.
DlgLumberjackWellDone=Danke vielmals, dass du das Sägewerk aufgebaut hast. Kann ich irgendwas für dich tun?
DlgLumberjackFavor=Tatsächlich kannst du das, ja. Ich brauche Holz, du hast nicht zufällig eine Axt?
DlgLumberjackMines=Nein, leider nicht. Ich habe meine Axt in der Mine fallen gelassen, als ich mich während des Angriffes versteckt habe.
DlgLumberjackLook=Na gut, dann suche ich die Axt.
# Dialogue: Fireman
DlgFiremanOutOfWay=<c ff0000>Fire!</c> Out of my way!
DlgFiremanLastFire=Phew that was the last fire!
DlgFiremanGoodJob=Good job, have you been under attack?
DlgFiremanEvilGuys=Yes our village has been, the evil guys took some of our wipfs.
DlgFiremanFurryFriend=That is bad, I hope they won't take my little furry friend! How can I help?
DlgFiremanFlagpole=We need to construct a new flag pole, to reconnect the power supply in our village.
DlgFiremanOutOfWay=<c ff0000>Feuer!</c> Aus dem Weg!
DlgFiremanLastFire=Ein Glück, das war das letzte Feuer!
DlgFiremanGoodJob=Gut gemacht. Wurdet ihr angegriffen?
DlgFiremanEvilGuys=Ja, das ganze Dorf wurde attackiert. Die bösen Typen haben einige unserer Wipfe gestohlen.
DlgFiremanFurryFriend=Das ist schlimm. Ich hoffe, dass sie meinen kleinen Freund nicht bekommen! Kann ich irgendwie helfen?
DlgFiremanFlagpole=Wir müssen eine neue Flagge errichten, damit die Stromzufuhr wieder hergestellt ist.
# Dialogue: Builder
DlgBuilderHello=Hi there, my name is %s and I am a builder.
DlgBuilderReply=Then you have lots of work. Do you need a hand?
DlgBuilderFlagpole=Yes, can you construct a flagpole over here?
DlgBuilderWhyHere=Of course, but why over here?
DlgBuilderConnect=Because then the flagpole will provide a power connection between the wind generator and the elevator.
DlgBuilderHello=Hallo du, mein Name ist %s. Ich bin hier der Baumeister.
DlgBuilderReply=Dann hast du sicherlich viel zu tun. Brauchst du Hilfe?
DlgBuilderFlagpole=Ja, kannst du hier drüben vielleicht eine Flagge errichten?
DlgBuilderWhyHere=Na klar, aber warum gerade dort drüben?
DlgBuilderConnect=Weil die Flagge dann Strom zwischen dem Windkraftwerk und dem Fahrstuhl leiten kann.
# Dialogue: Farmer
DlgFarmerHello=Hi, is my wipf safe here?
DlgFarmerYesSafe=Yes it is, I will look after it. Are you helping us rebuild?
DlgFarmerRebuild=I am!
DlgFarmerHello=Huhu, ist mein Wipf sicher hier?
DlgFarmerYesSafe=Ja, das ist er. Ich bewache ihn. Hilfst du uns beim Wiederaufbau?
DlgFarmerRebuild=Das tue ich!
# Dialogue: Lookout
DlgLookoutHello=Hello, why are you standing over here?
DlgLookoutProtecting=I am on the lookout for attacks from the evil faction.
DlgLookoutMusket=Is that why you are carrying a musket?
DlgLookoutNoChance=Yes, but I don't think I have any chance against those evil guys.
DlgLookoutNoShow=Then let's hope they don't come again.
DlgLookoutHello=Hallo, warum stehst du hier oben?
DlgLookoutProtecting=Dies ist mein Posten. Ich halte Ausschau, für den Fall, dass die dunkle Fraktion wieder angreift.
DlgLookoutMusket=Trägst du deshalb die Muskete?
DlgLookoutNoChance=Ja, aber ich denke nicht, dass ich gegen diese Typen eine Chance habe.
DlgLookoutNoShow=Dann lass uns hoffen, dass sie nicht wiederkommen!
# Dialogue: Village head
DlgVillageHeadHello=I am the head of this village.
DlgVillageHeadHere=Why are you down here?
DlgVillageHeadOverview=I am making an overview of the damages. Come back later, I'll have an assignment for you.
DlgVillageHeadHello=Hallo. Ich bin das Dorfoberhaupt von Wipfdorf.
DlgVillageHeadHere=Warum bist du denn hier unten?
DlgVillageHeadOverview=Ich schaue mir die Beschädigungen hier an. Komm doch später noch einmal vorbei, dann habe ich sicher eine Aufgabe für dich.

View File

@ -1,7 +1,7 @@
Bergbauwerkzeuge
Wipfville has been reconstructed, but the villagers have used all their building materials in the process. To get back to their normal day lives the need their tools back again for mining, farming, wood cutting and other activities. Help the villagers with producing some new tools.
Wipfdorf wurde wieder aufgebaut, aber die Dorfbewohner haben ihr gesamtes Material dafür verbraucht. Damit sie wieder ihre Arbeit aufnehmen können, brauchen sie neue Werkzeuge für den Bergbau, Landwirtschaft, Holzproduktion und andere Aufgaben. Hilf den Dorfbewohnern neue Werkzeuge herzustellen.
Ziel: Produziere neuen Werkzeugen.
Ziel: Produziere neue Werkzeuge.
Lernrunde erklärt: Produktion, Lehm, Spitzhacke.
Lernrunde erklärt: Produktion, Lehmbrücken, Spitzhacke.

View File

@ -1,6 +1,6 @@
# Goal Description
MsgGoalName=Tool Production
MsgGoalDescription=Help the villagers produce tools essential to operate their village.
MsgGoalName=Werkzeugproduktion
MsgGoalDescription=Hilf den Dorfbewohnern Werkzeuge herzustellen, die sie dringend brauchen.
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
@ -9,18 +9,18 @@ MsgRepeatRound=&Lernrunde wiederholen
MsgRepeatRoundDesc=Diese Lernrunde wiederholen.
# Tutorial messages
MsgTutorialVillageHead=The buildings in Wipfville have been repaired again, but it seems the villagers are lacking tools to continue with their work. Descend into the mines and talk to the village head to let him know you want to help out. Take the elevator down into the mines, stand on the elevator case and press [%s] to grab the case, then press [%s] and [%s] to go up and down.
MsgTutorialLoamProduction=To move the lorry to the elevator case you need a piece of loam to cross this gap over here. Go to the foundry and grab the bucket, to produce loam you need water and earth. Earth is collected in the bucket whilst you are digging with your shovel.
MsgTutorialFillBucket=Now that you have both the shovel and the bucket in your inventory you can dig out earth. Dig out some earth to the right of the foundry and the bucket will fill itself automatically.
MsgTutorialGetBarrel=Good, the bucket is filled, put it back into the foundry and now take out the barrel.
MsgTutorialFillBarrel=The barrel is a heavy object which needs to be carried with both hands. While carrying the barrel you can't use any of your other inventory items. The barrel will fill itself automatically with once it is submerged in liquid. Find a body of water and swim in it with the barrel, then put the barrel back in the foundry.
MsgTutorialProduceLoam=Now produce a piece of loam (in the interaction menu opened with [%s]) and take it back to the lorry.
MsgTutorialMakeLoamBridge=Now stand as close to the edge as possible and close the gap with loam. Select the loam in your inventory and press [%s] in the direction you want to construct the bridge. Then grab the lorry with [%s] and move it to the workshop.
MsgTutorialProducePickaxe=Transfer the contents of the lorry to the workshop using the interaction menu (open with [%s]). Select the lorry and the workshop and then click the \"transfer all\" button in the middle of the menu. Then produce a pickaxe in the workshop, the rest of the materials will be used by the village head to produce other tools.
MsgTutorialMineOre=Take the pickaxe and make your way to the ore mine below the foundry. Hack out three pieces of ore. The pickaxe is an alternative to explosives and can be used to mine harder materials like iron ore or gold. To use the pickaxe select it and point your mouse cursor are solid material close to the clonk, then press [%s].
MsgTutorialPutOre=Collect the three pieces of ore and put them into the foundry. Then talk to the village head.
MsgTutorialCompleted=Well, you helped the village head and completed this tutorial. But the villagers seem in trouble and Rüdiger got kidnapped... Time to make plans against the evil faction in the next tutorial.
MsgTutorialVillageHead=Die Gebäude in Wipfdorf wurden zwar repariert, aber damit die Bewohner von Wipfdorf wieder arbeiten können, brauchen sie Werkzeuge. Steige in die Minen hinab und berichte mit dem Dorfoberhaupt, dass du helfen willst. Nimm den Fahrstuhl, um damit in die Minen herunterzufahren. Stell dich dafür auf den Fahrstuhlkorb und drücke [%s] um diesen anzufassen, danach [%s] und [%s] um hinauf oder hinunter zu fahren.
MsgTutorialLoamProduction=Um die Lore zum Fahrstuhlkorb zu schaffen, brauchst du ein Stück Lehm um damit diese Lücke zu schließen. Lehm kann mit Hilfe des Hochofens hergestellt werden, doch brauchst du dafür Erde und Wasser. Nimm den Eimer aus dem Hochofen, wenn du dort bist. Ein Eimer wird automatisch mit Erde gefüllt, wenn du die Schaufel zum Graben benutzt.
MsgTutorialFillBucket=Mit der Schaufel und dem Eimer im Inventar kannst du jetzt Erde ausgraben. Benutze die Schaufel gleich rechts vom Hochofen und der Eimer wird sich automatisch mit Erde füllen.
MsgTutorialGetBarrel=Gut, der Eimer ist jetzt gefüllt. Hole jetzt das Fass aus dem Hochofen.
MsgTutorialFillBarrel=Ein Fass ist ein schweres Objekt und muss deswegen mit beiden Händen getragen werden. Während du ein solches bei dir hast, kannst du keine anderen Gegenstände aus deinem Inventar benutzen. Das Fass wird automatisch mit Wasser gefüllt, wenn es untergetaucht wird. Finde etwas Wasser und spring mit dem Fass hinein. Bringe das Fass danach zum Hochofen zurück.
MsgTutorialProduceLoam=Stelle jetzt ein Stück Lehm her (benutze dazu das Interaktionsmenü, welches du mit [%s] öffnen kannst) und bringe es zur Lore.
MsgTutorialMakeLoamBridge=Stelle dich nun so nah wie möglich an die Kante und schließe die Lücke mit Lehm. Wähle dazu den Lehmklumpen in deinem Inventar aus und drücke [%s] in die Richtung, in die du eine Lehmbrücke errichten willst. Fasse danach die Lore mit [%s] an und schiebe sie zur Werkstatt.
MsgTutorialProducePickaxe=Mit dem Interaktionsmenü kannst du den Inhalt der Lore in die Werkstatt verschieben (öffne das Menü mit [%s]). Wähle im Menü auf der einen Seite die Lore und auf der anderen die Werkstatt aus und drücke dann den \"Alles verschieben\"-Knopf in der Mitte des Menüs. Stelle danach eine Spitzhacke her (ebenfalls im Interaktionsmenü). Die restlichen Materialien brauchen die Dorfbewohner zur Herstellung anderer Werkzeuge.
MsgTutorialMineOre=Nimm die Spitzhacke mit und laufe dann zurück zum Erz in der Mine. Schürfe drei Erzklumpen mit der Spitzhacke. Die Spitzhacke kann alternativ statt Sprengstoffen zum Abbau von harten Materialien, wie Eisenerz oder Gold, verwendet werden. Um die Spitzhacke zu verwenden, ziele mit der Maus auf festen Material nahe des Clonks und halte [%s] gedrückt.
MsgTutorialPutOre=Sammle die drei Erzklumpen ein und bringe sie zum Hochofen. Sprich danach mit dem Dorfoberhaupt.
MsgTutorialCompleted=Du hast den Dorfbewohnern geholfen und damit diese Lernrunde abgeschlossen. Aber die Dorfbewohner wurden angegriffen und Rüdiger entführt...Zeit, in der nächsten Lernrunde Pläne gegen die dunkle Fraktion zu schmieden.
# Wipf name
WipfName=Rüdiger
WipfDescription=Your furry little friend.
WipfDescription=Dein felliger kleiner Freund.

View File

@ -17,7 +17,7 @@ MsgTutorialFillBarrel=The barrel is a heavy object which needs to be carried wit
MsgTutorialProduceLoam=Now produce a piece of loam (in the interaction menu opened with [%s]) and take it back to the lorry.
MsgTutorialMakeLoamBridge=Now stand as close to the edge as possible and close the gap with loam. Select the loam in your inventory and press [%s] in the direction you want to construct the bridge. Then grab the lorry with [%s] and move it to the workshop.
MsgTutorialProducePickaxe=Transfer the contents of the lorry to the workshop using the interaction menu (open with [%s]). Select the lorry and the workshop and then click the \"transfer all\" button in the middle of the menu. Then produce a pickaxe in the workshop, the rest of the materials will be used by the village head to produce other tools.
MsgTutorialMineOre=Take the pickaxe and make your way to the ore mine below the foundry. Hack out three pieces of ore. The pickaxe is an alternative to explosives and can be used to mine harder materials like iron ore or gold. To use the pickaxe select it and point your mouse cursor are solid material close to the clonk, then press [%s].
MsgTutorialMineOre=Take the pickaxe and make your way to the ore mine below the foundry. Hack out three pieces of ore. The pickaxe is an alternative to explosives and can be used to mine harder materials like iron ore or gold. To use the pickaxe select it and point your mouse cursor at solid material close to the clonk, then press [%s].
MsgTutorialPutOre=Collect the three pieces of ore and put them into the foundry. Then talk to the village head.
MsgTutorialCompleted=Well, you helped the village head and completed this tutorial. But the villagers seem in trouble and Roger got kidnapped... Time to make plans against the evil faction in the next tutorial.

View File

@ -1,63 +1,63 @@
# Dialogue: Lumberjack
DlgLumberjackForest=Where are all the trees?
DlgLumberjackCutDown=I have processed them all into logs for the reconstruction of our village.
DlgLumberjackNoWood=So you ran out of wood completely?
DlgLumberjackSupply=No we have a small supply in the mines, hidden from the evil faction.
DlgLumberjackForest=Wo sind die Bäume hin?
DlgLumberjackCutDown=Die habe ich alle zu Holz verarbeitet, damit wir unser Dorf wieder aufbauen können.
DlgLumberjackNoWood=Das heißt, dass jetzt kein Holz mehr übrig ist?
DlgLumberjackSupply=Doch. Wir haben einen kleinen Vorrat tief in der Mine, versteckt vor der dunklen Fraktion.
# Dialogue: Fireman
DlgFiremanWhereBarrel=Hi, where did you leave that big barrel you used to extinguish fires?
DlgFiremanFoundry=I put it back into the foundry below, where we use it to produce loam, which requires water.
DlgFiremanWhereWater=Where do you get the water from then?
DlgFiremanDive=Oh, I just dive into any small lake I see with the barrel. There are some underground in the mines we have.
DlgFiremanWhereBarrel=Hey, wo hast du dieses große Fass gelassen, mit dem du die Feuer gelöscht hast?
DlgFiremanFoundry=Ich habe es nach unten in die Mine gebracht, wo wir Lehm herstellen. Die Herstellung von Lehm benötigt Wasser.
DlgFiremanWhereWater=Woher bekommst du das Wasser?
DlgFiremanDive=Oh, ich tauche in jeden See den ich finden kann. Im Untergrund in den Minen sind ein paar.
# Dialogue: Builder
DlgBuilderThanks=Thank you for constructing that flagpole.
DlgBuilderNoProblem=No problem.
DlgBuilderPowerConnection=With that flagpole the elevator is not connected to the power sources of our village, as you can see.
DlgBuilderThanks=Danke, dass du die Flagge gebaut hast.
DlgBuilderNoProblem=Kein Problem.
DlgBuilderPowerConnection=Wie du siehst, ist durch die Flagge der Fahrstuhl jetzt mit der Energieversorgung des Dorfes verbunden.
# Dialogue: Farmer
DlgFarmerWipf=Hi, how is my wipf doing?
DlgFarmerDoingWell=It is getting along with our wipfs very well.
DlgFarmerPleasure=That is a pleasure to hear!
DlgFarmerWipf=Hey, wie geht es meinem Wipf?
DlgFarmerDoingWell=Er versteht sich gut mit unseren Wipfen.
DlgFarmerPleasure=Das hört sich gut an!
# Dialogue: Lookout
DlgLookoutNewAttack=Hello, any signs for a new attack?
DlgLookoutNo=No, not at the moment.
DlgLookoutNewAttack=Hallo, gibt es Anzeichen für einen Angriff?
DlgLookoutNo=Nein, derzeit nicht.
# Dialogue: Village head
DlgVillageHeadThank=Thank you for your help with repairing our buildings. Are you willing to help more?
DlgVillageHeadHelp=Yes, of course, as long as my wipf can stay with the other wipfs. How can I help?
DlgVillageHeadTools=Well, we are lacking tools and I was about to take this lorry with materials to the workshop to produce them, but you see there is a problem.
DlgVillageHeadProblem=What problem?
DlgVillageHeadGap=There is this gap which we need to cross with the lorry to make it to the elevator shaft.
DlgVillageHeadFix=Ah I see, I'll fix that for you!
DlgVillageHeadPickaxe=Cool, maybe you can then produce a pickaxe and mine some iron ore for us? We are a bit low on explosives.
DlgVillageHeadYes=Yes, no problem.
DlgVillageHeadPutOre=Please put three pieces of iron ore in the foundry.
DlgVillageHeadThanks=Thanks a lot for helping out again.
DlgVillageHeadThank=Danke, dass du uns geholfen hast, die Gebäude zu reparieren. Möchtest du noch mehr helfen?
DlgVillageHeadHelp=Ja, natürlich. Wenn mein Wipf länger bei euren Wipfen bleiben darf. Wie kann ich helfen?
DlgVillageHeadTools=Gut. Uns fehlen Werkzeuge. Ich wollte gerade diese Lore mit Material zur Werkstatt bringen. Aber siehst du das Problem?
DlgVillageHeadProblem=Was für ein Problem?
DlgVillageHeadGap=Diese Lücke hier müssen wir überwinden, damit wir die Lore zum Fahrstuhlschacht schieben können.
DlgVillageHeadFix=Ich verstehe. Das schaffe ich!
DlgVillageHeadPickaxe=Toll. Kannst du vielleicht danach eine Spitzhacke herstellen und etwas Erz abbauen? Uns fehlt leider Sprengstoff für einen schnelleren Abbau.
DlgVillageHeadYes=Ja klar, kein Problem.
DlgVillageHeadPutOre=Bitte bring die drei Erzklumpen in den Hochofen.
DlgVillageHeadThanks=Danke noch mal für deine Hilfe.
# Sequence: Outro dialogue
MsgVillageHeadNoise=What is that noise?
MsgFarmerAirplanes=Oh no that must be the airplanes of the evil faction again.
MsgEvilLeaderItsUs=Yes, it's us again! Resistance is futile, so tell your guard to stand down!
MsgVillageHeadWhy=Why are you here again? You just destroyed our village...
MsgEvilLeaderWipfs=I started a new hobby, I collect wipfs now.
MsgVillageHeadManiac=You are a maniac, can't you leave us alone?
MsgEvilLeader=I'll leave you be after I kidnapped all your wipfs.
MsgPlayerDontTakeWipf=Please, don't take Roger...
MsgEvilLeaderBegging=Oh little kid, begging is useless, my men are not prone to crying. Your wipf will be mine and it is best to forget about him, cause you won't see him again.
MsgEvilLeaderBye=Okay, we are done here. Time to say goodbye to your pet friends... muhaha
MsgVillageHeadNoise=Was ist das für ein Geräusch?
MsgFarmerAirplanes=Oh nein! Das sind bestimmt die Flugzeuge der dunklen Fraktion!
MsgEvilLeaderItsUs=Ja, wir sind es wieder. Widerstand ist zwecklos. Gebt auf!
MsgVillageHeadWhy=Wieso seid ihr zurückgekommen? Ihr habt unser Dorf doch bereits einmal zerstört...
MsgEvilLeaderWipfs=Ich habe jetzt ein neues Hobby: Wipfe sammeln.
MsgVillageHeadManiac=Du bist völlig verrückt! Kannst du uns nicht in Ruhe lassen?
MsgEvilLeader=Ich verschwinde gleich wieder, aber erst will ich alle Wipfe haben.
MsgPlayerDontTakeWipf=Bitte nehmt Rüdiger nicht!
MsgEvilLeaderBegging=Ach, du Kleinkind. Betteln hilft dir nicht, meine Leute sind immun gegenüber Geweine. Dein Wipf gehört mir und am besten vergisst du, dass es ihn jemals gab. Wiedersehen wirst du ihn nicht!
MsgEvilLeaderBye=Gut, wir sind hier fertig. Sagt euren Tierchen auf Wiedersehen...muhaha
# Sequence: Outro messages
MsgHenchman3DropMusket=You better drop that musket!
MsgLookoutSurrender=Yes, I surrender.
MsgHenchman1RunGirl=Run girl, or we shoot!
MsgHenchman2Wipfs=Your wipfs are ours now, muhaha.
MsgFarmerComment=You are evil.
MsgKidnapperGotThem=We have got them!
MsgHenchman1SeeYa=I am off now!
MsgHenchman2SeeYa=Bye!
MsgHenchman3SeeYa=See Ya!
MsgHenchmanGotWipf1=I got one!
MsgHenchmanGotWipf2=Wipf ahoy!
MsgHenchmanGotWipf3=It'll be a nice ride.
MsgHenchman3DropMusket=Lass die Muskete fallen!
MsgLookoutSurrender=Ich gebe auf!
MsgHenchman1RunGirl=Verschwinde Mädchen oder wir schießen!
MsgHenchman2Wipfs=Eure Wipfe gehören uns, muhaha.
MsgFarmerComment=Ihr seid böse.
MsgKidnapperGotThem=Wir haben sie.
MsgHenchman1SeeYa=Ich bin jetzt weg.
MsgHenchman2SeeYa=Tschüss!
MsgHenchman3SeeYa=Bis bald!
MsgHenchmanGotWipf1=Ich hab einen.
MsgHenchmanGotWipf2=Wipf kommt!
MsgHenchmanGotWipf3=Keine Sorge, das wird ein sanfter Flug.

View File

@ -13,7 +13,7 @@ DlgFiremanDive=Oh, I just dive into any small lake I see with the barrel. There
# Dialogue: Builder
DlgBuilderThanks=Thank you for constructing that flagpole.
DlgBuilderNoProblem=No problem.
DlgBuilderPowerConnection=With that flagpole the elevator is not connected to the power sources of our village, as you can see.
DlgBuilderPowerConnection=With that flagpole the elevator is now connected to the power sources of our village, as you can see.
# Dialogue: Farmer
DlgFarmerWipf=Hi, how is my wipf doing?

View File

@ -1,7 +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.
Archibald, das Dorfoberhaupt, hat dich auf seine Reise zu einem benachbarten Dorf mitgenommen. Dort möchte er Hilfe suchen. Auf dem Weg trefft ihr auf jemanden, der sein Haus durch Räuber verloren hat. Um zu dem anderen Dorf zu gelangen, müsst ihr die Höhle durchqueren, in denen die Räuber Zuflucht gesucht haben.
Ziel: Battle your way through the robber's cave.
Ziel: Kämpfe dich durch die Räuberhöhle.
Lernrunde erklärt: Waffen wie Bogen, Speed, Schwert und Schild.

View File

@ -36,7 +36,7 @@ protected func OnGoalsFulfilled()
// Achievement: Tutorial completed.
GainScenarioAchievement("TutorialCompleted", 3);
// Dialogue options -> next round.
SetNextMission("Tutorials.ocf\\Tutorial06.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
SetNextMission("Tutorials.ocf\\Tutorial07.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}

View File

@ -1,6 +1,6 @@
# Goal Description
MsgGoalName=Reach the village
MsgGoalDescription=Traverse the cave and reach the village on the other side together with the village head.
MsgGoalName=Erreiche das nächste Dorf
MsgGoalDescription=Durchquere zusammen mit dem Dorfoberhaupt die Höhle bis zum nächsten Dorf.
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
@ -9,10 +9,10 @@ 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 his 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.
MsgTutorialTalkToHead=Du musst die Höhle betreten und dich den Räubern stellen. Sprich zunächst mit dem Dorfoberhaupt, vielleicht hat er Ideen, die dir helfen können.
MsgTutorialNotHelpful=Das war nicht sonderlich hilfreich, aber immerhin hast du eine Waffe. Diese kannst du erst mal an den Strohpuppen im Kornfeld testen. Drücke [%s] um die Axt zu benutzen und die Strohpuppen zu zerstören.
MsgTutorialFirstEnemy=Der erste Räuber in der Höhle hat Pfeil und Bogen und kann dich aus der Ferne bekämpfen. Blindlings voranstürmen, wird dir nicht helfen. Vielleicht findest du eine Möglichkeit, ihn besser anzugreifen. Sollte dein Clonk beim Kampf umkommen, gibt es einen Respawn so oft wie nötig.
MsgTutorialOnRespawn=Hm, das hat nicht so gut funktioniert. Vielleicht kannst du die Kiste da drüben erreichen, wenn du durch die Erde gräbst. Nimm, was auch immer in der Kiste ist zum Kämpfen. Manche Waffen können geworfen werden. Ziele einfach mit der Maus in die Richtung, in die du werfen möchtest.
MsgTutorialKilledFirst=Gut gemacht, der ist erledigt. Nimm dir seine Waffe und gehe tiefer in die Höhle, wo sicher noch mehr Räuber sind. Mit dem Bogen lassen sich Feinde aus großer Entfernung bekämpfen. Ziele einfach mit der Maus in die Richtung, in die du schießen willst.
MsgTutorialKilledSecond=Und noch einer weg! So langsam kriegst du den Dreh raus. Dieser hier hat etwas Brot fallen gelassen. Nimm das Brot und drücke [%s] um es zu essen. So füllst deine Lebensenergie wieder auf. Laufe danach weiter den Pfad entlang.
MsgTutorialCompleted=Ausgezeichnet! Jetzt bist du ein ausgebildeter Kämpfer. Es gibt noch weitere Waffen in diesem Spiele, die du in späteren Lernrunden oder anderen Szenarien ausprobieren kannst.

View File

@ -1,29 +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.
DlgHomelessFood=Hast du etwas zu essen für einen armen Mann?
DlgHomelessNo=Nein, ich habe nichts dabei.
DlgHomelessShame=Schade.
DlgHomelessYes=Ja, hier ist etwas %s.
DlgHomelessReward=Vielen Dank! Ich habe diese alte Keule hier, vielleicht hilft sie dir gegen die Räuber.
# 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.
DlgVillageHeadHowToAttack=Wie soll ich denn alleine gegen die Räuber kämpfen?
DlgVillageHeadNoIdea=Vom Kämpfen habe ich leider keine Ahnung. Ich kann dir diese Axt hier geben, aber eine gute Waffe ist das nicht.
DlgVillageHeadThanks=Na gut, danke trotzdem. Ich versuche mein Bestes.
DlgVillageHeadGoodLuck=Viel Glück! Sag Bescheid, wenn die Höhle sicher ist.
# 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.
MsgVillageHeadAnnoyed=Die dunkle Fraktion ist zu weit gegangen. Wir müssen zurückschlagen.
MsgClonkHowToStrike=Wie sollen wir zurückschlagen? Das sind so viele und die sind bis an die Zähne bewaffnet.
MsgVillageHeadOrganize=Wir müssen uns mit anderen Dörfern zusammenschließen. Deshalb sind wir jetzt unterwegs zu einem.
MsgClonkPoorGuy=Schau dir diesen armen Kerl an. Seine Hütte ist abgebrannt. Was ist passiert?
MsgHomelessRobbers=Räuber haben mir alles genommen und mein Haus in Brand gesetzt.
MsgClonkWhere=Wie schrecklich. Weißt du, wo die Räuber jetzt sind?
MsgHomelessLocation=Die verstecken sich in der Höhle, wo sonst auch.
MsgVillageHeadTeachThem=Nun, %s hier wird denen eine Lektion erteilen.
MsgHomelessHappy=Das wäre toll.
# 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!
MsgClonkSafe=%s, es ist jetzt sicher hier unten!
MsgVillageHeadComing=Gut, ich bin auf dem Weg.
MsgVillageHeadTakeElevator=Lass uns mit dem Fahrstuhl zur Oberfläche fahren.
MsgVillageHeadPassedCave=Dank dir sind wir sicher durch diese Höhle gekommen und können nun sicher zum nächsten Dorf gelangen!

View File

@ -1,7 +1,7 @@
Airborne Mining
Luftbergbau
Up high in the skies, far above the stronghold of the evil wipf faction, one of the villagers has an airbase. The head of Wipfville has asked you to help him mine gems from the sky islands over there. The clunkers can help the villagers hire some men in their fight against the evil faction.
Weit oben im Himmel, weit über der Feste der Dunkelwipf-Fraktion, hat einer der Dorfbewohner eine Himmelsbasis. Das Dorfoberhaupt hat dich gebeten, beim Abbau der Edelsteine auf diesen Inseln zu helfen. Die dadurch erwirtschafteten Clunker können helfen, einige Clonks zum Kampf geben die Dunkelwipf-Fraktion anzuwerben.
Goal: Mine some gems from the sky islands.
Ziel: Baue Edelsteine von den Himmelsinseln ab.
Tutorial explains: Airship, rope ladder, selling valuables.
Lernrunde erklärt: Luftschiff, Strickleiter, Verkauf von Wertsachen.

View File

@ -257,8 +257,8 @@ global func FxTutorialFindStalactiteTimer(object target, proplist effect, int ti
global func FxTutorialAirshipParkedTimer(object target, proplist effect, int timer)
{
var clonk = FindObject(Find_ID(Clonk), Find_Distance(30, 700, 230));
var airship = FindObject(Find_ID(Airship), Find_Distance(30, 700, 230));
var clonk = FindObject(Find_ID(Clonk), Find_Distance(30, 688, 200));
var airship = FindObject(Find_ID(Airship), Find_Distance(30, 688, 200));
if (clonk && airship)
{
var plr = clonk->GetOwner();
@ -299,7 +299,7 @@ protected func OnGuideMessageShown(int plr, int index)
{
// Show airship parking space.
if (index == 1)
TutArrowShowPos(700, 240, 135);
TutArrowShowPos(688, 220, 135);
// Show dynamite placement location.
if (index == 3)
TutArrowShowPos(800, 200, 60);

View File

@ -1,6 +1,6 @@
# Goal Description
MsgGoalName=Edelsteine abbauen
MsgGoalDescription=Find and mine the gem stalactite, then sell the gems at the flagpole.
MsgGoalDescription=Finde den Edelstein-Stalaktit, baue Edelsteine ab und verkaufe sie bei der Flagge.
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
@ -9,9 +9,9 @@ MsgRepeatRound=&Lernrunde wiederholen
MsgRepeatRoundDesc=Diese Lernrunde wiederholen.
# Tutorial messages
MsgTutorialFindRubies=You are high up in the sky in an area with several sky islands. Talk to the pilot for some advice about the area and then take the airship and find the ruby stalactite hanging from one of the islands. You can grab the airship with [%s] and then steer it with %s.
MsgTutorialParkAirship=Ah you found the ruby stalactite. Now it is time to blast it to gems! Park your airship in front of the rope ladders over there.
MsgTutorialLadderJump=Good, now your companion will control the airship and you can jump to the ruby stalactite. Jump towards a hanging rope ladder and you will automatically grab it. You can switch sides or let go of the ladder by pressing the movement keys [%s]/[%s]. Instead of letting go you can also jump off the ladder if you press the movement key corresponding to the side your a hanging on while climbing up.
MsgTutorialBlastGems=Okay, you can now plant some dynamite sticks on the stalactite and get back on board of the airship. Then fuse the dynamite to blast the stalactite.
MsgTutorialCollectGems=Perfect blast! Now collect at least five gems and sell them back at the flagpole, you can sell them by transfering them into the flagpole using the interaction menu. If you are lazy you can use the teleglove to pick up the gems from the sky island below.
MsgTutorialCompleted=Well done, you have stolen enough rubies from the evil wipf faction to hire some clonks for your attack on the faction's stronghold.
MsgTutorialFindRubies=Schau an, du bist weit oben auf einigen Himmelsinseln. Sprich mit dem Piloten und frag ihn nach Hinweisen über diese Gegend. Nimm danach das Luftschiff und such den Edelstein-Stalaktit, der von einer Himmelsinsel hängen soll. Du kannst das Luftschiff mit [%s] anfassen und mit %s steuern.
MsgTutorialParkAirship=Ah, du hast den Stalaktit gefunden. Es ist Zeit, Edelsteine herauszusprengen! Parke das Luftschiff vor den Strickleitern dort.
MsgTutorialLadderJump=Gut. Dein Kollege wird ab jetzt das Luftschiff steuern. Du kannst bist zum Rubingestein springen. Springe an eine Strickleiter und dein Clonk wird sich automatisch festhalten. Mit den Bewegungstasten ([%s]/[%s]) kannst du an den Leitern die Seiten wechseln oder sie loslassen. Wenn du nach oben kletterst und die Richtungstasten der Richtung drückst, an der du gerade an einer Leiter hängst, kannst du auch abspringen.
MsgTutorialBlastGems=Gut, jetzt kannst du einige Dynamitstangen an dem Stalaktit befestigen und danach zum Luftschiff zurückkehren. Drück danach den Zünder, um den Stalaktiten zu sprengen.
MsgTutorialCollectGems=Eine perfekte Sprengung! Sammle jetzt wenigstens fünf Edelsteine und verkaufe sie an der Flagge. Du kannst Dinge verkaufen, indem du sie im Interaktionsmenü in die Flage ablegst. Wenn du keine Lust hast, alle Edelsteine vom Boden zu sammeln, kannst du auch den Telehandschuh aus der Lore verwenden, um die Brocken von der Himmelsinsel zu heben.
MsgTutorialCompleted=Gut gemacht. Du hast genug Rubine von der Dunkelwipf-Fraktion gestohlen, um damit Clonks für einen Angriff auf die Feste anzuheuern.

View File

@ -1,13 +1,13 @@
# Dialogue: Pilot
DlgPilotHello=Hello I am %s, have you seen sky islands before?
DlgPilotReply=No, but I have been told they are home to gem stalactites.
DlgPilotBats=Yes, indeed. But you have to be careful, they are also home to bats which become active during night.
DlgPilotAgainstBats=Oh, what can I do against bats?
DlgPilotBowArrow=Well, if they attack you... You can fend them off using the bow and arrows.
DlgPilotHaveBow=I see, well, do you have a bow for me?
DlgPilotArmory=I think you can produce one in the armory together with arrows, I have built an armory on the island to the lower right from here.
DlgPilotHello=Hallo, ich bin %s. Hast du schon einmal Himmelsinseln gesehen?
DlgPilotReply=Nein, aber mir wurde gesagt, dass es hier Edelstein-Stalaktiten gibt.
DlgPilotBats=Ja, das stimmt. Aber ebenso gibt es hier nachtaktive Fledermäuse, vor denen man sich in Acht nehmen muss.
DlgPilotAgainstBats=Oh. Kann man etwas gegen die Fledermäuse tun?
DlgPilotBowArrow=Nun ja, wenn sie angreifen...mit Pfeil und Bogen könntest du sie abwehren.
DlgPilotHaveBow=Ich verstehe. Hast du einen Bogen für mich?
DlgPilotArmory=Nein, aber in der Waffenschmiede kannst du einen Bogen und Pfeile herstellen. Ich habe eine Waffenschmiede auf einer unten rechts von hier gebaut.
# Messages: Pilot
DlgPilotGem0=Yeah a gem!
DlgPilotGem1=I'll take that gem!
DlgPilotGem2=That gem is mine!
DlgPilotGem0=Yeah, ein Edelstein!
DlgPilotGem1=Den Stein nehme ich!
DlgPilotGem2=Der Stein gehört mir!

View File

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

View File

@ -1,7 +1,7 @@
Wasserwerk
You were sent to the mine where the villagers of Wipfville get their metal supplies. Unfortunately the mine got flooded as a dike broke during a recent disaster. The chief of the mining operation tells you the mine is still in operation, but they have trouble getting the metal out of the mine. This is where you come in: help the miners salvage their lorries filled with metal.
Goal: Salvage the lorry from the flooded mine.
Du wurdest zu der Mine geschickt, aus der die Bewohner von Wipfdorf ihre Metallvorräte beziehen. Dummerweise wurde die Mine bei einem katastrophalen Dammbruch geflutet. Der Vorarbeiter der Minenarbeiter berichtet, dass die Mine noch in Betrieb ist, aber das Metall nicht mehr aus der Mine geschafft werden kann. Hier ist deine Aufgabe: Hilf den Minenarbeitern die Loren mit dem Metall zu bergen.
Tutorial explains: Pump and liquids, elevator, wall kits.
Ziel: Berge die Loren aus der überfluteten Mine.
Lernrunde erklärt: Pumpe und Flüssigkeiten, Fahrstuhl, Wandbausatz.

View File

@ -37,7 +37,7 @@ protected func OnGoalsFulfilled()
// Achievement: Tutorial completed.
GainScenarioAchievement("TutorialCompleted", 3);
// Dialogue options -> next round.
SetNextMission("Tutorials.ocf\\Tutorial09.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
//SetNextMission("Tutorials.ocf\\Tutorial09.ocs", "$MsgNextTutorial$", "$MsgNextTutorialDesc$");
// Normal scenario ending by goal library.
return false;
}

View File

@ -1,6 +1,6 @@
# Goal description
MsgGoalName=Salvage lorry
MsgGoalDescription=Locate the lorry with metal and transport it back to the surface.
MsgGoalName=Lorenbergung
MsgGoalDescription=Finde die Lore mit Metall und bringe sie zur Oberfläche.
# Dialogue options
MsgNextTutorial=&Nächste Lernrunde
@ -9,14 +9,14 @@ MsgRepeatRound=&Lernrunde wiederholen
MsgRepeatRoundDesc=Diese Lernrunde wiederholen.
# Tutorial messages
MsgTutorialFloodedMines=You are right in front of the mine entrance. Talk to the mine operator standing in front of the pump to find out how you can help.
MsgTutorialConnectPipe=Get a pipe from the chest. Pipes can be connected to the pump by using them in front of the pump, the first pipe will be the source and the second pipe will be the drain. Connect the pipe to the pump. More options for the pump are found in the interaction menu.
MsgTutorialFindMetalLorry=Good, this way the pump will take water from the pipe and drop it right in front of itself since no drain pipe is connected. You can then keep the pipe in your inventory and use it to pump water from the mine. Now enter the mine by following the path of the elevator and locate the lorry with the metal. Remember to catch your breath every once in a while.
MsgTutorialMoveLorry=Okay, let's move the lorry out of the mine to the flooded elevator shaft. Push it into the water, maybe it will make its way to where the elevator case would touch the shaft's ground.
MsgTutorialCallElevator=Hm, that did not work. Swim to the place where the elevator case would reach the ground and call it by pressing [%s]. It will take a few seconds for it to make its way down. In the meanwhile talk to the NPC standing in front of the chemical lab, maybe he has some idea.
MsgTutorialProduceWallKit=That was not very helpful. The problem seems to be getting the lorry onto the elevator case. If one could somehow close of a small part around the elevator case to remove the water with the pump. Wait a second... One could use a wall kit for this. Produce one in the workshop.
MsgTutorialCloseMineShaft=Take the wall kit and a dynamite box from the chemical lab. Then make sure the elevator is at the bottom of the flooded shaft and close off the gap above the elevator with wall kits. To place a wall kit, select it in the inventory and hold the left mouse button. Then position the wall kit by moving the mouse cursor and place it by releasing the button.
MsgTutorialWaitAndMoveLorry=Perfect, now place the pipe in near the elevator case and wait for the lower part of the shaft to be drained, then move the lorry into the case.
MsgTutorialBlastWall=Good, now that the lorry is in the elevator case we can blast the the wall again to allow the elevator to move up to the surface. Take a dynamite box from the chemical lab and place all five dynamite sticks at the indicated location, then move a way and use the igniter to blast it.
MsgTutorialSwimUp=Now you can swim back up to the surface again and call the elevator case when you are at the top. Then move the metal lorry to the chief of the mine and talk to him.
MsgTutorialCompleted=Well done, you see that in this game you sometimes need nifty tricks to solve difficult problems! Now the villagers have enough metal to produce weapons and you are one step closer to mounting an attack against the evil faction.
MsgTutorialFloodedMines=Du befindest direkt vor dem Mineneingang. Sprich mit dem Vorarbeiter, der vor der Pumpe steht und finde heraus, wie du helfen kannst.
MsgTutorialConnectPipe=Nimm ein Rohr aus der Kiste. Rohre können mit Pumpen verbunden werden, indem man sie benutzt, während man vor der Pumpe steht. Das erste angeschlossene Rohr ist der Zulauf, das zweite der Ablauf. Verbinde das Rohr jetzt mit der Pumpe. Weitere Optionen der Pumpe kannst du im Interaktionsmenü finden.
MsgTutorialFindMetalLorry=Gut. Jetzt wird die Pumpe Wasser aus dem Zulauf pumpen und direkt vor sich herauspumpen, da noch kein Ablauf verbunden ist. Du kannst das Rohr im Inventar behalten und es benutzen, um Wasser aus der Mine zu pumpen. Tauche jetzt hinunter zur Mine, indem du dem Pfad des Fahrstuhls folgst. Mach die Lore mit dem Metall ausfindig. Denke auch daran, regelmäßig Luft zu holen!
MsgTutorialMoveLorry=Gut, bringe die Lore jetzt aus der Mine in den gefluteten Fahrstuhlschacht. Schiebe die Lore ins Wasser, vielleicht rollt sie ja genau dorthin, wo der Fahrstuhlkorb den Schachtboden erreicht.
MsgTutorialCallElevator=Hm, das hat nicht funktioniert. Schwimme zu dem Ort, wo der Fahrstuhlkorb den Schachtboden erreichen würde und rufe den Korb, indem du [%s] drückst. Der Korb wird einige Zeit brauchen, bis der Boden des Schachtes erreicht hat. Währenddessen könntest du mit dem Clonk vor dem Chemielabor reden, vielleicht hat der ja noch Ideen.
MsgTutorialProduceWallKit=Das war nicht sehr hilfreich. Das Problem hier, dass die Lore in den Fahrstuhlkorb hinein muss. Wenn es nur irgendwie möglich wäre, den kleinen Bereich um den Fahrstuhlkorb zu versiegeln und das Wasser mit der Pumpe zu entfernen. Warte mal kurz...dafür wäre ein Wandbausatz genau das richtige. Du solltest davon einen in der Werkstatt herstellen.
MsgTutorialCloseMineShaft=Nimm den Wandbausatz und die Dynamitkiste aus dem Chemielabor. Versichere dich, dass der Fahrstuhlkorb wirklich am Boden des gefluteten Schachtes ist. Benutze dann den Wandbausatz, um den Schacht zu verschließen. Wähle dazu den Wandbausatz in deinem Inventar aus und halte die linke Maustaste gedrückt. Positioniere die Wand, indem du den Mauszeiger bewegst und erstelle sie durch Loslassen der Taste.
MsgTutorialWaitAndMoveLorry=Perfekt! Bring den Zulauf der Pumpe jetzt zum Fahrstuhlkorb und warte, bis der Schacht leergepumpt wurde. Danach kannst du die Lore auf den Fahrstuhlkorb schieben.
MsgTutorialBlastWall=Gut, jetzt wo die Lore auf dem Korb steht, kannst du die Wand nach oben wieder aufsprengen, damit der Fahrstuhl an die Oberfläche zurückkehren kann. Nimm die Dynamitkiste (aus dem Chemielabor) und platziere die Dynamitstangen an der angezeigten Stelle. Gehe danach in Sicherheit und zünde das Dynamit!
MsgTutorialSwimUp=Jetzt kannst du an die Oberfläche zurückschwimmen. Wenn du oben angelangt bist, rufe den Fahrstuhlkorb. Schiebe die Lore zum Vorarbeiter und sprich mit ihm.
MsgTutorialCompleted=Sehr gut. Wie du siehst, braucht man manchmal ein paar geschickte Tricks, um Probleme in diesem Spiel zu lösen. Jetzt wo die Dorfbewohner genug Metall haben, bist du einen Schritt näher, um die Dunkelwipffraktion anzugreifen.

View File

@ -1,26 +1,26 @@
# Dialogue: Chief
DlgChiefHello=Hello I am chief of operations of the mines below. But we had a disaster and our dike protecting us from the sea broke, and now the mine is flooded.
DlgChiefReply=Oh that is terrible, I came here to buy some metal from you.
DlgChiefNoMetal=Well, we don't have any metal available as we can't transport it out of the mine. My miners are even stuck below.
DlgChiefHelp=Well, what if I help you get the metal out of the mine?
DlgChiefAppreciation=That would be wonderful! You can use this pump I have just built, unfortunately it is not strong enough to empty the sea here, but it may be of help.
DlgChiefReward=Can I get some reward for this?
DlgChiefMetal=Yes, of course. The metal you can get to the surface you may keep, if you tell me how you did it!
DlgChiefLorry=I got the lorry with metal up to the surface!
DlgChiefKeepLorry=That's great, now we can use your method to keep excavating the mine! You may keep the lorry and its contents.
DlgChiefReally=You can really keep the lorry and the metal.
DlgChiefHello=Hallo, ich bin der Vorarbeiter dieser Minenoperation. Es gab eine schlimme Katastrophe, der Damm zum Meer ist gebrochen und die Mine geflutet.
DlgChiefReply=Oh nein, wie schrecklich. Ich bin gekommen, um Metall zu kaufen.
DlgChiefNoMetal=Nun, wir haben gerade kein Metall da. Unser Transportweg aus der Mine ist geflutet. Ich habe noch Leute, die da unten festsitzen.
DlgChiefHelp=Was ist, wenn ich euch helfe, das Metall aus der Mine zu bringen?
DlgChiefAppreciation=Das wäre wundervoll. Du kannst diese Pumpe hier benutzen. Leider ist sie nicht stark genug, um alles Wasser hier wegzupumpen, aber vielleicht ist sie trotzdem nützlich.
DlgChiefReward=Kriege ich eine Belohnung?
DlgChiefMetal=Ja, natürlich. Du darfst alles Metall behalten, wenn du nach hier oben bringst. Wenn du mir sagst, wie du das geschafft hast!
DlgChiefLorry=Hier ist die Lore mit dem Metall!
DlgChiefKeepLorry=Klasse gemacht. Wir können jetzt die gleiche Methode anwenden, um die Mine weiter auszubeuten. Du kannst alles Metall behalten.
DlgChiefReally=Du kannst wirklich die Lore und das Metall behalten.
# Dialogue: Miner
DlgMinerGreeting=Hi, I am %s, are you one of the miners?
DlgMinerYes=Yes, I am %s. I have been locked down here for more than a day now. Do you have some food?
DlgMinerNoFood=No, I am sorry. If I find something I'll be back.
DlgMinerYesFood=Yes, I have a %s, you can have it.
DlgMinerEatFood=Thank you for the food. How did you get in here? Do you know a way out?
DlgMinerWayOut=Yes, you can just swim up, along the original path of the elevator.
DlgMinerGreeting=Hallo, ich bin %s. Bist du einer der Minenleute hier?
DlgMinerYes=Ja. Mein Name ist %s. Ich bin jetzt seit über einem Tag hier unten eingesperrt. Hast du vielleicht etwas zu essen?
DlgMinerNoFood=Nein, tut mir leid. Wenn ich etwas finde, komme ich wieder.
DlgMinerYesFood=Ja, ich habe hier etwas %s. Kannst du haben.
DlgMinerEatFood=Danke für das Essen! Wie bist du eigentlich hier herunter gekommen? Gibt es einen Weg nach oben?
DlgMinerWayOut=Ja, man kann einfach nach oben schwimmen, entlang des Fahrstuhlschachtes.
# Dialogue: Explosive Expert
DlgExpertHello=Hi I am looking for a way to get lorries out of this mine. Can you help?
DlgExpertNoHelp=I have no clue how to achieve that. I only know about explosives.
DlgExpertWhatExplosives=Oh explosives! What kind do you have and can I use them?
DlgExpertUseExplosives=I have dynamite. Please use whatever you can find in the chemical lab or the workshop for your endeavour.
DlgExpertThanks=Thanks a lot.
DlgExpertHello=Hallo, ich suche nach einer Möglichkeit, um Loren an die Oberfläche zu bringen. Kannst du mir helfen?
DlgExpertNoHelp=Dazu fällt mir gar nichts ein. Ich bin hier für Sprengstoffe zuständig.
DlgExpertWhatExplosives=Oh, Sprengstoffe! Hast du welche, die ich verwenden kann?
DlgExpertUseExplosives=Dynamit ist da. Nimm das, was du im Chemielabor oder in der Werkstatt findest.
DlgExpertThanks=Vielen Dank.

View File

@ -138,8 +138,8 @@ private func UpdateFuel()
private func GetBarrel()
{
for (var barrel in FindObjects(Find_ID(Barrel), Find_Container(this)))
if (barrel->GetFillLevel())
for (var barrel in FindObjects(Find_Func("IsBarrel"), Find_Container(this)))
if (barrel->GetFillLevel() > 0)
return barrel;
return;
}
@ -177,7 +177,7 @@ public func IsContainer() { return true; }
protected func RejectCollect(id object_id)
{
if (object_id == Coal || object_id == Barrel)
if (object_id == Coal || object_id == Barrel || object_id == MetalBarrel)
return false;
return true;
}

View File

@ -76,15 +76,17 @@ public func InitializePlayer(plr)
GivePlayerAirKnowledge(plr);
GivePlayerSpecificKnowledge(plr, [WoodenBridge]);
RemovePlayerSpecificKnowledge(plr, [WallKit]);
// Give the player the elementary base materials and some tools.
GivePlayerElementaryBaseMaterial(plr);
GivePlayerToolsBaseMaterial(plr);
// Take over small village at the start of the map.
for (var structure in FindObjects(Find_Func("IsFlagpole")))
structure->SetOwner(plr);
for (var building in FindObjects(Find_Or(Find_ID(Sawmill), Find_ID(WindGenerator), Find_ID(ToolsWorkshop))))
{
building->SetOwner(plr);
}
// Set zoom range.
SetPlayerZoomByViewRange(plr, 600, nil, PLRZOOM_Direct | PLRZOOM_LimitMax);
SetPlayerViewLock(plr, true);

View File

@ -734,6 +734,21 @@ void C4PlayerControlAssignmentSets::CompileFunc(StdCompiler *pComp)
}
pComp->Value(mkNamingAdapt(clear_previous, "ClearPrevious", false));
pComp->Value(mkSTLContainerAdapt(Sets, StdCompiler::SEP_NONE));
// Remove all sets that have gamepad controls, since gamepad
// support is broken at the moment. Disable this once we have gamepad
// support again!
if (pComp->isCompiler())
{
AssignmentSetList::iterator iter = Sets.begin();
for (AssignmentSetList::iterator iter = Sets.begin(); iter != Sets.end(); )
{
if (iter->HasGamepad())
iter = Sets.erase(iter);
else
++iter;
}
}
}
bool C4PlayerControlAssignmentSets::operator ==(const C4PlayerControlAssignmentSets &cmp) const

View File

@ -240,9 +240,21 @@ void C4Viewport::Draw(C4TargetFacet &cgo0, bool fDrawGame, bool fDrawOverlay)
// Region in which the light is calculated
// At the moment, just choose integer coordinates to surround the viewport
const C4Rect lightRect(vpRect);
pFoW->Update(lightRect, vpRect);
if (!lightRect.Wdt || !lightRect.Hgt)
{
// Do not bother initializing FoW on empty region; would cause errors in drawing proc
pFoW = NULL;
}
else
{
pFoW->Update(lightRect, vpRect);
pFoW->Render();
if (!pFoW->Render())
{
// If FoW init fails, do not set it for further drawing
pFoW = NULL;
}
}
}
pDraw->SetFoW(pFoW);

View File

@ -1893,7 +1893,7 @@ bool C4ScriptGuiWindow::Draw(C4TargetFacet &cgo, int32_t player, C4Rect *current
bool C4ScriptGuiWindow::GetClippingRect(int32_t &left, int32_t &top, int32_t &right, int32_t &bottom)
{
const int32_t &style = props[C4ScriptGuiWindowPropertyName::style].GetInt();
if (IsRoot() || isMainWindow || (style & C4ScriptGuiWindowStyleFlag::NoCrop))
if (IsRoot() || (style & C4ScriptGuiWindowStyleFlag::NoCrop))
return false;
if (pScrollBar->IsVisible())

View File

@ -154,7 +154,9 @@ C4GUI::ContextMenu *C4StartupMainDlg::OnPlayerSelContextRemove(C4GUI::Element *p
void C4StartupMainDlg::OnPlayerSelContextAddPlr(C4GUI::Element *pTarget, const StdCopyStrBuf &rsFilename)
{
SAddModule(Config.General.Participants, rsFilename.getData());
// De-select all other players for now (see #1529)
SCopy(rsFilename.getData(), Config.General.Participants);
//SAddModule(Config.General.Participants, rsFilename.getData());
UpdateParticipants();
}

View File

@ -730,6 +730,10 @@ void C4StartupPlrSelDlg::OnItemCheckChange(C4GUI::Element *pCheckBox)
switch (eMode)
{
case PSDM_Player:
// Deselect all other players
for (ListItem* pEl = static_cast<ListItem*>(pPlrListBox->GetFirst()); pEl != NULL; pEl = pEl->GetNext())
if (pCheckBox && pEl != pCheckBox->GetParent())
pEl->SetActivated(false);
// update Config.General.Participants
UpdateActivatedPlayers();
break;
@ -769,7 +773,7 @@ void C4StartupPlrSelDlg::OnActivateBtn(C4GUI::Control *btn)
if (!pSel) return;
pSel->SetActivated(!pSel->IsActivated());
// update stuff
OnItemCheckChange(NULL);
OnItemCheckChange(pSel->GetCheckBox());
}
void C4StartupPlrSelDlg::DoBack()
@ -934,7 +938,7 @@ void C4StartupPlrSelDlg::SelectItem(const StdStrBuf &Filename, bool fActivate)
{
pPlrItem->SetActivated(true);
// player activation updates
OnItemCheckChange(NULL);
OnItemCheckChange(pPlrItem->GetCheckBox());
}
// max one
return;

View File

@ -66,6 +66,7 @@ private:
void SetFilename(const StdStrBuf &sNewFN);
public:
C4GUI::CheckBox *GetCheckBox() const { return pCheck; }
ListItem *GetNext() const { return static_cast<ListItem *>(BaseClass::GetNext()); }
virtual uint32_t GetColorDw() const = 0; // get drawing color for portrait
bool IsActivated() const { return pCheck->GetChecked(); }

View File

@ -118,6 +118,9 @@ bool C4FoWRegion::BindFramebuf()
pBackSurface->Unlock();
}
// Cannot bind empty surface
if (!pSurface->iTexSize) return false;
// Generate frame buffer object
if (!hFrameBufDraw)
{
@ -178,7 +181,7 @@ void C4FoWRegion::Update(C4Rect r, const FLOAT_RECT& vp)
ViewportRegion = vp;
}
void C4FoWRegion::Render(const C4TargetFacet *pOnScreen)
bool C4FoWRegion::Render(const C4TargetFacet *pOnScreen)
{
#ifndef USE_CONSOLE
// Update FoW at interesting location
@ -188,24 +191,24 @@ void C4FoWRegion::Render(const C4TargetFacet *pOnScreen)
if (pOnScreen)
{
pFoW->Render(this, pOnScreen, pPlayer, pGL->GetProjectionMatrix());
return;
return true;
}
// Set up shader. If this one doesn't work, we're really in trouble.
C4Shader *pShader = pFoW->GetFramebufShader();
assert(pShader);
if (!pShader) return;
if (!pShader) return false;
// Create & bind the frame buffer
pDraw->StorePrimaryClipper();
if(!BindFramebuf())
{
pDraw->RestorePrimaryClipper();
return;
return false;
}
assert(pSurface && hFrameBufDraw);
if (!pSurface || !hFrameBufDraw)
return;
return false;
// Set up a clean context
glViewport(0, 0, pSurface->Wdt, pSurface->Hgt);
@ -318,6 +321,7 @@ void C4FoWRegion::Render(const C4TargetFacet *pOnScreen)
OldRegion = Region;
#endif
return true;
}
void C4FoWRegion::GetFragTransform(const C4Rect& clipRect, const C4Rect& outRect, float lightTransform[6]) const

View File

@ -53,7 +53,7 @@ public:
#endif
void Update(C4Rect r, const FLOAT_RECT& vp);
void Render(const C4TargetFacet *pOnScreen = NULL);
bool Render(const C4TargetFacet *pOnScreen = NULL);
// Fills a 2x3 matrix to transform fragment coordinates to light texture coordinates
void GetFragTransform(const C4Rect& clipRect, const C4Rect& outRect, float lightTransform[6]) const;

View File

@ -1030,6 +1030,9 @@ void StdMeshInstance::AttachedMesh::DenumeratePointers()
Child->AttachParent = this;
MapBonesOfChildToParent(Parent->GetMesh().GetSkeleton(), Child->GetMesh().GetSkeleton());
if(OwnChild)
Child->DenumeratePointers();
}
bool StdMeshInstance::AttachedMesh::ClearPointers(class C4Object* pObj)

View File

@ -2872,13 +2872,16 @@ bool C4Object::SetAction(C4PropList * Act, C4Object *pTarget, C4Object *pTarget2
if (Act!=LastAction)
{
Action.Time=0;
// reset action data if procedure is changed
// reset action data and targets if procedure is changed
if ((Act ? Act->GetPropertyP(P_Procedure) : -1)
!= (LastAction ? LastAction->GetPropertyP(P_Procedure) : -1))
!= (LastAction ? LastAction->GetPropertyP(P_Procedure) : -1))
{
Action.Data = 0;
Action.Target = NULL;
Action.Target2 = NULL;
}
}
// Set new action
SetProperty(P_Action, C4VPropList(Act));
Action.Phase=Action.PhaseDelay=0;
// Set target if specified
@ -3015,12 +3018,10 @@ int32_t C4Object::GetProcedure() const
return pActionDef->GetPropertyP(P_Procedure);
}
void GrabLost(C4Object *cObj)
void GrabLost(C4Object *cObj, C4Object *prev_target)
{
// Grab lost script call on target (quite hacky stuff...)
cObj->Action.Target->Call(PSF_GrabLost);
// Also, delete the target from the clonk's action (Newton)
cObj->Action.Target = NULL;
if (prev_target && prev_target->Status) prev_target->Call(PSF_GrabLost);
// Clear commands down to first PushTo (if any) in command stack
for (C4Command *pCom=cObj->Command; pCom; pCom=pCom->Next)
if (pCom->Next && pCom->Next->Command==C4CMD_PushTo)
@ -3038,6 +3039,7 @@ void C4Object::NoAttachAction()
if (GetAction())
{
int32_t iProcedure = GetProcedure();
C4Object *prev_target = Action.Target;
// Scaling upwards: corner scale
if (iProcedure == DFA_SCALE && Action.ComDir != COMD_Stop && ComDirLike(Action.ComDir, COMD_Up))
if (ObjectActionCornerScale(this)) return;
@ -3054,7 +3056,7 @@ void C4Object::NoAttachAction()
{ if (ObjectActionJump(this,itofix(-1),Fix0,false)) return; }
}
// Pushing: grab loss
if (iProcedure==DFA_PUSH) GrabLost(this);
if (iProcedure==DFA_PUSH) GrabLost(this, prev_target);
// Else jump
ObjectActionJump(this,xdir,ydir,false);
}
@ -3769,10 +3771,11 @@ void C4Object::ExecAction()
if (!Inside(GetX()-sax,-iPushRange,sawdt-1+iPushRange)
|| !Inside(GetY()-say,-iPushRange,sahgt-1+iPushRange))
{
C4Object *prev_target = Action.Target;
// Wait command (why, anyway?)
StopActionDelayCommand(this);
// Grab lost action
GrabLost(this);
GrabLost(this, prev_target);
// Done
return;
}
@ -3843,10 +3846,12 @@ void C4Object::ExecAction()
if (!Inside(GetX()-sax,-iPushRange,sawdt-1+iPushRange)
|| !Inside(GetY()-say,-iPushRange,sahgt-1+iPushRange))
{
// Remember target. Will be lost on changing action.
C4Object *prev_target = Action.Target;
// Wait command (why, anyway?)
StopActionDelayCommand(this);
// Grab lost action
GrabLost(this);
GrabLost(this, prev_target);
// Lose target
Action.Target=NULL;
// Done

View File

@ -295,11 +295,11 @@ C4Value C4AulExec::Exec(C4AulBCC *pCPos, bool fPassErrors)
break;
case AB_Inc: // ++
CheckOpPar(C4V_Int, "++");
++(*pCurVal);
pCurVal->SetInt(pCurVal->_getInt() + 1);
break;
case AB_Dec: // --
CheckOpPar(C4V_Int, "--");
--(*pCurVal);
pCurVal->SetInt(pCurVal->_getInt() - 1);
break;
// postfix
case AB_Pow: // **

View File

@ -114,7 +114,7 @@ public:
void Set(const C4Value &nValue) { Set(nValue.Data, nValue.Type); }
void SetInt(int i) { C4V_Data d; d.Int = i; Set(d, C4V_Int); }
void SetInt(int32_t i) { C4V_Data d; d.Int = i; Set(d, C4V_Int); }
void SetBool(bool b) { C4V_Data d; d.Int = b; Set(d, C4V_Bool); }
void SetString(C4String * Str) { C4V_Data d; d.Str = Str; Set(d, C4V_String); }
void SetArray(C4ValueArray * Array) { C4V_Data d; d.Array = Array; Set(d, C4V_Array); }
@ -129,6 +129,7 @@ public:
bool IsIdenticalTo(const C4Value &cmp) const { return GetType()==cmp.GetType() && GetData()==cmp.GetData(); }
// Change and set Type to int in case it was nil or bool before
// Use with care: These don't handle int32_t overflow
C4Value & operator += (int32_t by) { Data.Int += by; Type=C4V_Int; return *this; }
C4Value & operator -= (int32_t by) { Data.Int -= by; Type=C4V_Int; return *this; }
C4Value & operator *= (int32_t by) { Data.Int *= by; Type=C4V_Int; return *this; }