Files @ 16044f7fdf9f
Branch filter:

Location: games/Awakening/atlantis_from_the_ashes.lua

Silverwing
0.10.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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
atl_fta_leave = 2;
atl_fta_enter = 2;
atl_fta_leave_2 = 2;

atl_fta_is_terra_solis = room {
    var {
        state = 0;
    };
	nam = "Атлантида, межсекционный кодидор";
	dsc = [[Небольшой коридор, соединяющий секции Терра и Солис. Яркий свет электрических ламп освещает помещение.  ]];
	entered = function(s)
        make_snapshot();
		if (s.state == 0) then
			return [[
				Вы входите в межсекционный коридор Солиса и в этот момент станцию сотрясает взрыв. Свет на мгновение моргает. Раздается звонок телефона. 
			]];
		end;
	end;
	way = {
		kh_vroom("В секцию Терра", function(s)
			if atl_fta_leave == 0 then
				return "atl_fta_game_over_left";
			else
				if atl_fta_leave == 1 then
					pr [[Вы хотите просто уйти, словно ничего не случилось? ]];
				elseif atl_fta_leave == 2 then
					pr [[Вы уверены, что хотите просто взять и уйти? ]];
				end;
				atl_fta_leave = atl_fta_leave - 1;
				return false;
			end;
		end);
		kh_vroom("В секцию Солис", function(s)
			if (atl_fta_phone.state == 1 and have(item_atl_fta_suit)) then
				return "atl_fta_solis_entry";
			else
				if atl_fta_enter == 0 then
					return "atl_fta_game_over_entered";
				else
					if atl_fta_enter == 1 then
						pr [["Вряд ли там сейчас безопасно находиться". ]];
					elseif atl_fta_enter == 2 then
						pr [["Там только что что-то взорвалось, я бы надел скафандр". ]];
					end;
					atl_fta_enter = atl_fta_enter - 1;
					return false;
				end;
			end;
		end);
	};
	obj = {
		"atl_fta_phone",
		"item_atl_fta_suit"
	};
};

item_atl_fta_suit = suit {
	var {
		dlg = false;
	};
	nam = "Скафандр";
	dsc = [[В углу, так же как и в других межсекционных коридорах стоит {скафандр}, который используется в случае чрезвычайной ситуации. ]];
	tak = function(e)
		if (atl_fta_phone.state == 1) then
			return "Вы надеваете скафандр. ", true;
		else
			return "Вам незачем это делать. ", false;
		end;
	end;
};

atl_fta_phone = obj {
	var {
		state = 0;
	};
	nam = "Телефон";
	dsc = function(s)
		if (s.state == 0) then
			return [[На стене висит звонящий {телефонный аппарат}. ]];
		else
			return [[На стене висит {телефонный аппарат}. ]];
		end;
	end;
	act = function(s)
		if (s.state == 0) then
			s.state = 1;
			walk("atl_fta_dlg_phone");
		else
			return false;
		end;
	end;
};

