TreasureHunt storyline integration: Intro, Outro, NPCs

issue1247
Sven Eberhardt 2014-09-21 21:49:03 +02:00
parent 059a704f55
commit 84cc072405
50 changed files with 4832 additions and 445 deletions

View File

@ -0,0 +1,14 @@
[DefCore]
id=Hat
Version=5,2,0,1
Category=C4D_Object
Width=8
Height=8
Offset=-4,-4
Vertices=2
VertexX=-3,3
VertexY=1,-1
VertexFriction=20
Value=5
Mass=10
ColorByOwner=1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,31 @@
// S2Hat genrated by blender2ogre 0.6.0
material S2Hat
{
receive_shadows on
technique
{
pass S2Hat
{
ambient 0.13066382706165314 0.11021058261394501 0.8000000715255737 1.0
diffuse 0.10453106320695671 0.08816846740496853 0.640000066757203 1.0
specular 0.5 0.5 0.5 1.0 12.5
emissive 0.0 0.0 0.0 1.0
alpha_to_coverage off
cull_hardware clockwise
depth_check on
depth_write on
scene_blend one zero
texture_unit
{
texture S2Hat.png
tex_address_mode wrap
scale 1.0 1.0
colour_op modulate
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 B

View File

@ -0,0 +1,6 @@
/*--- Hat ---*/
local Collectible = 1;
local Name = "$Name$";
local Description = "$Description$";
local Rebuy = true;

View File

@ -0,0 +1,2 @@
Name=Hut
Description=Mein Hut der hat drei Ecken

View File

@ -0,0 +1,2 @@
Name=Hat
Description=My hat has three vertices!

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -1,7 +1,6 @@
[DefCore]
id=DialogueSimple
id=Deco_AltMaterials2
Version=5,2,0,1
Category=C4D_StaticBack
Picture=0,0,64,64
Width=1
Height=1

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 B

View File

@ -0,0 +1 @@
This definition is not created. It just serves as a container for custom mesh materials, which aren't loaded unless the definition is valid.

View File

@ -0,0 +1,62 @@
material CrashedAirplane
{
receive_shadows on
technique
{
pass
{
cull_hardware none
scene_blend alpha_blend
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 0.800000 0.800000 0.800000 1.000000
specular 0.000000 0.000000 0.000000 1.000000 3.500000
emissive 0.000000 0.000000 0.000000 1.000000
texture_unit Overlay
{
texture CrashedPaint.png
tex_address_mode wrap
filtering trilinear
colour_op_ex modulate src_texture src_player_colour
// take alpha from texture only, ignore player alpha
alpha_op_ex source1 src_texture src_player_colour
}
texture_unit Plane
{
texture Crashedairplane.jpg
tex_address_mode wrap
filtering trilinear
colour_op_ex blend_current_alpha src_current src_texture
// Don't blend alpha, to make sure we have full intensity at the base/overlay border region
alpha_op_ex add src_current src_texture
}
texture_unit Light
{
// apply lighting
colour_op_ex modulate src_current src_diffuse
alpha_op_ex modulate src_current src_diffuse
}
}
}
}
material GoldenShovel
{
receive_shadows on
technique
{
pass
{
ambient 0.500000 0.500000 0.500000 1.000000
diffuse 1.000000 1.000000 1.000000 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 GoldenShovel.jpg
tex_address_mode wrap
filtering trilinear
}
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -1,42 +0,0 @@
/* Nachrichten fuers Intro */
func MessageBoxAll(string message, object talker, bool permanent)
{
if (permanent) permanent = "@"; else permanent = "";
message = Format("%s<c %x>%s:</c> %s", permanent, talker->GetColor(), talker->GetName(), message);
CustomMessage(message, nil, NO_OWNER, 150,150, nil, GUI_MenuDeco, GetPortraitDef(talker));
}
func GetPortraitDef(object talker)
{
var portrait = talker.portrait;
// Default definition has Clonk portrait
// (Can't get default from skin, because there's no function GetSkin D:)
if (!portrait || portrait == "" || portrait == "Clonk") return DialogueSimple;
// Otherwise, bind portrait to an invisible object
// (note: invisible object is leaked. can't really know when the message will be gone.)
if (!talker.portrait_obj)
{
talker.portrait_obj = CreateObject(DialogueSimple);
talker.portrait_obj->SetAction("Attach", talker);
talker.portrait_obj->SetGraphics(portrait);
talker.portrait_obj.Visibility = VIS_None;
}
return talker.portrait_obj;
}
func AttachTargetLost() { return RemoveObject(); }
local ActMap=
{
Attach =
{
Prototype = Action,
Name="Attach",
Procedure=DFA_ATTACH,
NextAction="Attach",
Length=1,
FacetBase=1,
AbortCall = "AttachTargetLost"
}
};

View File

@ -15,20 +15,12 @@ func Entrance()
return _inherited(...);
}
func QueryOnSell()
{
GameCallEx("OnTreasureSold", this);
return false; // allow sale
}
// returns the color of the gem (used for effects)
func GetGemColor()
{
return RGB(0, Random(100), Random(100));
}
public func IsValuable(){ return true; }
local Name = "$Name$";
local Description = "$Description$";
local Collectible = 1;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 70 KiB

View File

@ -1,10 +1,12 @@
/* Automatically created objects file */
static npc_dagobert, npc_tarzan, g_golden_shovel;
func InitializeObjects()
{
CreateObject(Grass, 1627, 396);
CreateObject(Grass, 1636, 385);
CreateObject(Grass, 1716, 366);
CreateObject(Grass, 1786, 469);
CreateObject(Grass, 1574, 493);
CreateObject(Grass, 1564, 493);
CreateObject(Grass, 1537, 525);
@ -19,27 +21,25 @@ func InitializeObjects()
var Chest0009 = CreateObject(Chest, 1002, 313);
Chest0009.Plane = 50;
CreateObject(Goal_TreasureHunt, 0, 0);
CreateObject(Rule_TeamAccount, 0, 0);
CreateObject(Rule_NoPowerNeed, 0, 0);
var LargeCaveMushroom0015 = CreateObject(LargeCaveMushroom, 1308, 1038);
LargeCaveMushroom0015->SetClrModulation(0xffe4effc);
var LargeCaveMushroom0019 = CreateObject(LargeCaveMushroom, 1345, 1028);
LargeCaveMushroom0019->SetClrModulation(0xffe1e3ee);
LargeCaveMushroom0019->SetMeshMaterial("FlyAmanitaMushroom", 0);
var LargeCaveMushroom0023 = CreateObject(LargeCaveMushroom, 1399, 1025);
LargeCaveMushroom0023->SetClrModulation(0xfff3e3e7);
LargeCaveMushroom0023->SetMeshMaterial("FlyAmanitaMushroom", 0);
var LargeCaveMushroom0027 = CreateObject(LargeCaveMushroom, 1464, 999);
LargeCaveMushroom0027->SetClrModulation(0xffe0e6dd);
var LargeCaveMushroom0031 = CreateObject(LargeCaveMushroom, 1450, 1012);
LargeCaveMushroom0031->SetClrModulation(0xffe4eae2);
var LargeCaveMushroom0035 = CreateObject(LargeCaveMushroom, 1523, 993);
LargeCaveMushroom0035->SetClrModulation(0xffe2deee);
LargeCaveMushroom0035->SetMeshMaterial("FlyAmanitaMushroom", 0);
var LargeCaveMushroom0013 = CreateObject(LargeCaveMushroom, 1308, 1038);
LargeCaveMushroom0013->SetClrModulation(0xffe4effc);
var LargeCaveMushroom0017 = CreateObject(LargeCaveMushroom, 1345, 1028);
LargeCaveMushroom0017->SetClrModulation(0xffe1e3ee);
LargeCaveMushroom0017->SetMeshMaterial("FlyAmanitaMushroom", 0);
var LargeCaveMushroom0021 = CreateObject(LargeCaveMushroom, 1399, 1025);
LargeCaveMushroom0021->SetClrModulation(0xfff3e3e7);
LargeCaveMushroom0021->SetMeshMaterial("FlyAmanitaMushroom", 0);
var LargeCaveMushroom0025 = CreateObject(LargeCaveMushroom, 1464, 999);
LargeCaveMushroom0025->SetClrModulation(0xffe0e6dd);
var LargeCaveMushroom0029 = CreateObject(LargeCaveMushroom, 1450, 1012);
LargeCaveMushroom0029->SetClrModulation(0xffe4eae2);
var LargeCaveMushroom0033 = CreateObject(LargeCaveMushroom, 1523, 993);
LargeCaveMushroom0033->SetClrModulation(0xffe2deee);
LargeCaveMushroom0033->SetMeshMaterial("FlyAmanitaMushroom", 0);
CreateObject(Trunk, 1000, 313);
CreateObject(Trunk, 1006, 313);
@ -65,223 +65,303 @@ func InitializeObjects()
CreateObject(EnvPack_Crate, 494, 385);
CreateObject(Fern, 1711, 368);
CreateObject(Fern, 1793, 474);
CreateObject(Fern, 1645, 384);
CreateObject(Fern, 1525, 535);
var Rank0068 = CreateObject(Rank, 1320, 326);
Rank0068->SetR(148);
Rank0068->SetPosition(1320, 326);
var Rank0069 = CreateObject(Rank, 1327, 298);
Rank0069->SetR(165);
Rank0069->SetPosition(1327, 298);
var Rank0070 = CreateObject(Rank, 1424, 257);
Rank0070->SetR(108);
Rank0070->SetPosition(1424, 257);
var Rank0071 = CreateObject(Rank, 1430, 248);
Rank0071->SetR(39);
Rank0071->SetPosition(1430, 246);
var Rank0072 = CreateObject(Rank, 1413, 262);
Rank0072->SetR(128);
Rank0072->SetPosition(1413, 262);
var Rank0073 = CreateObject(Rank, 1396, 263);
Rank0073->SetR(-131);
Rank0073->SetPosition(1396, 263);
var Rank0066 = CreateObject(Rank, 1320, 326);
Rank0066->SetR(148);
Rank0066->SetPosition(1320, 326);
var Rank0067 = CreateObject(Rank, 1327, 298);
Rank0067->SetR(165);
Rank0067->SetPosition(1327, 298);
var Rank0068 = CreateObject(Rank, 1424, 257);
Rank0068->SetR(108);
Rank0068->SetPosition(1424, 257);
var Rank0069 = CreateObject(Rank, 1430, 248);
Rank0069->SetR(39);
Rank0069->SetPosition(1430, 246);
var Rank0070 = CreateObject(Rank, 1413, 262);
Rank0070->SetR(128);
Rank0070->SetPosition(1413, 262);
var Rank0071 = CreateObject(Rank, 1396, 263);
Rank0071->SetR(-131);
Rank0071->SetPosition(1396, 263);
CreateObject(SproutBerryBush, 1823, 493);
CreateObject(Trunk, 401, 1147);
CreateObject(Tree_Coconut, 78, 1152);
CreateObject(Tree_Coconut, 332, 1150);
CreateObject(Tree_Coconut, 51, 1142);
CreateObject(Tree_Coconut, 333, 1150);
CreateObject(Tree_Coniferous, 1864, 464);
CreateObject(Tree_Coniferous, 2788, 679);
CreateObject(Tree_Coniferous, 2788, 680);
var Lichen0095 = CreateObject(Lichen, 2694, 706);
Lichen0095->SetAction("Grown");
var Lichen0093 = CreateObject(Lichen, 2694, 706);
Lichen0093->SetAction("Grown");
CreateObject(BigRock, 1301, 500);
CreateObject(BigRock, 1207, 282);
CreateObject(BigRock, 1291, 263);
var Amethyst0101 = CreateObject(Amethyst, 803, 583);
Amethyst0101.Plane = 190;
var Amethyst0099 = CreateObject(Amethyst, 803, 583);
Amethyst0099.Plane = 190;
var Chest0103 = CreateObject(Chest, 515, 966);
Chest0103.tool_spawn = TeleGlove;
var Chest0104 = CreateObject(Chest, 227, 760);
Chest0104.tool_spawn = Pickaxe;
var Chest0105 = CreateObject(Chest, 634, 902);
Chest0105.tool_spawn = GrappleBow;
var Chest0106 = CreateObject(Chest, 616, 903);
Chest0106.tool_spawn = GrappleBow;
var Chest0107 = CreateObject(Chest, 472, 455);
var Chest0108 = CreateObject(Chest, 546, 383);
var Chest0109 = CreateObject(Chest, 840, 47);
Chest0109.tool_spawn = WindBag;
var Chest0110 = CreateObject(Chest, 853, 1574);
var Chest0111 = CreateObject(Chest, 1428, 1542);
var Chest0112 = CreateObject(Chest, 1765, 1191);
var Chest0113 = CreateObject(Chest, 1878, 719);
Chest0113.tool_spawn = Axe;
var Chest0114 = CreateObject(Chest, 1943, 714);
var Chest0115 = CreateObject(Chest, 2103, 1119);
var Chest0116 = CreateObject(Chest, 397, 583);
var Chest0117 = CreateObject(Chest, 871, 583);
Chest0117->SetMeshMaterial("GoldenChest", 0);
var Chest0118 = CreateObject(Chest, 12, 39);
var Chest0119 = CreateObject(Chest, 2786, 55);
var Chest0120 = CreateObject(Chest, 1830, 486);
Chest0120.tool_spawn = Hammer;
var Chest0121 = CreateObject(Chest, 730, 135);
var Chest0122 = CreateObject(Chest, 1626, 1590);
var Chest0101 = CreateObject(Chest, 515, 967);
Chest0101.tool_spawn = TeleGlove;
var Chest0102 = CreateObject(Chest, 227, 760);
Chest0102.tool_spawn = Pickaxe;
var Chest0103 = CreateObject(Chest, 624, 943);
Chest0103.tool_spawn = GrappleBow;
var Chest0104 = CreateObject(Chest, 603, 942);
Chest0104.tool_spawn = GrappleBow;
var Chest0105 = CreateObject(Chest, 472, 455);
var Chest0106 = CreateObject(Chest, 546, 383);
var Chest0107 = CreateObject(Chest, 840, 47);
Chest0107.tool_spawn = WindBag;
var Chest0108 = CreateObject(Chest, 853, 1574);
var Chest0109 = CreateObject(Chest, 1428, 1542);
var Chest0110 = CreateObject(Chest, 1765, 1191);
var Chest0111 = CreateObject(Chest, 1878, 719);
Chest0111.tool_spawn = Axe;
var Chest0112 = CreateObject(Chest, 1943, 714);
var Chest0113 = CreateObject(Chest, 2103, 1119);
var Chest0114 = CreateObject(Chest, 397, 583);
var Chest0115 = CreateObject(Chest, 871, 583);
Chest0115->SetMeshMaterial("GoldenChest", 0);
var Chest0116 = CreateObject(Chest, 12, 39);
var Chest0117 = CreateObject(Chest, 2786, 55);
var Chest0118 = CreateObject(Chest, 1830, 486);
Chest0118.tool_spawn = Hammer;
var Chest0119 = CreateObject(Chest, 730, 135);
var Chest0120 = CreateObject(Chest, 1626, 1591);
var StoneDoor0123 = CreateObject(StoneDoor, 940, 1151);
var StoneDoor0121 = CreateObject(StoneDoor, 940, 1151);
StoneDoor0121->SetComDir(COMD_Down);
StoneDoor0121->MakeInvincible();
var StoneDoor0123 = CreateObject(StoneDoor, 1084, 1151);
StoneDoor0123->SetComDir(COMD_Down);
StoneDoor0123->MakeInvincible();
var StoneDoor0125 = CreateObject(StoneDoor, 1092, 1151);
var StoneDoor0125 = CreateObject(StoneDoor, 564, 455);
StoneDoor0125->SetComDir(COMD_Down);
StoneDoor0125->MakeInvincible();
var StoneDoor0127 = CreateObject(StoneDoor, 564, 455);
var StoneDoor0127 = CreateObject(StoneDoor, 843, 735);
StoneDoor0127->SetComDir(COMD_Down);
StoneDoor0127->MakeInvincible();
var StoneDoor0129 = CreateObject(StoneDoor, 843, 735);
var StoneDoor0129 = CreateObject(StoneDoor, 1058, 719);
StoneDoor0129->SetComDir(COMD_Down);
StoneDoor0129->MakeInvincible();
var StoneDoor0131 = CreateObject(StoneDoor, 1058, 719);
var StoneDoor0131 = CreateObject(StoneDoor, 1092, 1047);
StoneDoor0131->SetComDir(COMD_Down);
StoneDoor0131->MakeInvincible();
var StoneDoor0133 = CreateObject(StoneDoor, 1092, 1047);
var StoneDoor0133 = CreateObject(StoneDoor, 1892, 951);
StoneDoor0133->SetComDir(COMD_Down);
StoneDoor0133->MakeInvincible();
var StoneDoor0135 = CreateObject(StoneDoor, 1892, 951);
var StoneDoor0135 = CreateObject(StoneDoor, 813, 735);
StoneDoor0135->SetComDir(COMD_Down);
StoneDoor0135->MakeInvincible();
var StoneDoor0137 = CreateObject(StoneDoor, 813, 735);
var StoneDoor0137 = CreateObject(StoneDoor, 781, 735);
StoneDoor0137->SetComDir(COMD_Down);
StoneDoor0137->MakeInvincible();
var StoneDoor0139 = CreateObject(StoneDoor, 781, 735);
StoneDoor0139->SetComDir(COMD_Down);
StoneDoor0139->SetClrModulation(0xffa0a0a0);
var StoneDoor0140 = CreateObject(StoneDoor, 692, 767);
StoneDoor0137->SetClrModulation(0xffa0a0a0);
var StoneDoor0138 = CreateObject(StoneDoor, 692, 767);
StoneDoor0138->SetComDir(COMD_Down);
StoneDoor0138->MakeInvincible();
var StoneDoor0140 = CreateObject(StoneDoor, 684, 351);
StoneDoor0140->SetComDir(COMD_Down);
StoneDoor0140->MakeInvincible();
var StoneDoor0142 = CreateObject(StoneDoor, 684, 350);
StoneDoor0142->SetComDir(COMD_Down);
StoneDoor0142->MakeInvincible();
var SpinWheel0144 = CreateObject(SpinWheel, 589, 457);
SpinWheel0144->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0144->SetStoneDoor(StoneDoor0123);
var SpinWheel0145 = CreateObject(SpinWheel, 611, 456);
SpinWheel0145->SetMeshMaterial("SpinWheelGearBlue", 0);
SpinWheel0145->SetStoneDoor(StoneDoor0125);
var SpinWheel0146 = CreateObject(SpinWheel, 619, 410);
SpinWheel0146->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0146->SetStoneDoor(StoneDoor0127);
var SpinWheel0147 = CreateObject(SpinWheel, 1223, 1553);
SpinWheel0147->SetStoneDoor(StoneDoor0131);
var SpinWheel0148 = CreateObject(SpinWheel, 1117, 1048);
SpinWheel0148->SetStoneDoor(StoneDoor0133);
var SpinWheel0149 = CreateObject(SpinWheel, 2761, 690);
var SpinWheel0142 = CreateObject(SpinWheel, 589, 457);
SpinWheel0142->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0142->SetStoneDoor(StoneDoor0121);
var SpinWheel0143 = CreateObject(SpinWheel, 611, 456);
SpinWheel0143->SetMeshMaterial("SpinWheelGearBlue", 0);
SpinWheel0143->SetStoneDoor(StoneDoor0123);
var SpinWheel0144 = CreateObject(SpinWheel, 619, 410);
SpinWheel0144->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0144->SetStoneDoor(StoneDoor0125);
var SpinWheel0145 = CreateObject(SpinWheel, 1223, 1553);
SpinWheel0145->SetStoneDoor(StoneDoor0129);
var SpinWheel0146 = CreateObject(SpinWheel, 1117, 1048);
SpinWheel0146->SetStoneDoor(StoneDoor0131);
var SpinWheel0147 = CreateObject(SpinWheel, 2761, 690);
SpinWheel0147->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0147->SetStoneDoor(StoneDoor0135);
var SpinWheel0148 = CreateObject(SpinWheel, 1850, 1463);
SpinWheel0148->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0148->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0148->SetStoneDoor(StoneDoor0127);
var SpinWheel0149 = CreateObject(SpinWheel, 2793, 1521);
SpinWheel0149->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0149->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0149->SetStoneDoor(StoneDoor0137);
var SpinWheel0150 = CreateObject(SpinWheel, 1850, 1463);
SpinWheel0150->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0150->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0150->SetStoneDoor(StoneDoor0129);
var SpinWheel0151 = CreateObject(SpinWheel, 2793, 1521);
SpinWheel0151->SetMeshMaterial("SpinWheelGearRed", 0);
SpinWheel0149->SetStoneDoor(StoneDoor0133);
var SpinWheel0150 = CreateObject(SpinWheel, 830, 735);
SpinWheel0150->SetStoneDoor(StoneDoor0138);
var SpinWheel0151 = CreateObject(SpinWheel, 703, 352);
SpinWheel0151->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0151->SetStoneDoor(StoneDoor0135);
var SpinWheel0152 = CreateObject(SpinWheel, 830, 735);
SpinWheel0152->SetStoneDoor(StoneDoor0140);
var SpinWheel0153 = CreateObject(SpinWheel, 703, 352);
SpinWheel0153->SetMeshMaterial("SpinWheelBaseAlt", 1);
SpinWheel0153->SetStoneDoor(StoneDoor0142);
SpinWheel0151->SetStoneDoor(StoneDoor0140);
CreateObject(Pump, 1027, 1152);
CreateObject(Sawmill, 1259, 1047);
var ToolsWorkshop0158 = CreateObject(ToolsWorkshop, 1169, 903);
var ToolsWorkshop0156 = CreateObject(ToolsWorkshop, 1169, 903);
var Column0160 = CreateObject(Column, 779, 488);
Column0160->SetR(180);
Column0160->SetClrModulation(0xffffd0d0);
Column0160->SetMeshMaterial("AncientColumn", 0);
Column0160->SetPosition(779, 488);
var Column0161 = CreateObject(Column, 1419, 217);
Column0161->SetMeshMaterial("AncientColumn", 0);
var Column0158 = CreateObject(Column, 779, 488);
Column0158->SetR(180);
Column0158->SetClrModulation(0xffffd0d0);
Column0158->SetMeshMaterial("AncientColumn", 0);
Column0158->SetPosition(779, 488);
var Column0159 = CreateObject(Column, 1419, 217);
Column0159->SetMeshMaterial("AncientColumn", 0);
CreateObject(Column, 1386, 616);
CreateObject(Ruin_Windmill, 1672, 377);
CreateObject(Ruin_Windmill, 1678, 375);
CreateObject(Ruin_WoodenCabin, 1199, 1046);
var Idol0165 = CreateObject(Idol, 1045, 721);
Idol0165->SetMeshMaterial("IdolGrayColor", 0);
var Idol0163 = CreateObject(Idol, 1045, 721);
Idol0163->SetMeshMaterial("IdolGrayColor", 0);
var LotsOfCoins0166 = CreateObject(LotsOfCoins, 805, 592);
LotsOfCoins0166.Plane = 200;
var Flagpole0165 = CreateObject(Flagpole, 210, 1185);
Flagpole0165->SetCategory(C4D_StaticBack);
Flagpole0165->SetColor(0xfffcf41c);
var Idol0167 = CreateObject(Idol, 824, 583);
Idol0167->SetR(-4);
Idol0167.Plane = 220;
Idol0167->SetPosition(824, 568);
var LotsOfCoins0164 = CreateObject(LotsOfCoins, 805, 592);
LotsOfCoins0164.Plane = 200;
var Lorry0168 = CreateObject(Lorry, 200, 1183);
var Lorry0170 = CreateObject(Lorry, 708, 1407);
Lorry0170->SetMeshMaterial("RuinedLorry", 0);
var Idol0230 = CreateObject(Idol, 824, 583);
Idol0230->SetR(-4);
Idol0230.Plane = 220;
Idol0230->SetPosition(824, 568);
var Catapult0172 = CreateObject(Catapult, 1714, 951);
Catapult0172->SetRDir(-2);
var Lorry0231 = CreateObject(Lorry, 200, 1183);
var Lorry0233 = CreateObject(Lorry, 708, 1407);
Lorry0233->SetMeshMaterial("RuinedLorry", 0);
var Catapult0235 = CreateObject(Catapult, 1714, 951);
Catapult0235->SetRDir(2);
CreateObject(StrawMan, 1924, 439);
CreateObject(StrawMan, 2642, 705);
var Clonk0175 = CreateObject(Clonk, 316, 430);
Clonk0175->SetColor(0xff);
S2AI->AddAI(Clonk0175);
S2AI->SetHome(Clonk0175, 315, 422, DIR_Left);
S2AI->SetGuardRange(Clonk0175, 296, 322, 350, 140);
S2AI->SetEncounterCB(Clonk0175, "EncounterCastle");
Clonk0175->SetDir(DIR_Left);
var Clonk0182 = CreateObject(Clonk, 501, 455);
Clonk0182->SetDir(DIR_Right);
Clonk0182->SetColor(0xff);
S2AI->AddAI(Clonk0182);
S2AI->SetHome(Clonk0182, 502, 445, DIR_Right);
S2AI->SetGuardRange(Clonk0182, 460, 300, 200, 160);
S2AI->SetMaxAggroDistance(Clonk0182, 60);
var Clonk0189 = CreateObject(Clonk, 534, 454);
Clonk0189->SetDir(DIR_Right);
Clonk0189->SetColor(0xff);
S2AI->AddAI(Clonk0189);
S2AI->SetHome(Clonk0189, 534, 446, DIR_Right);
S2AI->SetGuardRange(Clonk0189, 460, 300, 200, 160);
S2AI->SetMaxAggroDistance(Clonk0189, 60);
var Clonk0196 = CreateObject(Clonk, 671, 638);
Clonk0196->SetDir(DIR_Right);
Clonk0196->SetCon(150);
Clonk0196->SetColor(0xffffa000);
S2AI->AddAI(Clonk0196);
S2AI->SetHome(Clonk0196, 671, 629, DIR_Right);
S2AI->SetGuardRange(Clonk0196, 580, 480, 320, 175);
S2AI->SetEncounterCB(Clonk0196, "EncounterFinal");
var Clonk0238 = CreateObject(Clonk, 316, 430);
Clonk0238->SetColor(0xff);
S2AI->AddAI(Clonk0238);
S2AI->SetHome(Clonk0238, 315, 422, DIR_Left);
S2AI->SetGuardRange(Clonk0238, 296, 322, 350, 140);
S2AI->SetEncounterCB(Clonk0238, "EncounterCastle");
Clonk0238->SetDir(DIR_Left);
var Clonk0245 = CreateObject(Clonk, 501, 455);
Clonk0245->SetDir(DIR_Right);
Clonk0245->SetColor(0xff);
S2AI->AddAI(Clonk0245);
S2AI->SetHome(Clonk0245, 502, 445, DIR_Right);
S2AI->SetGuardRange(Clonk0245, 460, 300, 200, 160);
S2AI->SetMaxAggroDistance(Clonk0245, 60);
var Clonk0252 = CreateObject(Clonk, 534, 454);
Clonk0252->SetDir(DIR_Right);
Clonk0252->SetColor(0xff);
S2AI->AddAI(Clonk0252);
S2AI->SetHome(Clonk0252, 534, 446, DIR_Right);
S2AI->SetGuardRange(Clonk0252, 460, 300, 200, 160);
S2AI->SetMaxAggroDistance(Clonk0252, 60);
var Clonk0259 = CreateObject(Clonk, 671, 638);
Clonk0259->SetDir(DIR_Right);
Clonk0259->SetCon(150);
Clonk0259->SetColor(0xffffa000);
S2AI->AddAI(Clonk0259);
S2AI->SetHome(Clonk0259, 671, 629, DIR_Right);
S2AI->SetGuardRange(Clonk0259, 580, 480, 320, 175);
S2AI->SetEncounterCB(Clonk0259, "EncounterFinal");
npc_dagobert = CreateObject(Clonk, 369, 1143);
npc_dagobert->SetColor(0xffa000);
npc_dagobert->SetName("Scrooge");
npc_dagobert.StaticSaveVar = "npc_dagobert";
npc_dagobert->MakeInvincible();
npc_dagobert->SetDir(DIR_Left);
var Clonk0273 = CreateObject(Clonk, 1720, 375);
Clonk0273->SetDir(DIR_Right);
Clonk0273->SetColor(0x808080);
Clonk0273->SetName("Otto");
Clonk0273->SetSkin(2);
var Clonk0280 = CreateObject(Clonk, 1868, 950);
Clonk0280->SetColor(0xff0000);
Clonk0280->SetName("Donald");
Clonk0280->SetDir(DIR_Left);
var Clonk0286 = CreateObject(Clonk, 676, 942);
Clonk0286->SetDir(DIR_Right);
Clonk0286->SetColor(0x802000);
Clonk0286->SetName("Jane");
Clonk0286->SetSkin(1);
npc_tarzan = CreateObject(Clonk, 751, 875);
npc_tarzan->SetXDir(3);
npc_tarzan->SetYDir(-1);
npc_tarzan->SetColor(0x402000);
npc_tarzan->SetName("Tarzan");
npc_tarzan.StaticSaveVar = "npc_tarzan";
npc_tarzan->SetDir(DIR_Left);
var Clonk0299 = CreateObject(Clonk, 498, 967);
Clonk0299->SetColor(0x20ffff);
Clonk0299->SetName("Sophie");
Clonk0299->SetSkin(3);
Clonk0299->SetDir(DIR_Left);
var Clonk0306 = CreateObject(Clonk, 853, 735);
Clonk0306->SetDir(DIR_Right);
Clonk0306->SetColor(0x6000);
Clonk0306->SetName("Riku");
Clonk0306->SetSkin(2);
var Clonk0313 = CreateObject(Clonk, 1098, 1150);
Clonk0313->SetDir(DIR_Right);
Clonk0313->SetColor(0x800000);
Clonk0313->SetName("Ann");
Clonk0313->SetSkin(3);
npc_dagobert->SetDialogue("Dagobert",true);
Clonk0273->SetDialogue("Otto",true);
var GrappleBow0335 = npc_tarzan->CreateContents(GrappleBow);
var GrappleBow0333 = npc_tarzan->CreateContents(GrappleBow);
npc_tarzan->SetDialogue("Tarzan",false);
Clonk0286->SetDialogue("Jane",true);
Clonk0280->SetDialogue("Donald",true);
var TeleGlove0325 = Clonk0299->CreateContents(TeleGlove);
Clonk0299->SetDialogue("Sophie",true);
Clonk0306->SetDialogue("Riku",true);
var Pickaxe0320 = Clonk0313->CreateContents(Pickaxe);
Clonk0313->SetDialogue("Ann",true);
CreateObject(Skull, 53, 1138);
var Bone0204 = CreateObject(Bone, 35, 1135);
Bone0204->SetR(-45);
Bone0204->SetPosition(35, 1135);
CreateObject(Bone, 46, 1138);
var Bone0344 = CreateObject(Bone, 25, 1141);
Bone0344->SetR(-69);
Bone0344->SetPosition(25, 1139);
var Bone0345 = CreateObject(Bone, 48, 1135);
Bone0345->SetR(-51);
Bone0345->SetPosition(48, 1135);
var Bone0346 = CreateObject(Bone, 472, 963);
Bone0346->SetR(-52);
Bone0346->SetRDir(-7);
Bone0346->SetPosition(472, 962);
var Bone0347 = CreateObject(Bone, 488, 962);
Bone0347->SetR(-51);
Bone0347->SetPosition(488, 962);
var Bone0348 = CreateObject(Bone, 479, 962);
Bone0348->SetR(-51);
Bone0348->SetPosition(479, 962);
var Bone0349 = CreateObject(Bone, 464, 963);
Bone0349->SetR(-51);
Bone0349->SetPosition(464, 963);
Lorry0168->CreateContents(Loam);
Lorry0168->CreateContents(Loam);
Lorry0168->CreateContents(Loam);
Lorry0168->CreateContents(Loam);
Lorry0231->CreateContents(Loam);
Lorry0231->CreateContents(Loam);
Lorry0231->CreateContents(Loam);
Lorry0231->CreateContents(Loam);
CreateObject(Loam, 153, 1235);
CreateObject(Loam, 357, 1320);
CreateObject(Loam, 265, 1454);
@ -301,173 +381,175 @@ func InitializeObjects()
CreateObject(Loam, 1578, 527);
CreateObject(Loam, 1746, 459);
var Metal0228 = CreateObject(Metal, 1922, 978);
Metal0228->SetR(20);
Metal0228->SetPosition(1922, 976);
var Metal0372 = CreateObject(Metal, 1922, 978);
Metal0372->SetR(20);
Metal0372->SetPosition(1922, 976);
var Nugget0229 = CreateObject(Nugget, 812, 590);
Nugget0229->SetClrModulation(0xffffd0a0);
var Nugget0373 = CreateObject(Nugget, 812, 590);
Nugget0373->SetClrModulation(0xffffd0a0);
CreateObject(Nugget, 869, 583);
var Nugget0231 = CreateObject(Nugget, 853, 584);
Nugget0231->SetClrModulation(0xffffd0a0);
var Nugget0232 = CreateObject(Nugget, 823, 584);
Nugget0232->SetClrModulation(0xffffd0a0);
var Nugget0375 = CreateObject(Nugget, 853, 584);
Nugget0375->SetClrModulation(0xffffd0a0);
var Nugget0376 = CreateObject(Nugget, 823, 584);
Nugget0376->SetClrModulation(0xffffd0a0);
Chest0108->CreateContents(GoldBar);
Chest0112->CreateContents(GoldBar);
Chest0111->CreateContents(GoldBar);
Chest0106->CreateContents(GoldBar);
Chest0110->CreateContents(GoldBar);
Lorry0170->CreateContents(GoldBar);
Chest0109->CreateContents(GoldBar);
Chest0108->CreateContents(GoldBar);
Lorry0233->CreateContents(GoldBar);
Chest0107->CreateContents(GoldBar);
Chest0112->CreateContents(GoldBar);
Chest0113->CreateContents(GoldBar);
Chest0114->CreateContents(GoldBar);
Chest0115->CreateContents(GoldBar);
Chest0116->CreateContents(GoldBar);
var GoldBar0242 = Chest0009->CreateContents(GoldBar);
GoldBar0242->SetR(-1);
Chest0119->CreateContents(GoldBar);
var GoldBar0244 = Chest0118->CreateContents(GoldBar);
GoldBar0244->SetR(-97);
var GoldBar0245 = Chest0121->CreateContents(GoldBar);
GoldBar0245->SetClrModulation(0xffffd0a0);
GoldBar0245->SetR(-29);
var GoldBar0246 = CreateObject(GoldBar, 880, 542);
GoldBar0246->SetR(-29);
GoldBar0246->SetClrModulation(0xffffd0a0);
GoldBar0246->SetPosition(880, 540);
ToolsWorkshop0158->CreateContents(GoldBar);
var GoldBar0386 = Chest0009->CreateContents(GoldBar);
GoldBar0386->SetR(-1);
Chest0117->CreateContents(GoldBar);
var GoldBar0388 = Chest0116->CreateContents(GoldBar);
GoldBar0388->SetR(-97);
var GoldBar0389 = Chest0119->CreateContents(GoldBar);
GoldBar0389->SetClrModulation(0xffffd0a0);
GoldBar0389->SetR(-29);
var GoldBar0390 = CreateObject(GoldBar, 880, 542);
GoldBar0390->SetR(-29);
GoldBar0390->SetClrModulation(0xffffd0a0);
GoldBar0390->SetPosition(880, 540);
ToolsWorkshop0156->CreateContents(GoldBar);
CreateObject(GoldBar, 72, 1463);
CreateObject(GoldBar, 2746, 736);
CreateObject(GoldBar, 2507, 1262);
Chest0122->CreateContents(GoldBar);
var GoldBar0252 = CreateObject(GoldBar, 972, 1280);
GoldBar0252->SetR(55);
GoldBar0252->SetPosition(972, 1277);
var GoldBar0394 = CreateObject(GoldBar, 2507, 1262);
GoldBar0394->SetR(-6);
GoldBar0394->SetPosition(2507, 1262);
Chest0120->CreateContents(GoldBar);
var GoldBar0396 = CreateObject(GoldBar, 972, 1280);
GoldBar0396->SetR(55);
GoldBar0396->SetPosition(972, 1277);
CreateObject(Ruby, 864, 585);
CreateObject(Ruby, 806, 587);
CreateObject(Ruby, 849, 581);
CreateObject(Ruby, 849, 582);
CreateObject(Ruby, 856, 588);
var Amethyst0261 = CreateObject(Amethyst, 793, 587);
Amethyst0261->SetR(21);
Amethyst0261->SetPosition(793, 583);
var Amethyst0405 = CreateObject(Amethyst, 793, 588);
Amethyst0405->SetR(22);
Amethyst0405->SetPosition(793, 584);
CreateObject(Amethyst, 885, 561);
CreateObject(Amethyst, 828, 585);
Lorry0168->CreateContents(Dynamite);
Lorry0168->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Lorry0231->CreateContents(Dynamite);
Lorry0231->CreateContents(Dynamite);
Chest0107->CreateContents(Dynamite);
Chest0107->CreateContents(Dynamite);
Chest0107->CreateContents(Dynamite);
CreateObject(Dynamite, 1046, 722);
Chest0106->CreateContents(Dynamite);
Chest0105->CreateContents(Dynamite);
Chest0106->CreateContents(Dynamite);
Chest0105->CreateContents(Dynamite);
Chest0104->CreateContents(Dynamite);
Chest0103->CreateContents(Dynamite);
Chest0111->CreateContents(Dynamite);
Chest0111->CreateContents(Dynamite);
Chest0111->CreateContents(Dynamite);
Chest0114->CreateContents(Dynamite);
Chest0114->CreateContents(Dynamite);
Chest0114->CreateContents(Dynamite);
Chest0104->CreateContents(Dynamite);
Chest0103->CreateContents(Dynamite);
Chest0101->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Chest0109->CreateContents(Dynamite);
Chest0112->CreateContents(Dynamite);
Chest0112->CreateContents(Dynamite);
Chest0112->CreateContents(Dynamite);
var Bow0284 = Clonk0175->CreateContents(Bow);
var Bow0434 = Clonk0238->CreateContents(Bow);
var Arrow0285 = Bow0284->CreateContents(Arrow);
Arrow0285->SetR(90);
var Arrow0286 = Clonk0175->CreateContents(Arrow);
Arrow0286->SetR(90);
var Arrow0287 = CreateObject(Arrow, 313, 431);
Arrow0287->SetR(90);
Arrow0287->SetPosition(313, 431);
var Arrow0288 = CreateObject(Arrow, 313, 431);
Arrow0288->SetR(90);
Arrow0288->SetPosition(313, 431);
var Arrow0289 = CreateObject(Arrow, 313, 431);
Arrow0289->SetR(90);
Arrow0289->SetPosition(313, 431);
var Arrow0290 = CreateObject(Arrow, 313, 431);
Arrow0290->SetR(90);
Arrow0290->SetPosition(313, 431);
var Arrow0291 = CreateObject(Arrow, 313, 431);
Arrow0291->SetR(90);
Arrow0291->SetPosition(313, 431);
var Arrow0292 = CreateObject(Arrow, 313, 431);
Arrow0292->SetR(90);
Arrow0292->SetPosition(313, 431);
var Arrow0293 = CreateObject(Arrow, 313, 431);
Arrow0293->SetR(90);
Arrow0293->SetPosition(313, 431);
var Arrow0294 = CreateObject(Arrow, 313, 431);
Arrow0294->SetR(90);
Arrow0294->SetPosition(313, 431);
var Arrow0295 = CreateObject(Arrow, 313, 431);
Arrow0295->SetR(90);
Arrow0295->SetPosition(313, 431);
var Arrow0435 = Bow0434->CreateContents(Arrow);
Arrow0435->SetR(90);
var Arrow0436 = Clonk0238->CreateContents(Arrow);
Arrow0436->SetR(90);
var Arrow0437 = CreateObject(Arrow, 313, 431);
Arrow0437->SetR(90);
Arrow0437->SetPosition(313, 431);
var Arrow0438 = CreateObject(Arrow, 313, 431);
Arrow0438->SetR(90);
Arrow0438->SetPosition(313, 431);
var Arrow0439 = CreateObject(Arrow, 313, 431);
Arrow0439->SetR(90);
Arrow0439->SetPosition(313, 431);
var Arrow0440 = CreateObject(Arrow, 313, 431);
Arrow0440->SetR(90);
Arrow0440->SetPosition(313, 431);
var Arrow0441 = CreateObject(Arrow, 313, 431);
Arrow0441->SetR(90);
Arrow0441->SetPosition(313, 431);
var Arrow0442 = CreateObject(Arrow, 313, 431);
Arrow0442->SetR(90);
Arrow0442->SetPosition(313, 431);
var Arrow0443 = CreateObject(Arrow, 313, 431);
Arrow0443->SetR(90);
Arrow0443->SetPosition(313, 431);
var Arrow0444 = CreateObject(Arrow, 313, 431);
Arrow0444->SetR(90);
Arrow0444->SetPosition(313, 431);
var Arrow0445 = CreateObject(Arrow, 313, 431);
Arrow0445->SetR(90);
Arrow0445->SetPosition(313, 431);
Chest0107->CreateContents(Bread);
Chest0107->CreateContents(Bread);
Lorry0170->CreateContents(Bread);
Lorry0170->CreateContents(Bread);
Lorry0170->CreateContents(Bread);
Chest0105->CreateContents(Bread);
Chest0105->CreateContents(Bread);
Lorry0233->CreateContents(Bread);
Lorry0233->CreateContents(Bread);
Lorry0233->CreateContents(Bread);
Chest0107->CreateContents(DynamiteBox);
Chest0107->CreateContents(DynamiteBox);
Chest0118->CreateContents(DynamiteBox);
Chest0118->CreateContents(DynamiteBox);
Chest0105->CreateContents(DynamiteBox);
Chest0105->CreateContents(DynamiteBox);
Chest0116->CreateContents(DynamiteBox);
Chest0116->CreateContents(DynamiteBox);
Chest0117->CreateContents(DynamiteBox);
Chest0117->CreateContents(DynamiteBox);
Chest0120->CreateContents(DynamiteBox);
Chest0113->CreateContents(DynamiteBox);
Chest0119->CreateContents(DynamiteBox);
Chest0119->CreateContents(DynamiteBox);
Chest0122->CreateContents(DynamiteBox);
Chest0115->CreateContents(DynamiteBox);
Chest0121->CreateContents(DynamiteBox);
Clonk0189->CreateContents(Sword);
Clonk0182->CreateContents(Sword);
Chest0109->CreateContents(Sword);
Clonk0196->CreateContents(Sword);
Clonk0196->CreateContents(Sword);
Clonk0252->CreateContents(Sword);
Clonk0245->CreateContents(Sword);
Chest0107->CreateContents(Sword);
Clonk0259->CreateContents(Sword);
Clonk0259->CreateContents(Sword);
var Seaweed0315 = CreateObject(Seaweed, 2494, 1263);
Seaweed0315->SetPhase(55);
var Seaweed0318 = CreateObject(Seaweed, 2508, 1263);
Seaweed0318->SetPhase(47);
var Seaweed0321 = CreateObject(Seaweed, 2520, 1263);
Seaweed0321->SetPhase(24);
var Seaweed0324 = CreateObject(Seaweed, 2508, 1263);
Seaweed0324->SetPhase(24);
var Seaweed0327 = CreateObject(Seaweed, 2503, 1263);
Seaweed0327->SetPhase(50);
var Seaweed0330 = CreateObject(Seaweed, 2526, 1262);
Seaweed0330->SetPhase(50);
var Seaweed0333 = CreateObject(Seaweed, 2514, 1262);
Seaweed0333->SetPhase(50);
var Seaweed0336 = CreateObject(Seaweed, 2499, 1263);
Seaweed0336->SetPhase(50);
var Seaweed0339 = CreateObject(Seaweed, 2663, 1278);
Seaweed0339->SetPhase(53);
var Seaweed0342 = CreateObject(Seaweed, 2769, 1272);
Seaweed0342->SetPhase(53);
var Seaweed0345 = CreateObject(Seaweed, 2751, 1279);
Seaweed0345->SetPhase(53);
var Seaweed0348 = CreateObject(Seaweed, 2762, 1271);
Seaweed0348->SetPhase(53);
var Seaweed0351 = CreateObject(Seaweed, 2775, 1279);
Seaweed0351->SetPhase(53);
var Seaweed0354 = CreateObject(Seaweed, 2762, 1271);
Seaweed0354->SetPhase(53);
var Seaweed0357 = CreateObject(Seaweed, 2661, 1278);
Seaweed0357->SetPhase(53);
var Seaweed0360 = CreateObject(Seaweed, 2416, 1245);
Seaweed0360->SetPhase(13);
var Seaweed0363 = CreateObject(Seaweed, 2395, 1239);
Seaweed0363->SetPhase(13);
var Seaweed0366 = CreateObject(Seaweed, 2396, 1239);
Seaweed0366->SetPhase(13);
var Seaweed0369 = CreateObject(Seaweed, 2332, 1145);
Seaweed0369->SetPhase(13);
var Seaweed0372 = CreateObject(Seaweed, 2407, 1246);
Seaweed0372->SetPhase(13);
var Seaweed0465 = CreateObject(Seaweed, 2494, 1263);
Seaweed0465->SetPhase(41);
var Seaweed0468 = CreateObject(Seaweed, 2508, 1263);
Seaweed0468->SetPhase(33);
var Seaweed0471 = CreateObject(Seaweed, 2520, 1263);
Seaweed0471->SetPhase(10);
var Seaweed0474 = CreateObject(Seaweed, 2508, 1263);
Seaweed0474->SetPhase(10);
var Seaweed0477 = CreateObject(Seaweed, 2503, 1263);
Seaweed0477->SetPhase(36);
var Seaweed0480 = CreateObject(Seaweed, 2526, 1262);
Seaweed0480->SetPhase(36);
var Seaweed0483 = CreateObject(Seaweed, 2516, 1263);
Seaweed0483->SetPhase(36);
var Seaweed0486 = CreateObject(Seaweed, 2499, 1263);
Seaweed0486->SetPhase(36);
var Seaweed0489 = CreateObject(Seaweed, 2663, 1278);
Seaweed0489->SetPhase(39);
var Seaweed0492 = CreateObject(Seaweed, 2769, 1272);
Seaweed0492->SetPhase(39);
var Seaweed0495 = CreateObject(Seaweed, 2751, 1279);
Seaweed0495->SetPhase(39);
var Seaweed0498 = CreateObject(Seaweed, 2762, 1271);
Seaweed0498->SetPhase(39);
var Seaweed0501 = CreateObject(Seaweed, 2775, 1279);
Seaweed0501->SetPhase(39);
var Seaweed0504 = CreateObject(Seaweed, 2762, 1271);
Seaweed0504->SetPhase(39);
var Seaweed0507 = CreateObject(Seaweed, 2659, 1279);
Seaweed0507->SetPhase(39);
var Seaweed0510 = CreateObject(Seaweed, 2416, 1245);
Seaweed0510->SetPhase(77);
var Seaweed0513 = CreateObject(Seaweed, 2395, 1239);
Seaweed0513->SetPhase(77);
var Seaweed0516 = CreateObject(Seaweed, 2396, 1239);
Seaweed0516->SetPhase(77);
var Seaweed0519 = CreateObject(Seaweed, 2332, 1145);
Seaweed0519->SetPhase(77);
var Seaweed0522 = CreateObject(Seaweed, 2407, 1246);
Seaweed0522->SetPhase(77);
CreateObject(Mushroom, 1580, 760);
CreateObject(Mushroom, 1613, 776);
@ -480,44 +562,50 @@ func InitializeObjects()
CreateObject(Balloon, 491, 383);
var Barrel0408 = CreateObject(Barrel, 623, 456);
Barrel0408->SetColor(0xff000000);
var Barrel0558 = CreateObject(Barrel, 623, 456);
Barrel0558->SetColor(0xff000000);
CreateObject(Sproutberry, 1823, 488);
CreateObject(Sproutberry, 1823, 488);
CreateObject(Sproutberry, 1823, 488);
var LotsOfCoins0413 = CreateObject(LotsOfCoins, 838, 592);
LotsOfCoins0413.Plane = 500;
var Boompack0563 = CreateObject(Boompack, 543, 383);
Boompack0563->SetColor(0xff);
var Boompack0564 = CreateObject(Boompack, 548, 384);
Boompack0564->SetColor(0xff);
var Boompack0565 = CreateObject(Boompack, 1948, 713);
Boompack0565->SetColor(0xff);
var Boompack0566 = CreateObject(Boompack, 1944, 487);
Boompack0566->SetR(135);
Boompack0566->SetColor(0xff);
Boompack0566->SetPosition(1944, 483);
var Boompack0448 = CreateObject(Boompack, 543, 383);
Boompack0448->SetColor(0xff);
var Boompack0468 = CreateObject(Boompack, 548, 384);
Boompack0468->SetColor(0xff);
var Boompack0470 = CreateObject(Boompack, 1948, 713);
Boompack0470->SetColor(0xff);
var Boompack0471 = CreateObject(Boompack, 1944, 487);
Boompack0471->SetR(135);
Boompack0471->SetColor(0xff);
Boompack0471->SetPosition(1944, 483);
g_golden_shovel = CreateObject(Shovel, 1841, 1011);
g_golden_shovel->SetMeshMaterial("GoldenShovel", 0);
g_golden_shovel.StaticSaveVar = "g_golden_shovel";
var GemOfPower0414 = CreateObject(GemOfPower, 825, 572);
GemOfPower0414->SetCategory(C4D_StaticBack);
CreateObject(Pipe, 1838, 1016);
CreateObject(Firestone, 564, 1135);
CreateObject(Firestone, 552, 1135);
CreateObject(Firestone, 562, 1135);
CreateObject(Firestone, 571, 1135);
CreateObject(Firestone, 567, 1135);
CreateObject(Firestone, 558, 1135);
CreateObject(Firestone, 546, 1135);
CreateObject(Firestone, 560, 1135);
CreateObject(Firestone, 546, 1135);
CreateObject(Firestone, 546, 1135);
CreateObject(Firestone, 555, 1135);
CreateObject(Firestone, 562, 1135);
CreateObject(Firestone, 550, 1135);
CreateObject(Firestone, 552, 1135);
var LotsOfCoins0567 = CreateObject(LotsOfCoins, 838, 592);
LotsOfCoins0567.Plane = 500;
var GemOfPower0575 = CreateObject(GemOfPower, 825, 572);
GemOfPower0575->SetCategory(C4D_StaticBack);
CreateObject(Firestone, 564, 1136);
CreateObject(Firestone, 552, 1136);
CreateObject(Firestone, 562, 1136);
CreateObject(Firestone, 571, 1136);
CreateObject(Firestone, 567, 1136);
CreateObject(Firestone, 558, 1136);
CreateObject(Firestone, 546, 1136);
CreateObject(Firestone, 560, 1136);
CreateObject(Firestone, 546, 1136);
CreateObject(Firestone, 546, 1136);
CreateObject(Firestone, 555, 1136);
CreateObject(Firestone, 562, 1136);
CreateObject(Firestone, 550, 1136);
CreateObject(Firestone, 552, 1136);
CreateObject(Firestone, 342, 1225);
CreateObject(Firestone, 166, 1261);
CreateObject(Firestone, 234, 1424);
@ -536,5 +624,6 @@ func InitializeObjects()
CreateObject(Firestone, 2161, 943);
CreateObject(Firestone, 2073, 862);
CreateObject(Firestone, 2064, 852);
return true;
}

View File

@ -1,13 +1,16 @@
/**
Treasure Hunt
Find the treasure and sell it
Find the treasure and swap it for a barrel of oil
@authors Sven2
*/
static g_is_initialized; // set after first player join
static g_max_player_num; // max number of players that were ever joined
static g_plr_inventory; // array indexed by players: Array containing inventory of Clonk jsut before it died
static g_plr_inventory; // array indexed by players: Array containing inventory of Clonk just before it died
static npc_pyrit, npc_dagobert, npc_tarzan;
static g_got_gem_task, g_got_oil, g_goal, g_treasure_collected;
func Initialize()
{
@ -17,18 +20,10 @@ func Initialize()
func DoInit(int first_player)
{
CreateObject(Flagpole, 210,1185, first_player);
var flagpole = CreateObject(Flagpole, 210,1185, first_player);
ClearFreeRect(530,1135, 50,2);
// Intro. Show message twice for longer duration.
Schedule(nil, Format("GameCall(%v, %d)", "DoIntroMessage", first_player), 50, 1);
Schedule(nil, Format("GameCall(%v, %d)", "DoIntroMessage", first_player), 100, 1);
return true;
}
func DoIntroMessage(int first_player)
{
var talker = GetCursor(first_player);
if (talker) DialogueSimple->MessageBoxAll("$MsgIntro1$", talker, false);
// Start Intro.
StartSequence("Intro", 0, flagpole);
return true;
}
@ -111,13 +106,13 @@ global func FxIntRememberInventoryStop(object clonk, fx, int reason, bool temp)
func EncounterCastle(object enemy, object player)
{
DialogueSimple->MessageBoxAll("$MsgEncounterCastle$", enemy);
Dialogue->MessageBoxAll("$MsgEncounterCastle$", enemy, true);
return true;
}
func EncounterFinal(object enemy, object player)
{
DialogueSimple->MessageBoxAll("$MsgEncounterFinal$", enemy);
Dialogue->MessageBoxAll("$MsgEncounterFinal$", enemy, true);
return true;
}
@ -126,25 +121,47 @@ func EncounterFinal(object enemy, object player)
func OnTreasureCollected(object treasure)
{
DialogueSimple->MessageBoxAll("$MsgTreasureCollected$", treasure->Contained());
g_treasure_collected = true;
Dialogue->MessageBoxAll("$MsgTreasureCollected$", treasure->Contained(), true);
// Dagobert has something new to say now
if (npc_dagobert)
{
var dlg = Dialogue->FindByTarget(npc_dagobert);
if (dlg) dlg->AddAttention();
}
return true;
}
func OnPlaneLoaded(object plane, object oil)
{
if (!plane || !oil) return false; // disappeared in that one frame?
oil->Enter(plane);
g_goal->OnOilDelivered();
return StartSequence("Outro", 0, plane);
}
static g_num_goldbars;
static const MAX_GOLD_BARS = 20;
func OnGoldBarCollected(object collecter)
func OnGoldBarCollected(object collector)
{
++g_num_goldbars;
UpdateLeagueScores();
DialogueSimple->MessageBoxAll(Format("$MsgGoldBarCollected$", g_num_goldbars, MAX_GOLD_BARS), collecter);
Dialogue->MessageBoxAll(Format("$MsgGoldBarCollected$", g_num_goldbars, MAX_GOLD_BARS), collector, true);
return true;
}
public func OnGoalsFulfilled()
{
GainMissionAccess("S2Treasure");
UpdateLeagueScores();
// Return true to force goal rule to not call GameOver() yet, as it will be done by outro sequence
return true;
}
func OnGameOver()
{
GainMissionAccess("S2Treasure");
// Treasure was collected!
// In case gems are collected after game end.
UpdateLeagueScores();
return true;
}
@ -152,8 +169,7 @@ func OnGameOver()
func UpdateLeagueScores()
{
// +50 for finishing and +5 for every gold bar
var goal = FindObject(Find_ID(Goal_TreasureHunt));
var goal_finished = (goal && goal->IsFulfilled());
var goal_finished = (g_goal && g_goal->IsFulfilled());
return SetLeagueProgressScore(g_num_goldbars, g_num_goldbars * 5 + goal_finished * 50);
}
@ -165,7 +181,7 @@ func OnInvincibleDamage(object damaged_target)
var observer = damaged_target->FindObject(Find_ID(Clonk), Find_OCF(OCF_Alive), damaged_target->Sort_Distance());
if (observer)
{
DialogueSimple->MessageBoxAll("$MsgStoneDoorNoDamage$", observer);
Dialogue->MessageBoxAll("$MsgStoneDoorNoDamage$", observer, true);
}
}
return true;

View File

@ -1,6 +1,5 @@
MsgIntro1=Okay, das Juwel der Macht muss hier irgendwo in der Höhle sein. Das Gebiet scheint schwer passierbar. Vielleicht sollten wir uns erst einmal nach Werkzeugen umsehen.
MsgEncounterCastle=Ein Eindringling! Schnappt ihn!
MsgEncounterFinal=Nein nein, der Schatz gehört NUR MIR!
MsgTreasureCollected=Sehr gut! Nun muss der Schatz nur noch zurück zur Flagge.
MsgTreasureCollected=Sehr gut! Nun muss der Schatz nur noch zurück zu Dagobert.
MsgGoldBarCollected=Ich habe einen Goldbarren gefunden! (%d/%d)
MsgStoneDoorNoDamage=Diese Steintür ist zu stabil. Ich sollte einen Schalter suchen.

View File

@ -1,6 +1,5 @@
MsgIntro1=OK, let's go and search for the Gem of Power. The terrain is rough, so we might need to look out for some tools first.
MsgEncounterCastle=Look out, an intruder! Catch him!
MsgEncounterFinal=The treasure is MINE ALONE!
MsgTreasureCollected=Excellent! Now we need to bring the treasure back to the flag.
MsgTreasureCollected=Excellent! Now we need to bring the treasure back to Dagobert.
MsgGoldBarCollected=I've found a gold bar! (%d/%d)
MsgStoneDoorNoDamage=This stone door is too resilient. I should search for a switch.

View File

@ -0,0 +1,34 @@
#appendto Dialogue
/* Ann dialogue */
func Dlg_Ann_1(object clonk)
{
MessageBox("$Ann1$", clonk, dlg_target); // me stuck
return true;
}
func Dlg_Ann_2(object clonk)
{
MessageBox("$Ann2$", clonk, dlg_target); // switch out of range
return true;
}
func Dlg_Ann_3(object clonk)
{
MessageBox("$Ann3$", clonk, clonk); // no way around?
return true;
}
func Dlg_Ann_4(object clonk)
{
MessageBox("$Ann4$", clonk, dlg_target); // nope. need pipe.
return true;
}
func Dlg_Ann_5(object clonk)
{
MessageBox("$Ann5$", clonk, clonk); // hm i should find pipe
SetDialogueProgress(1);
return StopDialogue();
}

View File

@ -0,0 +1,189 @@
#appendto Dialogue
/* Dagobert dialogue */
static g_got_gem_task, g_got_oil, g_goal;
func Dlg_Dagobert_1(object clonk)
{
var gem = FindObject(Find_ID(GemOfPower), Find_AtRect(-20,-20,20,20));
if (g_got_oil)
{
MessageBox("$Dagobert1B$", clonk, dlg_target); // beautiful gem
SetDialogueProgress(1);
StopDialogue();
}
else if (gem)
{
gem->Enter(dlg_target);
MessageBox("$DagobertGem0$", clonk, clonk); // here is gem
SetDialogueProgress(1, "Gem");
}
else
{
MessageBox("$Dagobert1$", clonk, dlg_target); // gold
}
return true;
}
func Dlg_Dagobert_2(object clonk)
{
var options = [["$DagobertGoldQ$", "#Gold"], ["$DagobertOilQ$", "#Oil"], ["$DagobertCaveQ$", "#Cave"], ["$DagobertBye$", "StopDialogue()"]];
MessageBox("", clonk, clonk, nil, false, options);
SetDialogueProgress(1);
return true;
}
func Dlg_Dagobert_Gold1(object clonk)
{
MessageBox("$DagobertGold1$", clonk, dlg_target); // treasures b plenty
return true;
}
func Dlg_Dagobert_Gold2(object clonk)
{
MessageBox("$DagobertGold2$", clonk, clonk); // y u not go?
return true;
}
func Dlg_Dagobert_Gold3(object clonk)
{
MessageBox("$DagobertGold3$", clonk, dlg_target); // lava & water
return true;
}
func Dlg_Dagobert_Gold4(object clonk)
{
MessageBox("$DagobertGold4$", clonk, clonk); // dive?
return true;
}
func Dlg_Dagobert_Gold5(object clonk)
{
MessageBox("$DagobertGold5$", clonk, dlg_target); // can't
SetDialogueProgress(2);
return true;
}
func Dlg_Dagobert_Oil1(object clonk)
{
if (g_got_oil)
{
MessageBox("$DagobertOil1B$", clonk, dlg_target); // oil for gem
SetDialogueProgress(2);
}
else if (g_got_gem_task)
{
MessageBox("$DagobertOil1C$", clonk, dlg_target); // u already got oil
SetDialogueProgress(2);
}
else
{
MessageBox("$DagobertOil1$", clonk, dlg_target); // oil not allowed
}
return true;
}
func Dlg_Dagobert_Oil2(object clonk)
{
MessageBox("$DagobertOil2$", clonk, clonk); // i'll kill harx
return true;
}
func Dlg_Dagobert_Oil3(object clonk)
{
MessageBox("$DagobertOil3$", clonk, dlg_target); // good. i'll help
return true;
}
func Dlg_Dagobert_Oil4(object clonk)
{
MessageBox("$DagobertOil4$", clonk, dlg_target); // hidden treasure
return true;
}
func Dlg_Dagobert_Oil5(object clonk)
{
MessageBox("$DagobertOil5$", clonk, dlg_target); // gem of power
return true;
}
func Dlg_Dagobert_Oil6(object clonk)
{
MessageBox("$DagobertOil6$", clonk, dlg_target); // gem i want
return true;
}
func Dlg_Dagobert_Oil7(object clonk)
{
MessageBox("$DagobertOil7$", clonk, clonk); // ok
g_got_gem_task = true;
if (g_goal) g_goal->OnGotGemTask();
SetDialogueProgress(2);
return true;
}
func Dlg_Dagobert_Cave1(object clonk)
{
MessageBox("$DagobertCave1$", clonk, dlg_target); // lava blocks entry. water below
return true;
}
func Dlg_Dagobert_Cave2(object clonk)
{
MessageBox("$DagobertCave2$", clonk, dlg_target); // reroute water
return true;
}
func Dlg_Dagobert_Cave3(object clonk)
{
MessageBox("$DagobertCave3$", clonk, clonk); // whats inside?
return true;
}
func Dlg_Dagobert_Cave4(object clonk)
{
MessageBox("$DagobertCave4$", clonk, dlg_target); // rough terrain
return true;
}
func Dlg_Dagobert_Cave5(object clonk)
{
MessageBox("$DagobertCave5$", clonk, dlg_target); // u might find tools
SetDialogueProgress(2);
return true;
}
func Dlg_Dagobert_Gem1(object clonk)
{
MessageBox("$DagobertGem1$", clonk, dlg_target); // incredible
return true;
}
func Dlg_Dagobert_Gem2(object clonk)
{
MessageBox("$DagobertGem2$", clonk, dlg_target); // take oil
var barrel = CreateObject(MetalBarrel);
if (barrel)
{
barrel->SetXDir(-15);
barrel->SetYDir(-20);
}
g_got_oil = true;
if (g_goal) g_goal->OnTreasureSold();
return true;
}
func Dlg_Dagobert_Gem3(object clonk)
{
MessageBox("$DagobertGem3$", clonk, dlg_target); // thanks
SetDialogueProgress(1);
return StopDialogue();
}
func Dlg_Dagobert_Init(object clonk)
{
// Localized name
clonk->SetName("$DagobertName$");
return true;
}

View File

@ -0,0 +1,48 @@
#appendto Dialogue
/* Donald dialogue */
static g_golden_shovel;
func Dlg_Donald_1(object clonk)
{
if (g_golden_shovel)
{
if (g_golden_shovel->Contained() == dlg_target) return CallDialogue(clonk, 2, "Shovel");
if (ObjectDistance(g_golden_shovel) < 20) return CallDialogue(clonk, 1, "Shovel");
}
MessageBox("$Donald1$", clonk, dlg_target); // plz help. tools in acid
return true;
}
func Dlg_Donald_2(object clonk)
{
MessageBox("$Donald2$", clonk, clonk); // poor u
return true;
}
func Dlg_Donald_3(object clonk)
{
MessageBox("$Donald3$", clonk, dlg_target); // it was unique tools
return true;
}
func Dlg_Donald_4(object clonk)
{
MessageBox("$Donald4$", clonk, clonk); // i'll look
SetDialogueProgress(1);
return StopDialogue();
}
func Dlg_Donald_Shovel1(object clonk)
{
g_golden_shovel->Enter(dlg_target);
MessageBox("$DonaldShovel1$", clonk, clonk); // here is shovel
}
func Dlg_Donald_Shovel2(object clonk)
{
MessageBox("$DonaldShovel2$", clonk, dlg_target); // thanks 4 shovel
SetDialogueProgress(1);
return StopDialogue();
}

View File

@ -0,0 +1,38 @@
#appendto Dialogue
/* Jane dialogue */
static npc_tarzan;
func Dlg_Jane_1(object clonk)
{
var msg = "$Jane1$"; // he's swinging all day instead of looking 4 gold
if (!npc_tarzan || !npc_tarzan->GetAlive()) msg = "$Jane1B$"; // he's dead instead of looking 4 gold
MessageBox(msg, clonk, dlg_target);
return true;
}
func Dlg_Jane_2(object clonk)
{
MessageBox("$Jane2$", clonk, clonk); // i want rope 2
return true;
}
func Dlg_Jane_3(object clonk)
{
MessageBox("$Jane3$", clonk, dlg_target); // look chest
return true;
}
func Dlg_Jane_4(object clonk)
{
MessageBox("$Jane4$", clonk, dlg_target); // u can carry 2
return true;
}
func Dlg_Jane_5(object clonk)
{
MessageBox("$Jane5$", clonk, dlg_target); // take all plz
SetDialogueProgress(1);
return StopDialogue();
}

View File

@ -0,0 +1,16 @@
#appendto Dialogue
/* Otto dialogue */
func Dlg_Otto_1(object clonk)
{
MessageBox("$Otto1$", clonk, dlg_target); // luv it here
return true;
}
func Dlg_Otto_2(object clonk)
{
MessageBox("$Otto2$", clonk, dlg_target); // look @ that island
SetDialogueProgress(1);
return StopDialogue();
}

View File

@ -0,0 +1,137 @@
#appendto Dialogue
/* Pyrit dialogue */
static g_got_gem_task, g_got_oil;
func Dlg_Pyrit_1(object clonk)
{
var msg = "$Pyrit1$"; // almost done. oil found?
if (!GetEffect("PyritHammering", dlg_target)) msg = "$Pyrit1B$"; // done. oil found?
MessageBox(msg, clonk, dlg_target);
return true;
}
func Dlg_Pyrit_2(object clonk)
{
if (g_got_oil)
{
MessageBox("$PyritQBarrel$", clonk, clonk); // ye. what now?
this.pyrit_answer = "$PyritABarrel$"; // bring to plane
}
else if (g_got_gem_task)
{
MessageBox("$PyritQGem$", clonk, clonk); // where gem?
this.pyrit_answer = "$PyritAGem$"; // look in caves
}
else
{
MessageBox("$PyritQSearch$", clonk, clonk); // where oil?
this.pyrit_answer = "$PyritASearch$"; // ask around
}
return true;
}
func Dlg_Pyrit_3(object clonk)
{
MessageBox(this.pyrit_answer, clonk, dlg_target);
SetDialogueProgress(1);
StopDialogue();
return true;
}
// Generic call on every dlg message of Pyrit
func Dlg_Pyrit(object clonk)
{
// Stop walking.
if (dlg_target->GetCommand())
{
this.was_walk_interrupted = true;
dlg_target->SetCommand("None");
dlg_target->SetComDir(COMD_Stop);
dlg_target->SetXDir();
}
// Yield animation
if (this.anim) dlg_target->StopAnimation(this.anim);
this.anim = 0;
this.anim_continue_frame = FrameCounter() + 50;
return false; // do call specific functions
}
/* NPC animations */
static const Pyrit_Hammer_SwingTime = 40;
func Dlg_Pyrit_StartHammering(object clonk)
{
// Hammers
clonk->CreateContents(Hammer);
clonk->CreateContents(Hammer);
// Clonk moves slowly.
clonk.ActMap = { Prototype = Clonk.ActMap, Walk = { Prototype = Clonk.ActMap.Walk } };
clonk.ActMap.Walk.Speed /= 3;
clonk->SetAction("Walk");
// Hammering animation
AddEffect("PyritHammering", clonk, 1, Pyrit_Hammer_SwingTime+5, this);
return true;
}
func FxPyritHammeringTimer(object c, proplist fx, int time)
{
var fc = FrameCounter();
if (fc < this.anim_continue_frame || c.has_sequence) return FX_OK;
this.anim = 0;
if (!fx.plane) if (!(fx.plane = FindObject(Find_ID(Plane), Sort_Distance()))) return FX_OK;
// After a while, the plane is finished. Prefer to finish while no players are nearby.
if ((fc > 11500 && !ObjectCount(Find_ID(Clonk), Find_InRect(-300,-200,600,400), Find_Not(Find_Owner(NO_OWNER)))) || fc > 24000)
{
fx.plane->SetMeshMaterial(Plane->GetMeshMaterial());
fx.plane->SetR(90);
fx.plane.MeshTransformation=Plane.MeshTransformation;
return FX_Execute_Kill;
}
if ((!Random(20)) || this.was_walk_interrupted)
{
// Move between two places (only if players are joined so Pyrit stays in place for object saving)
var new_pos = [fx.plane->GetX()-24, fx.plane->GetX()+26][c->GetX() < fx.plane->GetX()];
c->SetCommand("MoveTo", nil, new_pos, fx.plane->GetY());
this.anim_continue_frame = FrameCounter() + 50;
this.was_walk_interrupted = false;
}
else
{
// Ensure proper direction
if ((c->GetDir()==DIR_Right) != (c->GetX() < fx.plane->GetX())) { c->SetDir(!c->GetDir()); return FX_OK; }
// No movement: Swing hammer
var anim_idx = Random(4);
var anim_name = ["SwordSlash1.L", "SwordSlash1.R", "SwordSlash2.L", "SwordSlash2.R"][anim_idx];
var anim_len = c->GetAnimationLength(anim_name);
this.anim = c->PlayAnimation(anim_name, 10, Anim_Linear(0,0,anim_len, Pyrit_Hammer_SwingTime, ANIM_Remove), Anim_Const(1000));
// Schedule effect when hammer hits object
var hit_delay = [50,50,30,30][anim_idx] * Pyrit_Hammer_SwingTime / 100;
ScheduleCall(c, Dialogue.Pyrit_HitFx, hit_delay, 1);
}
return FX_OK;
}
func Pyrit_HitFx()
{
var x = (GetDir()*2-1) * 14;
var y = 4;
CreateParticle("StarSpark", x*9/10,y*9/10, PV_Random(-20, 20), PV_Random(-20, 20), PV_Random(10, 20), Particles_Glimmer(), 10);
Sound("Clang?");
return true;
}
func FxPyritHammeringStop(object c, proplist fx, int reason, bool temp)
{
if (!temp && this.anim)
{
c->StopAnimation(this.anim);
this.anim = 0;
}
return FX_OK;
}

View File

@ -0,0 +1,83 @@
#appendto Dialogue
/* Riku dialogue */
static g_got_gem_task, g_treasure_collected;
func Dlg_Riku_1(object clonk)
{
if (g_treasure_collected) return CallDialogue(clonk, 1, "Gem");
MessageBox("$Riku1$", clonk, dlg_target); // looking 4 gold?
return true;
}
func Dlg_Riku_2(object clonk)
{
// This is unlikely, but possible: Player entered the caves without speaking to Dagobert
if (!g_got_gem_task) return CallDialogue(clonk, 1, "Oil");
MessageBox("$Riku2$", clonk, clonk); // looking 4 gem
return true;
}
func Dlg_Riku_3(object clonk)
{
MessageBox("$Riku3$", clonk, dlg_target); // look in treasure chamber
return true;
}
func Dlg_Riku_4(object clonk)
{
MessageBox("$Riku4$", clonk, clonk); // how 2 open door?
return true;
}
func Dlg_Riku_5(object clonk)
{
MessageBox("$Riku5$", clonk, dlg_target); // switches hidden in cave
return true;
}
func Dlg_Riku_6(object clonk)
{
MessageBox("$Riku6$", clonk, clonk); // u search
return true;
}
func Dlg_Riku_7(object clonk)
{
MessageBox("$Riku7$", clonk, dlg_target); // no u do
return true;
}
func Dlg_Riku_8(object clonk)
{
MessageBox("$Riku3$", clonk, clonk); // ok
SetDialogueProgress(1);
return StopDialogue();
}
func Dlg_Riku_Oil1(object clonk)
{
MessageBox("$RikuOil1$", clonk, clonk); // looking 4 oil
return true;
}
func Dlg_Riku_Oil2(object clonk)
{
MessageBox("$RikuOil2$", clonk, dlg_target); // ask dagobert
SetDialogueProgress(1);
return StopDialogue();
}
func Dlg_Riku_Gem1(object clonk)
{
MessageBox("$RikuGem1$", clonk, clonk); // i found gem
return true;
}
func Dlg_Riku_Gem2(object clonk)
{
MessageBox("$RikuGem2$", clonk, dlg_target); // k i keep rest
SetDialogueProgress(1);
return StopDialogue();
}

View File

@ -0,0 +1,134 @@
#appendto Dialogue
/* Sophie1=Teeheehe. Look how it levitates!
Sophie2=Are you a magician?
Sophie3=Nope, it's tele gloves. I've found them in the chest beside me.
Sophie4=There's more of them! Just try them out. Press and hold near a lose item to move it.
SophieSad=Why did you have to take away my playing items? Sophie sad :(
*/
/* Sophie dialogue */
func Dlg_Sophie_1(object clonk)
{
if (!GetEffect("SophieTeleCheck", dlg_target) || !Sophie_FindBone())
{
MessageBox("$SophieSad$", clonk, dlg_target); // sophie sad
SetDialogueProgress(1);
StopDialogue();
}
else
{
MessageBox("$Sophie1$", clonk, dlg_target); // look tele!
}
return true;
}
func Dlg_Sophie_2(object clonk)
{
MessageBox("$Sophie2$", clonk, clonk); // magic?
return true;
}
func Dlg_Sophie_3(object clonk)
{
MessageBox("$Sophie3$", clonk, dlg_target); // nope tele
return true;
}
func Dlg_Sophie_4(object clonk)
{
MessageBox("$Sophie4$", clonk, dlg_target); // get 1 from the box!
SetDialogueProgress(1);
StopDialogue();
return true;
}
// Generic call on every dlg message of Sophie
func Dlg_Sophie(object clonk)
{
// Yield pickup of new items; stop item movement
this.anim_continue_frame = FrameCounter() + 50;
return false; // do call specific functions
}
/* NPC animations */
func Dlg_Sophie_Init(object clonk)
{
// Check timer to see if we can use tele glove
var fx = AddEffect("SophieTeleCheck", clonk, 1, 60, this);
fx.glove = clonk->FindContents(TeleGlove);
fx.wait_time = 100;
return true;
}
func Sophie_FindBone()
{
// find bone to fling around with tele glove
return FindObject(Find_ID(Bone), Find_InRect(-80,-80,160,160), Find_OCF(OCF_InFree), Find_NoContainer(), Sort_Distance());
}
func FxSophieTeleCheckTimer(object c, proplist fx, int time)
{
if (!FindObject(Find_ID(Clonk), Find_InRect(-150,-50,240,150), Find_Exclude(c))) return FX_OK; // only if people are watching
var fc = FrameCounter();
if (fc < this.anim_continue_frame) return FX_OK;
if (GetEffect("SophieTeleUse", c)) return FX_OK;
var bone = Sophie_FindBone();
if (!bone) return FX_OK;
if (!fx.glove) return FX_Execute_Kill;
if (Random(3) >= fx.wait_time++) return FX_OK; // just after using it, take a short break
AddEffect("SophieTeleUse", c, 1, 3, this, nil, fx.glove, bone);
fx.wait_time = 0;
return FX_OK;
}
func FxSophieTeleUseStart(object c, proplist fx, int temp, object glove, object bone)
{
if (temp) return FX_OK;
fx.glove = glove;
fx.bone = bone;
fx.x = fx.bone->GetX()-GetX();
fx.y = fx.bone->GetY()-GetY() - 5;
fx.tx = fx.x;
fx.ty = fx.y;
fx.glove->ControlUseStart(c, fx.x, fx.y);
return FX_OK;
}
func FxSophieTeleUseTimer(object c, proplist fx, int time)
{
if (!fx.glove || !fx.bone) return FX_Execute_Kill;
if (Distance(GetX()+fx.x, GetY()+fx.y, fx.bone->GetX(), fx.bone->GetY()) > 30) return FX_Execute_Kill; // oops - bone dropped
if (fx.x>0) c->SetDir(DIR_Right); else c->SetDir(DIR_Left);
var fc = FrameCounter();
if (fx.bored)
{
// Got bored of it? Wait for a while to stabilize. Then drop item.
if (fc > fx.bored) return FX_Execute_Kill;
}
else if (time > 20 && fc >= this.anim_continue_frame) // Wait a bit in the beginning. Wait while talking.
{
if (!Random(30) && Abs(fx.x)>15) fx.bored = fc + 30;
// Move to random locations
if (fx.tx == fx.x && fx.ty == fx.y)
{
fx.tx = Random(91)-45;
fx.ty = Random(50)-50;
}
fx.x += BoundBy(fx.tx-fx.x, -3, 3);
fx.y += BoundBy(fx.ty-fx.y, -3, 3);
}
// Keep holding that bone
fx.glove->ControlUseHolding(c, fx.x, fx.y);
return FX_OK;
}
func FxSophieTeleUseStop(object c, proplist fx, int reason, bool temp)
{
if (c && fx.glove) fx.glove->ControlUseStop(c, fx.x,fx.y);
return FX_OK;
}

View File

@ -0,0 +1,84 @@
#appendto Dialogue
/* Tarzan dialogue */
func Dlg_Tarzan_1(object clonk)
{
// Short dialogue as it should not interfere with the NPC activity
MessageBox("$Tarzan1$", clonk, dlg_target); // i'm tarzan
SetDialogueProgress(1);
return StopDialogue();
}
/* NPC animations */
func Dlg_Tarzan_Init(object clonk)
{
// Swinging timer
var fx = AddEffect("TarzanSwinging", clonk, 1, 7, this);
clonk->SetPosition(750,850);
fx.bows = FindObjects(Find_ID(GrappleBow), Find_Container(clonk));
fx.force_shot = true;
return true;
}
func FxTarzanSwingingTimer(object c, proplist fx, int time)
{
// Wait for animations, etc?
var fc = FrameCounter();
SetComDir(COMD_Stop);
if (fc < fx.wait) return FX_OK;
// only if someone is looking
if (!fx.force_shot) if (!FindObject(Find_ID(Clonk), Find_InRect(-180,-20,210,90), Find_Not(Find_Owner(NO_OWNER)))) return FX_OK;
// Time to switch grappler?
if (fc > fx.switch_time)
{
fx.switch_time = 0;
fx.curr_bow = 1 - fx.curr_bow;
}
// check current grappler
fx.bow = fx.bows[fx.curr_bow];
if (!fx.bow) return FX_Execute_Kill; // oops. lost our bow.
var hook = fx.bow->EnsureHook();
if (!hook) return FX_Execute_Kill; // something went terribly wrong
if (hook->Contained() == fx.bow)
{
fx.wait = fc + 40;
// The hook is not shot yet - shoot it!
// But stay in the middle of the area
var shoot_off = BoundBy(670 + Random(130) - GetX(), -50,50);
fx.bow->ControlUseStart(c, shoot_off, -50);
fx.bow->ControlUseStop(c, shoot_off, -50);
fx.switch_time = fc + 70 + Random(40);
fx.force_shot = false;
return FX_OK;
}
// Unstick
if (GetProcedure() == "SCALE")
{
SetAction("Jump");
if (GetDir()) SetXDir(-5); else SetXDir(5);
SetYDir(-10);
return FX_OK;
}
// Turn
if (GetXDir() > 0) SetDir(DIR_Right); else SetDir(DIR_Left);
// Move along rope
var grapple_fx = GetEffect("IntGrappleControl", c);
if (!grapple_fx) return FX_OK;
grapple_fx.mv_down = grapple_fx.mv_up = grapple_fx.mv_left = grapple_fx.mv_right = 0;
var want_dy = 900 - GetY();
if (want_dy < 0)
{
// We sunk too low - climb up
grapple_fx.mv_up = 1;
fx.switch_time = Max(fx.switch_time, fc + 20); // make sure we continue climbing
}
else
{
// No need to climb? Then swing.
if (GetXDir() < 0) grapple_fx.mv_left=1; else grapple_fx.mv_right=1;
}
return FX_OK;
}

View File

@ -0,0 +1,15 @@
#appendto MetalBarrel
func Exit(...)
{
// dropping at plane? then put into plane
if (Contained() && Contained()->GetAlive())
{
var plane = FindObject(Find_ID(Plane), Find_AtPoint());
if (plane)
{
ScheduleCall(nil, Global.GameCall, 1,1, "OnPlaneLoaded", plane, this);
}
}
return inherited(...);
}

View File

@ -0,0 +1,25 @@
#appendto Plane
// plane needs oil
public func ContainedUp(object clonk, ...)
{
if (!FuelCheck(clonk)) return true;
return _inherited(clonk, ...);
}
public func ContainedDown(object clonk, ...)
{
if (!FuelCheck(clonk)) return true;
return _inherited(clonk, ...);
}
func FuelCheck(object clonk)
{
if (!FindContents(MetalBarrel))
{
Dialogue->MessageBox("$PlaneNoOil$", clonk, clonk);
clonk->Sound("WipfWhine");
return false;
}
return true;
}

View File

@ -0,0 +1,180 @@
/* Intro sequence */
#appendto Sequence
static npc_pyrit, g_goal;
func Intro_Init(object flagpole)
{
// Fix plane outside landscape for now
this.plane = CreateObject(Plane, 100,-20);
this.plane->FaceRight();
this.plane->SetR(80);
this.plane->SetColor(0xa04000);
this.plane_Hit = this.plane.Hit;
this.plane.Hit = this.Intro_PlaneHit;
this.plane.intro_seq = this;
this.plane_cat = this.plane->GetCategory();
this.plane->SetCategory(C4D_StaticBack);
this.plane->MakeInvincible();
// Pyrit the pilot
this.pilot = npc_pyrit = CreateObject(Clonk, 100, 100, NO_OWNER);
this.pilot->MakeInvincible();
this.pilot->MakeNonFlammable();
this.pilot->SetSkin(2);
this.pilot->Enter(this.plane);
this.pilot->SetAction("Walk");
this.pilot->SetName("Pyrit");
this.pilot->SetColor(0xff0000);
this.pilot->SetDir(DIR_Left);
this.pilot->SetObjectLayer(this.pilot);
// Pyit has a red hat!
this.pilot->AttachMesh(Hat, "skeleton_head", "main", Trans_Translate(0,5500));
// Dialogue object also used as helper container for clonks
this.dialogue = this.pilot->SetDialogue("Pyrit");
this.dialogue->SetInteraction(false);
}
func Intro_Start(object flagpole)
{
// Intro starts at flagpole; some time before plane drops
this.flagpole = flagpole;
SetViewTarget(this.flagpole);
SetPlayerZoomByViewRange(NO_OWNER, 800,600, PLRZOOM_Set); // zoom out from plane
return ScheduleNext(80);
}
func Intro_JoinPlayer(int plr)
{
// Players joining initially start out in plane
// Late joiners are placed at flagpole
for(var index = 0, crew; crew = GetCrew(plr, index); ++index)
{
if (this.plane_crashed)
crew->SetPosition(this.flagpole->GetX(), this.flagpole->GetY());
else
crew->Enter(this.dialogue);
}
return true;
}
func Intro_1()
{
// Start plane drop
this.plane->SetCategory(this.plane_cat);
this.plane->SetPosition(50,840);
this.plane->SetXDir(100);
this.plane->SetYDir(200);
this.plane->SetR(170);
return ScheduleNext(10);
}
func Intro_2()
{
// Plane drop sound when it enters view range
if (this.plane->GetY() > 900)
Sound("PlaneDrop", true);
else
ScheduleSame(2);
return true;
}
func Intro_PlaneHit()
{
// Plane hit ground! Continue sequence.
Sound("PlaneCrash", true);
SetR(-90);
var particles = Particles_Smoke(true);
particles.Size = PV_Linear(PV_Random(20, 60), PV_Random(50, 100));
CreateParticle("Smoke", PV_Random(-30,30), PV_Random(-30,30), PV_Random(-60, 60), PV_Random(-20,0), PV_Random(200, 500), particles, 20);
particles.Size = PV_Linear(PV_Random(50, 80), PV_Random(100, 200));
CreateParticle("Smoke", PV_Random(-30,30), PV_Random(-30,30), PV_Random(-20, 20), PV_Random(-20,0), PV_Random(100, 200), particles, 20);
for (var iplr=0,plr; iplr<GetPlayerCount(C4PT_User); ++iplr)
{
plr = GetPlayerByIndex(iplr, C4PT_User);
var icrew=0,crew;
while (crew=GetCrew(plr, icrew++))
{
crew->Exit(0,-5, 0, Random(1)+1, Random(5)-6);
crew->SetAction("Tumble");
}
}
SetMeshMaterial("CrashedAirplane");
this.MeshTransformation=Trans_Mul(Trans_Rotate(10,0,2,1), Plane.MeshTransformation);
this.Hit = this.intro_seq.plane_Hit;
this.intro_seq.plane_crashed = true;
this.intro_seq->ScheduleNext(50);
return true;
}
func Intro_3()
{
MessageBox_last_pos = true; // force first message right side of screen
MessageBoxAll("$Intro1$", GetHero(), true); // pyrit?
return ScheduleNext(50);
}
func Intro_4()
{
npc_pyrit->Exit();
return ScheduleNext(30);
}
func Intro_5()
{
Dialogue->SetSpeakerDirs(npc_pyrit, GetHero());
MessageBoxAll("$Intro2$", GetHero(), true); // y out of fuel?
return ScheduleNext(320);
}
func Intro_6()
{
MessageBoxAll("$Intro3$", npc_pyrit, true); // cuz detour
return ScheduleNext(400);
}
func Intro_7()
{
MessageBoxAll("$Intro4$", GetHero(), true); // ur fault
return ScheduleNext(200);
}
func Intro_8()
{
MessageBoxAll("$Intro5$", GetHero(), true); // what now?
return ScheduleNext(200);
return Stop();
}
func Intro_9()
{
MessageBoxAll("$Intro6$", npc_pyrit, true); // u oil, me plane
return ScheduleNext(330);
}
func Intro_10()
{
MessageBoxAll("$Intro7$", GetHero(), true); // ok
return ScheduleNext(80);
}
func Intro_11()
{
return Stop();
}
func Intro_Stop()
{
this.dialogue->SetInteraction(true);
this.dialogue->AddAttention();
this.dialogue->Dlg_Pyrit_StartHammering(npc_pyrit);
SetPlayerZoomByViewRange(NO_OWNER, 400,300, PLRZOOM_Set);
g_goal = CreateObject(Goal_TreasureHunt, 0, 0);
return true;
}

View File

@ -0,0 +1,81 @@
/* End sequence */
#appendto Sequence
func Outro_Start(object plane)
{
// Player closest to plane becomes outro protagonist
this.plane = plane;
GetHero(npc_pyrit);
SetPlayerZoomByViewRange(NO_OWNER, 200,100, PLRZOOM_Set | PLRZOOM_LimitMax);
SetViewTarget(GetHero());
npc_pyrit.has_sequence = true; // Pyrit stops hammering
this.plane->SetR(90); // in case Pyrit isn't done yet
this.plane.MeshTransformation=Plane.MeshTransformation;
var max_unstick = 10;
while (this.plane->Stuck() && max_unstick--) this.plane->SetPosition(this.plane->GetX(), this.plane->GetY()-1);
return ScheduleNext(5);
}
func Outro_1()
{
Dialogue->SetSpeakerDirs(GetHero(), npc_pyrit);
MessageBoxAll("$Outro1$", npc_pyrit, true); // took u a while
return ScheduleNext(200);
}
func Outro_2()
{
Dialogue->SetSpeakerDirs(GetHero(), npc_pyrit);
MessageBoxAll("$Outro2$", GetHero(), true); // plane looks good
return ScheduleNext(200);
}
func Outro_3()
{
MessageBoxAll("$Outro3$", npc_pyrit, true); // let'sgo
return ScheduleNext(150);
}
func Outro_4()
{
// Pyrit enters plane. Rest leaves to make sure Pyrit is pilot.
var clonk;
while (clonk = this.plane->FindContents(Clonk)) clonk->Exit();
npc_pyrit->SetCommand("Enter", this.plane);
return ScheduleNext(30);
}
func Outro_5()
{
if (npc_pyrit->Contained() != this.plane) return ScheduleSame(5);
// After Pyrit is inside, rest enters freely
this.plane->SetEntrance(true);
for (var clonk in this.plane->FindObjects(this.plane->Find_AtRect(-60,-30,120,60), Find_ID(Clonk), Find_Not(Find_Owner(NO_OWNER))))
clonk->SetCommand("Enter", this.plane);
return ScheduleNext(100);
}
func Outro_6()
{
this.plane->FaceRight();
this.plane->StartFlight(15);
return ScheduleNext(100);
}
func Outro_7()
{
this.plane->ContainedLeft(npc_pyrit);
return ScheduleNext(100);
}
func Outro_8()
{
return Stop();
}
func Outro_Stop()
{
GameOver();
return true;
}

View File

@ -0,0 +1,98 @@
PlaneNoOil=Das Flugzeug braucht noch Treibstoff. Ich muss irgendwo Öl auftreiben.
Intro1=Autsch. Pyrit!
Intro2=Wie kann der Treibstoff leer sein? Du sagtest doch, ein Fass Öl bringt uns locker an unser Ziel und zurück!
Intro3=Dachte ich auch. Aber da wusste ich noch nicht, dass ich drei Tage über dem Ozean kreisen und auf einer einsamen Insel suchen müsste.
Intro4=Das ist alles deine Schuld. Ich sags ja nur.
Intro5=Was können wir nun tun?
Intro6=Ich schlage vor du suchst neues Öl und ich repariere derweil das Flugzeug.
Intro7=Klingt gut.
Pyrit1=Ich bin fast fertig. Hast du das Öl schon gefunden?
Pyrit1B=Das Flugzeug ist wieder bereit. Hast du das Öl schon gefunden?
PyritQBarrel=Was soll ich mit dem Ölfass tun?
PyritABarrel=Bringe es zum Flugzeug. D'oh.
PyritQSearch=Wo finde ich Öl?
PyritASearch=Keine Ahnung. Wie hast du es letztes Mal gefunden? Sieh dich um und frage andere clonks.
PyritQGem=Hast du ein Juwel der Macht gesehen?
PyritAGem=Ne. Nie gehört. Aber die Höhlen in diesen Bergen sind bekannt für ihre verborgenen Gefahren und Schätze. Vielleicht solltest du dort suchen.
PyritQBye=Tschüss
DagobertName=Dagobert
Dagobert1=Gold...gold...gold...
Dagobert1B=Welch wunderschoönes Kleinod...
DagobertGoldQ=Gold?
DagobertGold1=Es ist ein Hammer! Der Berg ist voll versteckter Schätze, aber ich kann nicht rein.
DagobertGold2=Was ist das Problem?
DagobertGold3=Der Haupteingang ist mit Lava geflutet. Es gibt andere Eingänge weiter unten, aber die sind wiederum mit Wasser vollgelaufen.
DagobertGold4=Könntest du dort nicht durch tauchen?
DagobertGold5=Würde ich gerne, aber meine Arthritis...
DagobertOilQ=Ich brauche Öl
DagobertOil1=Wer braucht das nicht? Aber du weißt vielleicht, dass König Harx es nicht erlaubt.
DagobertOil1B=Bringe mir das Juwel und ich gebe dir Öl.
DagobertOil1C=Ich habe dir bereits mein gesamtes Öl gegeben.
DagobertOil2=Zum Teufel mit Harx. Ich bin auf einer Mission, ihn zu töten.
DagobertOil3=Den König töten. Nun, das kann ich nur unterstützen. Vielleicht helfe ich dir. Aber nicht umsonst...
DagobertOil4=Die Leute reden von einer Kammer tief im Inneren dieses Berges. Sie soll unglaubliche Mengen an Gold enthalten.
DagobertOil5=In dieser Kammer - falls es sie überhaupt gibt - liegt auch das Juwel der Macht{{GemOfPower}}. Es ist ein unscheinbarer, kleiner Edelstein der grün und blau leuchtet.
DagobertOil6=Ich interessiere mich aus persönlichen Gründen für dieses Kleinod. Wenn du es mir bringst, verrate ich dir, wo du Öl finden kannst. Und du kannst den Rest des Schatzes behalten!
DagobertOil7=Klingt fair. Ich werde nach dem Edelstein suchen.
DagobertCaveQ=Wie komme ich in die Höhle?
DagobertCave1=Der Haupteingang ist von Lava blockiert. Dort vorbei zu kommen, könnte schwierig sein. Es gibt allerdings Nebeneingänge unterhalb.
DagobertCave2=Wenn du das Wasser irgendwie lostwirst, könntest du dort herein kommen.
DagobertCave3=Weißt du, was ich in der Höhle vorfinden werde?
DagobertCave4=Die Höhlen sind rauhes Terrain und viele Forscher sind schon darin verloren gegangen.
DagobertCave5=Einige von ihnen waren jedoch recht erfinderisch. Sie könnten nützliche Werkzeuge zurück gelassen haben, die du auf deiner Mission gebrauchen kannst.
DagobertGem0=Schau her Dagobert, ich habe deinen Edelstein gefunden.
DagobertGem1=Unglaublich, es gibt ihn also wirklich! Sieh nur diese Reinheit. Diese unbefleckte Schönheit. Er wird bei mir in guten Händen sein.
DagobertGem2=Hier, nimm dieses Ölfass.
DagobertGem3=Oh, danke.
DagobertBye=Lebe wohl
Outro1=Endlich hast du das Öl. Hat ja eine Weile gedauert.
Outro2=Ja. Dein Job, ein wenig auf das Flugzeug zu hämmern, war etwas einfacher.
Outro3=Lasst uns keine Zeit verlieren. Nächster Halt: Das Schloss von Hörx!
Riku1=Hallo Fortscherkollege. Suchst du das Gold?
Riku2=Fast. Ich suche das Juwel der Macht.
Riku3=Ach das. Das ist vermutlich auch in der Schatzkammer, die sich hinter diesen verschlossenen Toren verbirgt.
Riku4=Weißt du, wie man sie auf kriegt?
Riku5=Ich glaube, sie werden von Schaltern kontrolliert, die irgendwo hier in den Höhlen versteckt sind.
Riku6=Warum suchst du dann nicht die Schalter?
Riku7=Warum sollte ich? Ich warte einfach hier und gehe dann rein, wenn jemand anderes die Arbeit für mich erledigt hat!
Riku8=Hmpf. Dann muss ich wohl selber suchen.
RikuOil1=Fast. Ich suche nach Öl.
RikuOil2=Hm, Öl. Hast du Dagobert draußen mal gefragt? Er könnte etwas haben.
RikuGem1=Hey Riku. Ich habe das Juwel gefunden.
RikuGem2=Das ist cool! Ich bleibe dann hier und bewache den Rest des Schatzes.
Sophie1=Teeheehe. Schau, es schwebt!
Sophie2=Bist du eine Zauberin?
Sophie3=Nee. Das ist ein Telehandschuh. Ich habe ihn in der Kiste hier neben mir gefunden.
Sophie4=Dort sind noch mehr! Probiere sie mal aus. Einfach mit der Maus neben einen der Gegenstände zeigen und die Taste gedrückt halten um es zu bewegen.
SophieSad=Warum hast du mir mein Spielzeug weggenommen? Das ist gemein :(
Jane1=Er sollte nach Schätzen suchen. Stattdessen schwingt er einfach nur den ganzen Tag am Seil hin und her.
Jane1B=Er sollte nach Schätzen suchen. Stattdessen schwang er einfach nur den ganzen Tag am Seil hin und her. Nun ist er tot. Typisch!
Jane2=Cool! Kriege ich auch so ein Seil?
Jane3=Es liegen noch Enterhaken in den Kisten hier. Nimm ihn einfach in die Hand und drücke die Richtung, die du schießen willst. Drücke noch einmal, um wieder loszulassen.
Jane4=Du kannst sogar zwei in jeder Hand einen Enterhaken tragen. Wenn du den zweiten schießt, löst sich der erste automatisch.
Jane5=Bitte nimm die Enterhaken alle mit! Ich hab diese Schwingerei satt.
Tarzan1=Schau her, ich bin Tarzan!
Ann1=Verdammt! Ich stecke fest.
Ann2=Ich weiß, dass dort ein Schalter unter dem Lavasee rechts ist. Aber ich komme nicht heran.
Ann3=Gibt es keinen Weg außen herum?
Ann4=Es ist alles aus solidem Granit. Ich habe hier sogar eine Pumpe gebaut, um die Lava los zu werden. Aber ich habe kein Rohr, das der Hitze der Lava widerstehen könnte.
Ann5=Hm. Vielleicht finde ja irgendwo ein Rohr.
Donald1=Oh, ein Höhlenforscher. Bitte hilf mir! Ich habe meine ganzen Werkzeuge dort unten im Säuresee verloren.
Donald2=Das tut mir ja Leid. Kannst du dir nicht neue Werkzeuge besorgen?
Donald3=Das Rohr ist mir egal. Aber die goldene Schaufel ist ein unersetzbares Andenken. Ich habe sie von meinem Ur-ur-urgroßclonk geerbt!
Donald4=Ach, eine Leitung liegt dort auch sagst du? Vielleicht sollte ich versuchen, dort heran zu kommen.
DonaldShovel1=Hier ist deine Schaufel.
DonaldShovel2=Vielen Dank! Ich stehe auf Ewig in deiner Schuld.
Otto1=Ich liebe diesen einsamen Ort. Er ist so friedlich.
Otto2=Schau nur diese Aussicht. Dort hinten im Osten ist sogar eine schwebende Insel über dem See. Ich frage mich, was dort wohl drauf ist.

View File

@ -0,0 +1,98 @@
PlaneNoOil=The plane needs fuel. I must find oil somewhere.
Intro1=Ouch. Pyrit!
Intro2=How can we be out of fuel? You said one barrel would get us to our goal and back easily!
Intro3=Yeah, but I didn't plan for having to search you for three days and picking you up on a lonely island in the ocean.
Intro4=It's all your fault. Just saying.
Intro5=What shall we do now?
Intro6=I suggest you go and find new oil. Meanwhile, I will repair the plane.
Intro7=Sounds good.
Pyrit1=I'm almost done. Have you found the oil yet?
Pyrit1B=The plane is ready again. Have you found the oil yet?
PyritQBarrel=What do I do with the barrel?
PyritABarrel=Just bring it to the plane. D'oh.
PyritQSearch=Where can I find oil?
PyritASearch=I don't know. How did you find it last time? Just look and ask around I guess.
PyritQGem=Have you seen a Gem of Power?
PyritAGem=No. I've never heard of such a thing. But the caves of these mountains are well known for their hidden dangers and treasures. Maybe you should look inside.
PyritQBye=Bye
DagobertName=Scrooge
Dagobert1=Gold...gold...gold...
Dagobert1B=Such a beautiful gem...
DagobertGoldQ=Gold?
DagobertGold1=It's a shame! This mountain is full of hidden treasures, but I can't get inside.
DagobertGold2=What's the problem?
DagobertGold3=The main entrance to the caves is flooded by lava. There are some other entrances, but they're flooded by water.
DagobertGold4=Couldn't you dive through there.
DagobertGold5=I would love to. But my arthritis...
DagobertOilQ=I need oil
DagobertOil1=Who doesn't? But you know, king Harx won't allow it.
DagobertOil1B=Bring me the gem and I will give you oil.
DagobertOil1C=I've already given you all the oil I have.
DagobertOil2=Screw Harx. I'm on a mission to kill him.
DagobertOil3=Killing the king. Very well, that's a mission I can approve of. Maybe I can help you. But not for free...
DagobertOil4=People talk about a hidden chamber deep within this mountain, which contains unimaginable amounts of gold.
DagobertOil5=In this chamber, there is also the Gem of Power{{GemOfPower}} - an inconspicuous little gem shining in green and teal color.
DagobertOil6=I'm interested in this little gem for personal reasons. If you bring me this little jewel, I will tell you where you can find oil. You can keep the rest of the treasure.
DagobertOil7=Sounds fair. I will look for this gem.
DagobertCaveQ=How can I enter the cave?
DagobertCave1=The main entrance is blocked by lava. That might be hard to pass. However, there are side entrances you might be able to access below.
DagobertCave2=If you can reroute the water somehow, you might be able to get in.
DagobertCave3=Do you know what I will find inside the caves?
DagobertCave4=The caves are rough terrain and many explorers have been lost already.
DagobertCave5=However, some of these explorers are quite ingenious. They might have left behind some useful tools you could use on your mission.
DagobertGem0=Look Scrooge, I have found your gem.
DagobertGem1=Incredible! Look at its purity. Its immaculate beauty. It will be in good hands.
DagobertGem2=Here, just take this oil barrel I had secretly tucked away in my underpants.
DagobertGem3=Oh, thanks a lot.
DagobertBye=Bye
Outro1=Finally you got that oil. That took you a while.
Outro2=Yeah. Your job hammering on the plane was a bit easier.
Outro3=Let's not waste any more time. Next stop: Harx' castle!
Riku1=Hello fellow Explorer. Are you looking for gold?
Riku2=Almost. I'm looking for the Gem of Power.
Riku3=Oh, that one. It's probably in the treasure chamber, whch is locked behind these doors.
Riku4=Do you know how to open them?
Riku5=I think they are controlled by switches hidden somewhere in these caves.
Riku6=Why don't you go search these switches then?
Riku7=Why would I? I'll just enter the treasure chamber when someone else has done the work for me!
Riku8=Hmpf. I guess I'll have to search then.
RikuOil1=Almost. I'm looking for oil.
RikuOil2=Hm, oil. Did you ask Dagobert outside this mountain? He might have an idea.
RikuGem1=Hey Riku, I've found the gem.
RikuGem2=That's cool bro! I'll stay here and keep the rest of the treasure then.
Sophie1=Teeheehe. Look how it levitates!
Sophie2=Are you a magician?
Sophie3=Nope, it's tele gloves. I've found them in the chest beside me.
Sophie4=There's more of them! Just try them out. Press and hold near a lose item to move it.
SophieSad=Why did you have to take away my playing items? Sophie sad :(
Jane1=He's supposed to search for treasures. But he's just swinging his rope all day.
Jane1B=He was supposed to search for treasures. Instead, he was just swinging his rope all day. And now he's dead. Typical.
Jane2=Cool! Can I have a rope too?
Jane3=There's extra grappler bows in the chest. Just put it into your hand and click in the direction you want to shoot. Click again to let go.
Jane4=You can even carry two and have one in each hand. Then when you shoot the second, the first one will automatically retreat.
Jane5=Please take all the bows. I'm sick of this swinging.
Tarzan1=Look, I am Tarzan!
Ann1=Damn I'm stuck.
Ann2=I know there's a switch below this lava lake on the right. But I cannot get there.
Ann3=Is there no way around it?
Ann4=It's all solid granite. I even built a pump to get rid of the lava, but I do not have a pipe that could resist the heat of the lava.
Ann5=Hm. Maybe I can find a pipe somewhere.
Donald1=Oh, fellow explorer, please help me! I've lost all my stuff in this acid lake.
Donald2=Oh, I'm sorry to hear that. Can't you get new tools?
Donald3=The pipes I don't care for. But the shovel is my golden shovel I've inherited from my grand-grand-grandparent! It's irreplacable.
Donald4=Oh, a pipe you said? Hm, maybe I can try to rescue these tools.
DonaldShovel1=Here is your shovel.
DonaldShovel2=Thank you so much! I will be in your debt forever.
Otto1=I love this lonely place. It's so peaceful.
Otto2=Look at the great view. There is a sky island floating above the lake to the east. I wonder what's on there.

View File

@ -2,4 +2,4 @@
id=Goal_TreasureHunt
Version=5,2,0,1
Category=C4D_StaticBack|C4D_Goal
Picture=0,0,128,128
Picture=0,0,64,64

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -8,29 +8,32 @@
#include Library_Goal
local is_fulfilled;
local has_gem_task, got_oil, is_fulfilled;
public func IsFulfilled() { return is_fulfilled; }
public func OnTreasureSold() { is_fulfilled = true; }
public func OnGotGemTask() { SetGraphics("Hunt"); SetName("$Name2$"); return has_gem_task = true; }
public func OnTreasureSold() { SetGraphics(nil); SetName("$Name$"); return got_oil = true; }
public func OnOilDelivered() { return is_fulfilled = true; }
public func GetDescription(int plr)
{
var message;
if (IsFulfilled())
message = "$MsgGoalFulfilled$";
if (is_fulfilled)
return "$MsgGoalFulfilled$";
else if (got_oil)
return "$MsgGotOil$";
else if (has_gem_task)
return "$MsgGoalUnFulfilled$";
else
message = "$MsgGoalUnFulfilled$";
return message;
return "$MsgGoalOil$";
}
public func Activate(int byplr)
{
if (IsFulfilled())
ToggleGoalMessage(Format("$MsgGoalFulfilled$|$MsgSideGoal$", g_num_goldbars, MAX_GOLD_BARS), byplr);
else
ToggleGoalMessage(Format("$MsgGoalUnFulfilled$|$MsgSideGoal$", g_num_goldbars, MAX_GOLD_BARS), byplr);
return;
var desc = GetDescription(byplr);
if (has_gem_task) desc = Format("%s|%s", desc, Format("$MsgSideGoal$", g_num_goldbars, MAX_GOLD_BARS));
ToggleGoalMessage(desc, byplr);
return true;
}
// Shows or hides a message window with information.
@ -50,12 +53,7 @@ private func ToggleGoalMessage(string msg, int plr)
}
protected func FxGoalMessageStart() {}
public func GetShortDescription(int plr)
{
return Name;
}
public func GetShortDescription(int plr) {}
/*-- Proplist --*/
local Name = "$Name$";

View File

@ -1,4 +1,7 @@
Name=Ölsuche
Name=Schatzsuche
MsgSideGoal=Sekundärziel: %d von %d Goldbarren gefunden.
MsgGoalFulfilled=Schatz gefunden und verkauft :-)
MsgGoalUnFulfilled=Schatz noch nicht gefunden und verkauft :-(
MsgGoalOil=Finde ein neues Ölfass.
MsgGotOil=Bringe das Ölfass zum Flugzeug.

View File

@ -1,4 +1,7 @@
Name=Treasure hunt
Name=Oil hunt
Name2=Treasure hunt
MsgSideGoal=Side goal: %d of %d gold bars found.
MsgGoalFulfilled=Treasure found and sold.
MsgGoalUnFulfilled=Treasure not yet found and sold yet.
MsgGoalOil=Find a new oil barrel.
MsgGotOil=Bring the oil barrel to the plane.