File: Script.c

package info (click to toggle)
openclonk 8.1-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 169,516 kB
  • sloc: cpp: 180,479; ansic: 108,988; xml: 31,371; python: 1,223; php: 767; makefile: 145; sh: 101; javascript: 34
file content (186 lines) | stat: -rw-r--r-- 4,698 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
/**
	Treasure Hunt
	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

// Set in Objects.c
//static npc_dagobert, npc_tarzan, g_golden_shovel, g_flagpole, g_golden_idol, g_last_stone_door;
static g_got_gem_task, g_got_oil, g_goal, g_treasure_collected;
static npc_pyrit;

func DoInit(int first_player)
{
	var relaunch_rule = GetRelaunchRule();
	relaunch_rule->SetInventoryTransfer(true);
	relaunch_rule->SetFreeCrew(true);
	relaunch_rule->SetRespawnDelay(1);
	relaunch_rule->SetBaseRespawn(true);
	relaunch_rule->SetDefaultRelaunchCount(nil);
	relaunch_rule->SetAllowPlayerRestart(true);
	relaunch_rule->SetLastClonkRespawn(true);
	relaunch_rule->SetInitialRelaunch(false);
	ClearFreeRect(530,1135, 50,2);
	if (g_last_stone_door) g_last_stone_door->DoDamage(170 - g_last_stone_door->GetDamage());
	if (g_golden_idol)
	{
		g_golden_idol->SetLightRange(150,15);
		g_golden_idol->SetLightColor(0xffc000);
	}
	if (g_golden_shovel)
	{
		g_golden_shovel->SetLightRange(25,15);
		g_golden_shovel->SetLightColor(0xffc000);
	}
	npc_dagobert->SetAlternativeSkin("Beggar");
	// Start Intro.
	StartSequence("Intro", 0, g_flagpole);
	return true;
}

func InitializePlayer(int plr)
{
	// Players only
	if (GetPlayerType(plr)!=C4PT_User) return;
	// Scenario init
	if (!g_is_initialized) g_is_initialized = DoInit(plr);
	// Harsh zoom range
	for (var flag in [PLRZOOM_LimitMax, PLRZOOM_Direct])
		SetPlayerZoomByViewRange(plr,400,250,flag);
	SetPlayerViewLock(plr, true);
	// Create per-player-counted tools
	if (g_max_player_num < GetPlayerCount(C4PT_User))
	{
		++g_max_player_num;
		for (var obj in FindObjects(Find_ID(Chest)))
			if (obj.tool_spawn)
				obj->CreateContents(obj.tool_spawn);
	}
	// Initial join
	JoinPlayer(plr);
	GetCrew(plr)->CreateContents(Shovel);
	return true;
}

func JoinPlayer(int plr)
{
	// Place in village
	var crew;
	for(var index = 0; crew = GetCrew(plr, index); ++index)
	{
		var x = 190 + Random(20);
		var y = 1175;
		crew->SetPosition(x , y);
		crew->SetDir(DIR_Right);
		crew->DoEnergy(1000);
	}
	return true;
}


/* Enemy encounter messages */

func EncounterCastle(object enemy, object player)
{
	Dialogue->MessageBoxAll("$MsgEncounterCastle$", enemy, true);
	return true;
}

func EncounterFinal(object enemy, object player)
{
	Dialogue->MessageBoxAll("$MsgEncounterFinal$", enemy, true);
	return true;
}


/* Events */

func OnTreasureCollected(object treasure)
{
	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 collector)
{
	++g_num_goldbars;
	var sAchievement = "";
	if (g_num_goldbars==MAX_GOLD_BARS/4)
	{
		sAchievement = "|$Achieve5$";
		GainScenarioAchievement("Bars", 1);
	}
	else if (g_num_goldbars==MAX_GOLD_BARS/2)
	{
		sAchievement = "|$Achieve10$";
		GainScenarioAchievement("Bars", 2);
	}
	else if (g_num_goldbars==MAX_GOLD_BARS)
	{
		sAchievement = "|$Achieve20$";
		GainScenarioAchievement("Bars", 3);
	}
	UpdateLeagueScores();
	Dialogue->MessageBoxAll(Format("$MsgGoldBarCollected$%s", g_num_goldbars, MAX_GOLD_BARS, sAchievement), collector, true);
	return true;
}

public func OnGoalsFulfilled()
{
	SetNextMission("Missions.ocf/DarkCastle.ocs");
	GainScenarioAchievement("Done");
	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()
{
	// In case gems are collected after game end.
	UpdateLeagueScores();
	return true;
}

func UpdateLeagueScores()
{
	// +50 for finishing and +5 for every gold bar
	var goal_finished = (g_goal && g_goal->IsFulfilled());
	return SetLeagueProgressScore(g_num_goldbars, g_num_goldbars * 5 + goal_finished * 50);
}

func OnInvincibleDamage(object damaged_target)
{
	// Closest Clonk remarks that the door is invincible
	if (damaged_target && damaged_target->GetID() == StoneDoor)
	{
		var observer = damaged_target->FindObject(Find_ID(Clonk), Find_OCF(OCF_Alive), damaged_target->Sort_Distance());
		if (observer)
		{
			Dialogue->MessageBoxAll("$MsgStoneDoorNoDamage$", observer, true);
		}
	}
	return true;
}