atl_fta_dlg_radio = dlg {
	var {
		state = 0;
	};
	nam = "Радио";
	enter = function(s)
		if (s.state == 0) then
			psub("tuning");
			return [[Радио не настроено. ]];
		elseif (s.state == 1) then
			psub("ok");
			return [[Радио настроено, вы можете говорить. ]];
		elseif (s.state == 2) then
			psub("next");
			return [[Радио настроено, вы можете говорить. ]];
		elseif (s.state == 3) then
			psub("more");
			return [[Радио настроено, вы можете говорить. ]];
        elseif (s.state == 4) then
            psub("done");
            return [[Радио настроено, вы можете говорить. ]];
		end;
	end;
	phr = {
		{tag="tuning"};
		{"[Настроить приемник] Прием, как слышите?", [[
			Через несколько минут настройки, вы слышите в динамике голос Райта: "Слушаю вас, Дрейк".
		]], code [[ atl_fta_dlg_radio.state = 1; psub("ok"); ]]};
		{tag="ok"};
		{"Что мне делать?", [[
			"Что вы видите?"
		]], code [[ atl_fta_dlg_radio.state = 2; psub("what_i_see"); ]]};
		{tag="what_i_see"};
		{"К юго-востоку от меня вижу огонь, скорее всего взрыв был там. Здесь жарко. ", [[Райт инструктирует вас: "Идите по западной стороне. Ваша задача -- попасть в центр секции с южной стороны. Вы увидите несколько вентилей. Вам нужно будет скорректировать давление в системе. Инструкцию найдете на месте. Если давление в каких-то трубах будет завышено -- отключите только их". ]], code [[ psub("clear"); ]]};
		{tag="next"};
		{always=true, "Что мне делать?", [[Райт инструктирует вас: "Идите по западной стороне. Ваша задача -- попасть в центр секции с южной стороны. Вы увидите несколько вентилей. Вам нужно будет скорректировать давление в системе. Инструкцию найдете на месте. Если давление в каких-то трубах будет завышено -- отключите только их". ]], code [[ psub("clear"); ]]};
        {always=true, "Конец связи. ", function(s)
            stead.need_scene();
            back();
            return false;
        end};
		{tag="more", empty=function(s)
            stead.need_scene();
            back();
            return false;
        end};
		{"Тут еще что-то взорвалось.", [[Райт подтверждает: "Я знаю. Поторопитесь. Если взорвется еще один котел, то станция обречена". ]], code [[ atl_fta_dlg_radio.state = 2; ]]};
		{"Как я выберусь отсюда?", [[Райт отвечает: "На юге есть шлюз, выйдете через него". ]], code [[ atl_fta_dlg_radio.state = 2; ]]};
        {tag="clear"};
        {"Вас понял. Конец связи.", function(s)
            stead.need_scene();
            back();
            return false;
        end};
        {tag='done'};
        {always=true, 'Я все сделал.', [[Райт подтверждает: "Вижу. Отлично! Температуры и давление приходят в норму. Выходите оттуда. Шлюз на юге. Конец связи". ]], function(s)
            stead.need_scene();
            back();
            return false;
        end};
	};
};

atl_fta_dlg_phone = dlg {
	nam = "Телефон";
	entered = [[
		Вы снимаете трубку и слышите раздраженный голос Винсента Даркстара: "Дрейк?! Какого черта?! Немедленно возвращайтесь в свою комнату!"^ 
		Вы не успеваете и слова сказать, как в разговор вмешивается Майкл Райт: "Стойте! Дрейк, кроме вас там никого нет, поэтому надевайте скафандр и слушайте мои инструкции".
	]];
	phr = {
		{"Вас понял.", code = [[ psub("back"); ]]};
	};
};

atl_fta_solis_entry = room {
	nam = "Атлантида, Солис, рядом со шлюзом";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Слева и справа от вас проложены трубы. Сквозь просветы в них вы видите огонь где-то вдалеке на юго-востоке.
	]];
	entered = function(s)
		item_atl_fta_suit.dlg = "atl_fta_dlg_radio";
  
        if (atl_fta_solis_c2.broken_valve == 0) then
            atl_fta_solis_c2.broken_valve = rnd(5);
            atl_fta_valves[atl_fta_solis_c2.broken_valve].broken = true;
            atl_fta_solis_c2.broken_offset = rnd(26) + 24;
        end;
	end;
	way = {
		vroom("На восток", "atl_fta_solis_ne");
		vroom("На запад", "atl_fta_solis_nw");
	};
};

atl_fta_solis_ne = room {
	nam = "Атлантида, Солис";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб. Сквозь просветы в них вы видите огонь где-то вдалеке на юге.
	]];
	way = {
		vroom("На запад", "atl_fta_solis_entry");
		vroom("На юг", "atl_fta_solis_e");
	};
};

atl_fta_solis_e = room {
	nam = "Атлантида, Солис";
	dsc = [[
		Здесь очень жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Путь на юг прегражден обломками труб, а за ними вы видите огонь.
	]];
	way = {
		vroom("На север", "atl_fta_solis_ne");
	};
};

atl_fta_solis_nw = room {
	nam = "Атлантида, Солис";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб.
	]];
	way = {
		vroom("На восток", "atl_fta_solis_entry");
		vroom("На юг", "atl_fta_solis_w");
	};
};

atl_fta_solis_w = room {
	nam = "Атлантида, Солис";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб.
	]];
	way = {
		vroom("На север", "atl_fta_solis_nw");
		vroom("На восток", "atl_fta_solis_c1");
		vroom("На юг", "atl_fta_solis_sw_cs");
	};
};

atl_fta_solis_c1 = room {
	nam = "Атлантида, Солис, центр";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Перед собой вы видите сложную конструкцию из труб и клапанов. Через металлическую решетку на севере вы видите вентили, о которых говорил Райт. К сожалению, вы не сможете дотянуться до них отсюда.
	]];
	way = {
		vroom("На запад", "atl_fta_solis_w");
	};
};

atl_fta_solis_sw_cs = cutscene('Атлантида, Солис', 'Атлантида, Солис', [[Позади вас раздается еще один взрыв. Вы с трудом удерживаетесь на ногах, видите, что часть секции на севере завалена и сквозь дым, пар и пыль видите начавшийся пожар. ]], 'atl_fta_solis_sw', function(s)
    atl_fta_dlg_radio.state = 3;
end);

atl_fta_solis_sw = room {
	nam = "Атлантида, Солис";
	dsc = [[
		В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб.
	]];
	way = {
		vroom("На восток", "atl_fta_solis_exit");
	};
};

atl_fta_solis_se = room {
	nam = "Атлантида, Солис";
	dsc = [[В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб. Проход на север завален обломками, а за ними пылает огонь. ]];
	way = {
		vroom("На запад", "atl_fta_solis_exit");
	};
};

atl_fta_solis_exit = room {
	nam = "Атлантида, Солис";
	dsc = [[В помещении темно и жарко, несмотря на одетый на вас скафандр. Воздух заполнен дымом и пылью, еще больше ухудшая видимость. Cо всех сторон от вас проложено множество труб. К югу от вас расположен шлюз, ведущий наружу станции. На севере вы видите проход, ведущий в центральную часть секции. ]];
	way = {
		vroom("На север", "atl_fta_solis_c2");
		vroom("На запад", "atl_fta_solis_sw");
		vroom("На восток", "atl_fta_solis_se");
		kh_vroom("В шлюз", function(s)
			if atl_fta_solis_c2:solved() then
				return "atl_fta_ending";
			else
				if atl_fta_leave_2 == 0 then
					return "atl_fta_game_over_left_2";
				else
					if atl_fta_leave_2 == 1 then
						pr [["Кроме меня поблизости никого нет, так что мне придется это сделать". ]];
					else
						pr [["Здесь вот-вот все взорвется, если я не исправлю проблему". ]];
					end;
					atl_fta_leave_2 = atl_fta_leave_2 - 1;
					return false;
				end;
			end;
		end);
	};
};

atl_fta_solis_c2 = room {
	var {
		valve_a = 2;
		valve_b = 1200;
		broken_valve = 0;
		broken_offset = 0;
		valves = {1,1,1,1,1};
	};
	solved = function(s)
		local count = 0;
		for i =1, #s.valves do
			if (s.valves[i] == 0 and i ~= s.broken_valve or
				s.valves[i] == 1 and i == s.broken_valve) then
				return false;
			end;
			count = count + s.valves[i];
		end;

		local value;
		if count > 0 then
			value = math.floor(atl_fta_solis_c2.valve_b / atl_fta_solis_c2.valve_a * 5 / count);
		else
			value = 9000;
		end;
		if value > 255 or value < 245 then
			return false;
		end;
		return true;
	end;
	nam = "Атлантида, Солис, Центр";
	dsc = function(s)
		if (not s:solved()) then
			return [[
				В помещении темно и жарко. Где-то рядом вы слышите шипение пара, вырывающегося из труб, но не видите, где. Перед собой вы видите сложную конструкцию из труб и клапанов. Вы видите несколько пронумерованных вентилей, рядом с которыми расположены манометры:
			]];
		else
			return [[
				В помещении темно и жарко. Перед собой вы видите сложную конструкцию из труб и клапанов. Вы видите несколько пронумерованных вентилей, рядом с которыми расположены манометры:
			]];
		end;
	end;
	way = {
		vroom("На юг", atl_fta_solis_exit);
	};
	obj = {
		"atl_fta_solis_valve1",
		"atl_fta_solis_valve2",
		"atl_fta_solis_valve3",
		"atl_fta_solis_valve4",
		"atl_fta_solis_valve5",
		"atl_fta_solis_valvea",
		"atl_fta_solis_valveb",
		"atl_fta_help_text",
		"item_goldmans_clock"
	};
};

atl_fta_help_text = obj {
	nam = "atl_fta_help_text";
	dsc = "Над вентилями расположена латунная {табличка} с инструкцией. ";
	act = [[Табличка гласит: _"Используйте вентили ,,A'' и ,,B'' для регулировки давления. Вентили 1-5 нужны для перекрытия подачи пара в отдельные трубы. Для оптимальной работы давление в трубе должно быть в диапазоне 245-255КПа. ^Внимание: Не перекрывайте вентили без необходимости -- это снижает производительность!"_. ]];
}

atl_fta_solis_valvea = obj {
	nam = "Вентиль";
	dsc = function(s)
		return 'Под ними расположены еще два вентиля. На каждом из них нанесены числовые обозначения, а над вентилями нанесена краской небольшая стрелочка. ^{Вентиль "A"} установлен в значение ' .. tostring(atl_fta_solis_c2.valve_a) .. ".^";
	end;
	act = function(s)
		if (atl_fta_solis_c2:solved()) then
			return "Вы уже сделали все, что нужно. Не стоит больше ничего здесь трогать. ";
		end;

		if (atl_fta_solis_c2.valve_a == 2) then
			atl_fta_solis_c2.valve_a = 3;
		elseif (atl_fta_solis_c2.valve_a == 3) then
			atl_fta_solis_c2.valve_a = 4;
		elseif (atl_fta_solis_c2.valve_a == 4) then
			atl_fta_solis_c2.valve_a = 6;
		elseif (atl_fta_solis_c2.valve_a == 6) then
			atl_fta_solis_c2.valve_a = 2;
		end;

		if (atl_fta_solis_c2:solved()) then
            atl_fta_dlg_radio.state = 4;
			return "Шипение пара прекращается. Вы сделали все, что нужно. ";
		else
			return "Вы поворачиваете вентиль. Значения на манометрах изменились. ";
		end;
	end;
};

atl_fta_solis_valveb = obj {
	nam = "Вентиль";
	dsc = function(s)
		return '{Вентиль "B"} установлен в значение ' .. tostring(atl_fta_solis_c2.valve_b) .. ".^";
	end;
	act = function(s)
		if (atl_fta_solis_c2:solved()) then
			return "Вы уже сделали все, что нужно. Не стоит больше ничего здесь трогать. ";
		end;

		atl_fta_solis_c2.valve_b = atl_fta_solis_c2.valve_b + 200;
		if atl_fta_solis_c2.valve_b > 1200 then
			atl_fta_solis_c2.valve_b = 600;
		end;

		if (atl_fta_solis_c2:solved()) then
			return "Шипение пара прекращается. Вы сделали все, что нужно. ";
		else
			return "Вы поворачиваете вентиль. Значения на манометрах изменились. ";
		end;
	end;
};

atl_fta_solis_valve = function(index)
	local delta = rnd(11) - 6;
	return obj {
		nam = "Вентиль";
		delta = delta;
		dsc = function(s)
			local count = 0;
			for valve = 1, #atl_fta_solis_c2.valves do
				count = count + atl_fta_solis_c2.valves[valve];
			end;

			local value;
			if count > 0 then
				value = math.floor(atl_fta_solis_c2.valve_b / atl_fta_solis_c2.valve_a * 5 / count) + s.delta;
			else
				value = 9000;
			end;

			if (atl_fta_solis_c2.broken_valve == index) then
				value = value + atl_fta_solis_c2.broken_offset;
			end;
			if (atl_fta_solis_c2.valves[index] == 0) then
				value = 0;
			end;
			return "{Вентиль №"..tostring(index).."}. Манометр показывает " .. tostring(value) .. ".^";
		end;
		act = function(s)
			if (atl_fta_solis_c2:solved()) then
				return "Вы уже сделали все, что нужно. Не стоит больше ничего здесь трогать. ";
			end;

			if (atl_fta_solis_c2.valves[index] == 0) then
				atl_fta_solis_c2.valves[index] = 1;
			else
				atl_fta_solis_c2.valves[index] = 0;
			end;
			
			if (atl_fta_solis_c2:solved()) then
				return "Шипение пара прекращается. Вы сделали все, что нужно. ";
			else
				return "Вы поворачиваете вентиль. Значения на манометрах изменились. ";
			end;
		end;
	};
end;

atl_fta_solis_valve1 = atl_fta_solis_valve(1);
atl_fta_solis_valve2 = atl_fta_solis_valve(2);
atl_fta_solis_valve3 = atl_fta_solis_valve(3);
atl_fta_solis_valve4 = atl_fta_solis_valve(4);
atl_fta_solis_valve5 = atl_fta_solis_valve(5);

atl_fta_valves = {
    atl_fta_solis_valve1;
    atl_fta_solis_valve2;
    atl_fta_solis_valve3;
    atl_fta_solis_valve4;
    atl_fta_solis_valve5;
};

atl_fta_game_over_entered = game_over('atl_fta_game_over_entered', [[Вы открываете шлюз в Солис. В помещение врываются клубы удушающего дыма и нестерпимый жар. Вы начинаете кашлять, а голова начинает кружиться от жара. Это последнее, что вы успели запомнить. ]]);

atl_fta_game_over_left = game_over('atl_fta_game_over_left', [[Как только вы выходите из межсекционного коридора, раздается еще один взрыв и свет на станции гаснет. Взрыв повреждает межсекционный коридор и его начинает заполнять вода. Вы начинаете задраивать люк, но третий взрыв сбивает вас с ног. Вы падаете и теряете сознание. Через несколько мгновений вы утонете, но вас это уже не заботит. ]]);

atl_fta_game_over_left_2 = game_over('atl_fta_game_over_left_2', [[Как только вы входите в шлюз, взрыв сокрушительной силы сотрясает станцию. Шлюзовую дверь выбивает и вас отбрасывает в противоположный угол комнаты. Вы видите, как секцию начинает заполнять вода. По радио не слышно ничего кроме помех и скорее всего никто не придет к вам на помощь... ]]);

atl_fta_ending = cutscene('atl_fta_ending', "Атлантида", [[Через шлюз вы выбираетесь из Солиса и оказываетесь снаружи. Через некоторое время вас подбирает Наутилус, чтобы вернуть на станцию. От экипажа вы узнаете, что потребление энергии на станции сокращено до восстановления Солиса. ^По возвращении на станцию, вас встречают охранники. Они проводят вас в вашу каюту, где вы погружаетесь в глубокий сон. Вы просыпаетесь от стука в дверь. Охранники просят вас следовать за ними. Они сопровождают вас до кабинета Винсента Даркстара. ]], 'atl_mtr_intro', function(s)
	if char_darkstar_dlg.state == 0 then
		char_darkstar_dlg.state = 1;
	end;
	atl_fta_state = 2;
	remove(item_atl_fta_suit, pl);
	me().has_light = false;
end);