Changeset - e4ecbb8dc309
[Not reviewed]
default
0 2 0
Silverwing - 7 years ago 2017-06-24 08:30:22

Coder
2 files changed with 146 insertions and 2 deletions:
0 comments (0 inline, 0 general)
items.lua
Show inline comments
 
@@ -197,410 +197,411 @@ item_harpoon = obj {
 
        else
 
            return "Я не буду этого делать!";
 
        end;
 
    end;
 
    inv = function(s)
 
        if (s.charge > 0) then
 
            return [[Пневматическое ружье с Левиафана. Стреляет гарпунами. Также у вас есть несколько запасных гарпунов с собой. ]];
 
        else
 
            s.charge = 1;
 
            p [[Вы заряжаете ружье. ]];
 
            if (type(here().onreload) == 'function') then
 
                here().onreload();
 
            end;
 
        end;
 
    end;
 
};
 
 
item_first_city_key = obj {
 
	nam = "first_city_key";
 
	disp = "Ключ от города";
 
	inv = [[Небольшой светящийся кубик со стороной около 2-х сантиметров. Он плавно меняет цвета: синий, зеленый, желтый, белый, красный, черный. ]];
 
	use = function(s, o)
 
		if (o == char_first_city_guardian) then 
 
			objs("first_city_entrance"):enable("first_city_first_gate");
 
			first_city_entrance.open = true;
 
			return [[Как только кубик попадает в поле зрения стража, его плавник гаснет и ворота начинают медленно открываться. 
 
				Через несколько минут они застывают в открытом состоянии. Теперь ничто не мешает вашему проходу. ]];
 
		end;
 
	end
 
};
 
 
item_service_info = obj {
 
	nam = "service_info";
 
	disp = "Схема города";
 
	inv = [[Это "карта" сервисных тоннелей Лсэрианотра. Вы видите следующие последовательности символов, подписанные на языке навьяров
 
		Nol      
 
		Tei      
 
		Vlye'Tei 
 
		Elt'Dyle 
 
		Tei'Elt	 
 
		Tei'Tei  
 
	]];
 
};
 
 
item_umbrella = obj {
 
	nam = "umbrella";
 
	disp = "Зонт";
 
	inv = [[Совершенно новый зонт производства "Винсент и сыновья". ]];
 
};
 
 
--[[
 
	Chapter 1
 
]]
 
item_lamp = obj {
 
	nam = "lamp";
 
	disp = "Лампа";
 
	dsc = "На столе стоит {керосиновая лампа}. ";
 
	tak = "Вы забираете лампу с собой. ";
 
	inv = function(s)
 
		if (pl.where.nolamp) then
 
			return "Здесь не стоит зажигать лампу. ";
 
		end;
 
		if (pl.has_light) then
 
			pl.has_light = false;
 
			return "Вы гасите свет. ";
 
		else
 
			pl.has_light = true;
 
			return "Вы зажигаете лампу. ";
 
		end;
 
	end;
 
};
 
 
item_toolbox = obj {
 
	nam = "toolbox";
 
	disp = "Ящик с инструментами";
 
	dsc = [[На земле, рядом со скамейкой стоит {ящик с инструментами}. ]];
 
	tak = function(s)
 
		if (not char_worker.bought) then
 
			return [[Рабочий огрызается на вас: _"Руки прочь!"_ ]], false;
 
		else
 
			return [[Вы забираете ящик с собой]], true;
 
		end;
 
	end;
 
	inv = [[Ящик со всевозможными полезными и не очень инструментами - отвертками, ключами, молотками и т.д. ]];
 
};
 
 
item_money = obj {
 
	nam = "money";
 
	disp = function(s)
 
		if (pl.money == 0) then
 
			return "Пустой кошелек";
 
		else
 
			return s.money_format();
 
		end;
 
	end;
 
	inv = function(s)
 
		if (pl.money == 0) then
 
			return "Кошелек пуст";
 
		else
 
			return [[Кошелек с монетами различного достоинства на сумму ]] .. s.money_format();
 
		end;
 
	end;
 
	money_format = function()
 
		if (pl.money % 100 / 10 ~= 1 and pl.money % 10 == 1) then
 
			return tostring(pl.money) .. " шиллинг";
 
		elseif (pl.money % 100 / 10 ~= 1 and (pl.money % 10 == 2 or pl.money % 10 == 3 or pl.money % 10 == 4)) then
 
			return tostring(pl.money) .. " шиллинга";
 
		else 
 
			return tostring(pl.money) .. " шиллингов";
 
		end;
 
	end;
 
};
 
 
item_note_1 = obj {
 
	nam = "note1";
 
	disp = "Записка";
 
	inv = [[Небольшой клочок бумаги с адресом Майкла Райта в Лондоне. ]];
 
};
 
 
item_charts = obj {
 
	nam = "charts";
 
	disp = "Документы отца";
 
	dsc = [[На столе лежат {схемы складов и верфей} Вестхейвен Трансоушен. ]];
 
	inv = [[Схемы нескольких строений, принадлежавших компании отца. На некоторых схемах есть места отмечены жирными крестиками. Схемы с крестиками обозначены как склад 18, док 2, склад 32. ]];
 
	use = function(s, o)
 
		if (o == char_wright_home) then
 
			remove(s, pl);
 
			put(s, item_wright_table);
 
			char_wright_home.documents = true;
 
			return [[
 
				Вы отдаете бумаги Джеку. Он кладет их на стол и принимается изучать.
 
			]];
 
		end;
 
	end;
 
	tak = function()
 
		pn("Лучше оставить бумаги Джеку. Возможно он что-нибудь найдет. ");
 
		return false;
 
	end;
 
};
 
 
item_bottle = obj {
 
	nam = "item_bottle";
 
	disp = "Бутылка с пойлом";
 
	inv = [[Бутылка дешевого пойла. Вас воротит от одного запаха этой дряни. ]];
 
	use = function(s, o)
 
		if (o == char_worker) then
 
			remove(s, pl);
 
			char_worker.bought = true;
 
			pr([[Вы подходите к рабочему и, аккуратно доставая бутылку, спрашиваете: ^
 
				-- Выпить хочешь? ^
 
				-- Ага, -- удивленно и обрадованно восклицает рабочий, протягивая руки. ^
 
				-- Меняю на твой ящик с инструментами. ^
 
				-- Идет, -- отвечает рабочий, выхватывая из ваших рук заветную бутылку. ]]);
 
		end;
 
	end;
 
};
 
 
item_pump_broken = obj {
 
	nam = "item_pump_broken";
 
	disp = "Насос";
 
	inv = [[Старый ручной насос. Рычаг сломан, делая его использование невозможным. ]];
 
};
 
 
item_pump = obj {
 
	nam = "item_pump";
 
	disp = "Насос";
 
	inv = [[Старый ручной насос. ]];
 
};
 
 
item_pump_details = obj {
 
	nam = "item_pump_details";
 
	disp = "Детали насоса";
 
	inv = [[
 
		Запчасти для насоса. 
 
	]];
 
	use = function(s, o)
 
		if (o == item_pump_broken) then
 
			remove(s, pl);
 
			remove(item_pump_broken, pl);
 
			put(item_pump, pl);
 
			return [[Вы починили насос. ]];
 
		end;
 
	end;
 
};
 
 
item_electrodes = obj {
 
	nam = "item_electrodes";
 
	disp = "Электроды";
 
	inv = [[Несколько металлических пластин, предназначенных для использования в качестве электродов. ]];
 
};
 
 
item_ducttape = obj {
 
	nam = "item_ducttape";
 
	disp = "Изолента";
 
	dsc = [[На столе лежит {моток изоленты}. ]];
 
	tak = [[Вы забираете изоленту. ]];
 
	inv = [[Моток изоленты. ]];
 
};
 
 
item_map = obj {
 
	nam = "item_map";
 
	disp = "Карта";
 
	inv = function(s) 
 
		if atlantis_found then
 
			return [[Карта Атлантического океана, судя по маркировке, принадлежащая компании "Вестхейвен Трансоушен". На ней изображено несколько объектов, имеющих значение для компании и, в частности, Атлантида. ]];
 
		else
 
			atlantis_found = true;
 
			return [[Карта Атлантического океана, судя по маркировке, принадлежащая компании "Вестхейвен Трансоушен". Вы внимательно осматриваете карту в поисках чего-нибудь необычного. Ваше внимание привлекает отметка "Атлантида", сделанная посреди океана. К сожалению, никаких пояснений у вас нет и единственное, что вы можете сделать -- это попытаться добраться до этой точки. ]];
 
		end;
 
	end;
 
};
 
 
item_map_2 = obj {
 
	nam = "item_map_2";
 
	disp = "Карта";
 
	inv = function(s)
 
		iraaphaanotrr_found = true;
 
		dypatreanotrr_found = true;
 
		return [[Карта, отданная вам Екатериной Светловой. Эта карта почти идентична найденной вам на складе, за исключением наличия дополнительных точек, указывающих навьярские города Дипатреанотр и Ираафаанотр. ]];
 
	end;
 
};
 
 
item_unknown_schematics = obj {
 
	nam = "item_unknown_schematics";
 
	disp = "Чертежи";
 
	inv = function(s) 
 
		remove(s, pl);
 
		put(item_leviathan_schematics, pl);
 
		return [[Вы рассматриваете чертежи, найденные на складе. Это чертежи какого-то необычного корабля. Многие детали конструкции кажутся вам непонятными, излишними, переусложненными пока вы не натыкаетесь на надпись в углу: _"Проект ,,Левиафан'', Вестхейвен Трансоушен, 1900"_. Чуть ниже написано: _"Подводный корабль предназначенный для долговременноых автономных путешествий"_. Теперь все встает на свои места - вот что строил ваш отец. ]];
 
	end;
 
};
 
 
item_leviathan_schematics = obj {
 
	nam = "item_leviathan_schematics";
 
	disp = "Чертежи \"Левиафана\"";
 
	inv = [[Чертежи "Левиафана" - субмарины, созданной Вестхейвен Трансоушен. ]];
 
};
 
 
item_cogs = obj {
 
	nam = "item_cogs";
 
	disp = "Шестеренки";
 
	inv = [[Несколько шестерней разного размера. ]];
 
	use = function(s, o)
 
		if (o == crane_service_access_panel and crane_service_access_panel.state == 1) then
 
			remove(s, pl);
 
			dock_crane.broken = false;
 
			return [[Вы заменяете поврежденные шестерни новыми. ]];
 
		end;
 
	end;
 
};
 
 
item_w32_key = obj {
 
	nam = "item_w32_key";
 
	disp = "Ключ";
 
	dsc = [[За книгами спрятан небольшой {ключик}. ]];
 
	tak = function(s)
 
		w32_mgr.key_inplace = false;
 
		return [[Вы забираете ключ. ]];
 
	end;
 
	inv = [[Ключ от стола управляющего из склада 32. ]];
 
};
 
 
item_goldmans_clock = obj {
 
	nam = "item_goldmans_clock";
 
	disp = "Часы";
 
	dsc = [[На полу валяются дорогие {карманные часы}. ]];
 
	tak = [[Вы забираете часы себе. ]];
 
	inv = [[Дорогие карманные часы на цепочке. Под крышкой гравировка "Франсуа Голдман, 1864". ]];
 
};
 
 
item_statuette = obj {
 
	nam = "item_statuette";
 
	disp = "Статуэтка";
 
	inv = [[Металлическая статуэтка, сделанная из неизвестного вам сплава, она хорошо сохранилась в океанской воде. Статуэтка в деталях изображает навьяра, держащего в правой руке блокнот, и сосредоточенно смотрящего перед собой. ]];
 
};
 
 
item_temple_disk = obj {
 
	nam = "item_temple_disk";
 
	disp = "Светодиск из храма";
 
	dsc = [[У стены лежит небольшой блестящий диск. ]];
 
	tak = [[Вы поднимаете диск. ]];
 
	inv = [[Найденный в храме блестящий гладкий диск из неизвестного материала. Диаметр около 10 сантиметров. В центре небольшое треугольное отверстие. Вдоль внешней кромки - цветные полосы. ]];
 
};
 
 
item_legend_of_temple = obj {
 
	nam = "item_legend_of_temple";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены цветные полосы, соответствующие буквам языка навьяров. 
 
		~Легенда о храме в глубинах~]];
 
};
 
 
item_legend_of_dark_source = obj {
 
	nam = "item_legend_of_dark_source";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу у входа валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены цветные полосы, соответствующие буквам языка навьяров. 
 
		~Легенда об излучающем тьму~]];
 
};
 
 
item_legend_of_first_city = obj {
 
	nam = "item_legend_of_first_city";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены цветные полосы, соответствующие буквам языка навьяров. 
 
		~Легенда о первом городе~]];
 
};
 
 
item_legend_of_hunter = obj {
 
	nam = "item_legend_of_hunter";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены цветные полосы, соответствующие буквам языка навьяров. 
 
		~Легенда об охотнике~]];
 
};
 
 
item_navjiarr_chart_1 = obj {
 
	nam = "item_navjiarr_chart_1";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_navjiarr_chart_iraa = obj {
 
	nam = "item_navjiarr_chart_iraa";
 
	disp = "Карта из Ираафаанотра";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_navjiarr_chart_dyp = obj {
 
	nam = "item_navjiarr_chart_dyp";
 
	disp = "Карта из Дипатреанотра";
 
	dsc = [[На пьедестале лежит металлическая табличка. ]];
 
	tak = function(s)
 
		path("Выйти из храма"):enable();
 
		return [[Как только вы подбираете табличку, дверь открывается. ]];
 
	end;
 
	inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_navjiarr_chart_2 = obj {
 
	nam = "item_navjiarr_chart_2";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_navjiarr_chart_ven = obj {
 
    nam = "item_navjiarr_chart_ven";
 
    disp = "Карта из Венаэданотра";
 
    inv = [[Металлическая табличка с нанесенными обозначениями. ]];
 
}
 
 
item_navjiarr_chart_3 = obj {
 
	nam = "item_navjiarr_chart_3";
 
	disp = "Навьярская табличка";
 
	dsc = [[На полу в углу валяется какой-то {предмет}. ]];
 
	tak = [[Вы поднимаете предмет - это небольшая металлическая табличка. ]];
 
	inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_navjiarr_cube = obj {
 
	nam = "item_navjiarr_cube";
 
	disp = "Навьярский артефакт";
 
	inv = [[Небольшой прозрачный куб, очень холодный на ощупь - холод ощущается даже в скафандре. От него исходит слабое свечение. ]];
 
};
 
 
item_talk_device = obj {
 
	nam = "item_talk_device";
 
	disp = "Устройство для общения с навьярами";
 
	inv = [[Небольшое устройство с клавиатурой и большим количеством цветных лампочек. Оно полностью герметично и может быть использовано под водой. ]];
 
};
 
 
item_suit = suit {
 
	dlg = "call_leviathan";
 
	nam = "Скафандр";
 
    has_coder = true;   
 
};
 
 
item_deep_key = obj {
 
    nam = "item_deep_key";
 
    disp = "Пирамидка";
 
    dsc = [[На пьедестале вы видите небольшой блестящий {предмет}. ]];
 
    inv = [[Небольшая полупрозрачная пирамидка из неизвестного материала. Гладкая и холодная на ощупь. На гранях пирамидки нанесены непонятные символы. ]];
 
    tak = [[Это оказалась небольшая полупрозрачная пирамидка. Вы забираете ее себе. ]];
 
};
 
 
item_navjiarr_chart_z = obj {
 
    nam = "item_navjiarr_chart_z";
 
    disp = "Навьярская табличка";
 
    dsc = [[На пьедестале лежит небольшая металлическая {табличка}. ]];
 
    tak = function(s)        
 
        return [[Вы поднимаете предмет - это небольшая металлическая табличка. Вдалеке вы слышите скрежет камней - дверь храма снова открыта. ]];
 
    end;
 
    inv = [[Металлическая табличка, на которую нанесены странные обозначения. ]];
 
};
 
 
item_naethvjirr_key = obj {
 
    nam = "item_naethvjirr_key";
 
    disp = "Ключ из древнего храма";
 
    dsc = [[На пьедестале лежит небольшая прозрачная {коробочка}, внутрь которой заключена прямоугольная пластинка из неизвестного материала. ]];
 
    inv = [[Небольшая прозрачная {коробочка}, внутрь которой заключена прямоугольная пластинка из неизвестного материала. Пластинка с обеих сторон покрыта тонкими металлическими нитями. ]];
 
};
 
\ No newline at end of file
utils.lua
Show inline comments
 
@@ -59,704 +59,847 @@ EngineUtils = {
 
--[[
 
	internal space
 
]]
 
_kh = {
 
	vroom_enter = function(s)  
 
		local v = EngineUtils.getValue(s.where);
 
		if (v) then
 
			walk(v);
 
		else
 
			return false;
 
		end;
 
	end;
 
	vroom_save = function(s)
 
		if need then
 
			local t = stead.string.format("%s = kh_vroom(%s, %q, %s);\n",
 
				name, stead.tostring(self.disp), 
 
					stead.deref(self.where), stead.deref(self.nam));
 
			h:write(t);
 
		end
 
		stead.savemembers(h, self, name,false);
 
	end;
 
};
 
 
function kh_vobj(nam, dsc, act, used) 
 
    return obj {
 
        nam = nam;
 
        dsc = dsc;
 
        act = act;
 
        used = used;
 
    };
 
end;
 
 
function kh_vway(disp, dsc, target, seen_level)
 
	local temp = vway(disp, dsc, target);
 
	temp.seen_level = seen_level;
 
	return temp;
 
end;
 
 
--[[
 
	vroom with additional functionality
 
]]
 
function kh_vroom(disp, target, nam, seen_level)
 
    if (type(nam) == "number") then
 
        seen_level = nam;
 
        nam = disp;
 
    end;
 
    if (not nam) then
 
        nam = disp;
 
    end;
 
	return room {
 
		nam = nam;
 
		disp = disp;
 
		where = target;
 
		enter = _kh.vroom_enter;
 
		seen_level = seen_level;
 
		--enter = _kh.vroom_enter;
 
		--save = _kh.vroom_save;
 
	};
 
end;
 
 
--[[room = inherit(room, function(v)
 
    v.forcedsc = true;
 
    return v;
 
end);]]
 
 
dlg = inherit(dlg, function(v)
 
    v.hideinv = true;
 
    return v;
 
end);
 
 
obj = inherit(obj, function(v)
 
	v.disable_implicit = hook(v.disable, function(f, s, ...)
 
		s._disabled_implicit = true;
 
		return f(s, unpack(arg));
 
	end);
 
 
	v.disable = hook(v.disable, function(f, s, ...)
 
		s._disabled_explicit = true;
 
		return f(s, unpack(arg));
 
	end);
 
	
 
	v.enable_implicit = hook(v.enable, function(f, s, ...)
 
		s._disabled_implicit = false;
 
		if (s._disabled_explicit) then
 
			return s; --mimic original enable() behavior
 
		else
 
			return f(s, unpack(arg));
 
		end;
 
	end);
 
	
 
	v.enable = hook(v.enable, function(f, s, ...)
 
		s._disabled_explicit = false;
 
		if (s._disabled_implicit) then
 
			return s; --mimic original enable() behavior
 
		else
 
			return f(s, unpack(arg));
 
		end;
 
	end);
 
	
 
	return v;
 
end);
 
 
--[[
 
	character object
 
	represents character, with whom you can interact
 
]]
 
function npc(tab)
 
	if (not tab.act) then
 
		tab.act = function(s)
 
			if (s.dlg) then
 
				walkin(s.dlg);
 
			else
 
				return s.phrases[rnd(#s.phrases)];
 
			end;
 
		end;
 
	end;
 
	
 
	return obj(tab);
 
end;
 
 
function darkroom(tab)
 
	local life;
 
	local entered;
 
	local left;
 
	if (not tab.has_light) then
 
		tab.has_light = false;
 
	end;
 
	if (tab.life) then
 
		life = tab.life;
 
	end;
 
	if (tab.entered) then
 
		entered = tab.entered;
 
	end;
 
	if (tab.left) then
 
		left = tab.left;
 
	end;
 
	tab.entered = function(s)
 
		lifeon(s);
 
		if (entered) then
 
			entered(s);
 
		end;
 
	end;
 
	tab.left = function(s)
 
		lifeoff(s);
 
		if (left) then
 
			left(s);
 
		end;
 
	end;
 
	tab.life = function(s)
 
        local hasLight = EngineUtils.getValue(s.has_light, s);
 
        local plLight = EngineUtils.getValue(pl.has_light, pl);
 
		if (hasLight) then
 
			-- show all objects that were not explicitly disabled(any seen_level)
 
			for i = 1, #objs(s) do
 
				objs(s)[i]:enable_implicit();
 
			end;
 
			for i = 1, #ways(s) do
 
				ways(s)[i]:enable_implicit();
 
			end;
 
		elseif (plLight) then
 
			-- show all objects that were not explicitly disabled and marked as seen in halflight (seen_level = 1 or higher)
 
			for i = 1, #objs(s) do
 
				if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 1) then
 
					objs(s)[i]:enable_implicit();
 
				else
 
					objs(s)[i]:disable_implicit();
 
				end;
 
			end;
 
			for i = 1, #ways(s) do
 
				if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 1) then
 
					ways(s)[i]:enable_implicit();
 
				else
 
					ways(s)[i]:disable_implicit();
 
				end;
 
			end;
 
		else
 
			-- show all objects that were not explicitly disabled and marked as seen in darkness (seen_level = 2 or higher)
 
			for i = 1, #objs(s) do
 
				if (type(objs(s)[i].seen_level) == "number" and objs(s)[i].seen_level >= 2) then
 
					objs(s)[i]:enable_implicit();
 
				else
 
					objs(s)[i]:disable_implicit();
 
				end;
 
			end;
 
			for i = 1, #ways(s) do
 
				if (type(ways(s)[i].seen_level) == "number" and ways(s)[i].seen_level >= 2) then
 
					ways(s)[i]:enable_implicit();
 
				else
 
					ways(s)[i]:disable_implicit();
 
				end;
 
			end;
 
		end;
 
		
 
		if (life) then
 
			life(s);
 
		end;
 
	end;
 
	if (not tab.dsc) then
 
		tab.dsc = function(s)
 
			local lt;
 
            local hasLight = EngineUtils.getValue(s.has_light, s);
 
            local plLight = EngineUtils.getValue(pl.has_light, pl);
 
			if (hasLight) then
 
				lt = EngineUtils.getValue(s.dsc_lit);
 
			elseif (plLight) then
 
				lt = EngineUtils.getValue(s.dsc_halflit);
 
			else
 
				lt = EngineUtils.getValue(s.dsc_dark);
 
			end;
 
			return lt;
 
		end;
 
	end;
 
	
 
	return room(tab);
 
end;
 
 
function game_over(nam, dsc)
 
    return room {
 
        nam = nam;
 
        disp = "Игра окончена";
 
        hideinv = true;
 
        dsc = dsc;
 
    };
 
end;
 
 
function cutscene(nam, disp, dsc, nxt, entered)
 
    return room {
 
        nam = nam;
 
        not_follow = true;
 
        disp = disp;
 
        entered = entered;
 
        hideinv = true;
 
        cutscene = true;
 
        dsc = dsc;
 
        obj = {
 
            vway("continue", "{Продолжить}", nxt);
 
        };
 
    };
 
end;
 
 
function lcutscene(nam, disp, dsc, msg, nxt)
 
    return room {
 
        var {
 
            state = 0;
 
        };
 
        not_follow = true;
 
        nam = nam;
 
        disp = disp;
 
        enter = function(s)
 
            if (s.state == 1) then
 
                walk(nxt);
 
                pn(msg);
 
            end;
 
            s.state = 1;
 
        end;
 
        dsc = dsc;
 
        obj = {
 
            kh_vobj("continue", "{Продолжить}", function(s)
 
                walk(nxt);
 
            end);
 
        };
 
    };
 
end;
 
 
--[[
 
	Создает комнату с полем для ввода числа длиной не более tab.maxlen
 
	По нажатии enter вызывает метод tab.сheck
 
	Приглашение для ввода: tab.label
 
	Вводимый текст: tab.input
 
]]
 
function input_number(tab)
 
	if (not tab.maxlen) then
 
		tab.maxlen = 2;
 
	end;
 
	tab.forcedsc = true;
 
	tab.noinv = true;
 
	tab.input = "";
 
	tab.dsc = function(s)
 
		pr(tab.label .. tab.input .. "_");
 
		return false;
 
		--return tab.label .. tab.input .. "_";
 
	end;
 
	tab.entered = function(s)
 
		s.input = "";
 
		hook_keys('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'backspace', 'return', 'escape');
 
	end;
 
	tab.left = function(s)
 
		unhook_keys('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'backspace', 'return', 'escape');
 
	end;
 
	tab.kbd = function(s, down, key)
 
		if (not down) then
 
            if (key == "escape") then
 
                back();
 
            elseif (key == "return") then
 
				if (s.input) then
 
					s:check(s.input);
 
				end;
 
			elseif (key == "backspace") then
 
				if (s.input:len() > 0) then
 
					s.input = s.input:sub(1, s.input:len() - 1);
 
				end;
 
			else
 
				if (string.len(s.input) < s.maxlen) then
 
					s.input = s.input .. key;
 
					-- hide buttons :)
 
				end;
 
			end;
 
		end;
 
		pr("");
 
	end;
 
	tab.obj = {
 
		"_kh_input1",
 
        "_kh_input2",
 
        "_kh_input3",
 
        "_kh_input4",
 
        "_kh_input5",
 
        "_kh_input6",
 
        "_kh_input7",
 
        "_kh_input8",
 
        "_kh_input9",
 
        "_kh_input0",
 
        "_kh_backspace",
 
        "_kh_cancel",
 
        "_kh_enter"
 
	};
 
 
	return room(tab);
 
end;
 
 
function input_number_nav(tab)
 
    if (not tab.maxlen) then
 
        tab.maxlen = 2;
 
    end;
 
    tab.forcedsc = true;
 
    tab.noinv = true;
 
    tab.input = "";
 
    tab.dsc = function(s)
 
        pr(tab.label .. tab.input .. "_");
 
        return false;
 
        --return tab.label .. tab.input .. "_";
 
    end;
 
    tab.entered = function(s)
 
        s.input = "";
 
        hook_keys('0', '1', '2', '3', '4', '5', 'backspace', 'return', 'escape');
 
    end;
 
    tab.left = function(s)
 
        unhook_keys('0', '1', '2', '3', '4', '5', 'backspace', 'return', 'escape');
 
    end;
 
    tab.kbd = function(s, down, key)
 
        if (not down) then
 
            if (key == "escape") then
 
                back();
 
            elseif (key == "return") then
 
                if (s.input) then
 
                    s:check(s.input);
 
                end;
 
            elseif (key == "backspace") then
 
                if (s.input:len() > 0) then
 
                    s.input = s.input:sub(1, s.input:len() - 1);
 
                end;
 
            else
 
                if (string.len(s.input) < s.maxlen) then
 
                    s.input = s.input .. key;
 
                    -- hide buttons :)
 
                end;
 
            end;
 
        end;
 
        pr("");
 
    end;
 
    tab.obj = {
 
        "_kh_input1",
 
        "_kh_input2",
 
        "_kh_input3",
 
        "_kh_input4",
 
        "_kh_input5",
 
        "_kh_input0",
 
        "_kh_backspace",
 
        "_kh_cancel",
 
        "_kh_enter"
 
    };
 
 
    return room(tab);
 
end;
 
 
function input_alphabet_nav(tab)
 
    if (not tab.maxlen) then
 
        tab.maxlen = "16";
 
    end;
 
    tab.forcedsc = true;
 
    tab.noinv = true;
 
    tab.input = "";
 
    tab.dsc = function(s)
 
        pr(tab.label .. tab.input .. "_");
 
        return false;
 
    end;
 
    tab.entered = function(s)
 
        s.input = "";
 
        hook_keys('0', '1', '2', '3', '4', '5', 
 
            'a', 'd', 'e', 'f', 'h', 'i', 'j', 'k', 'l', 'n', 'p', 'r', 's', 't', 'v', 'y', 'z',"'",'space',
 
            'backspace', 'return', 'escape');
 
    end;
 
    tab.left = function(s)
 
        unhook_keys('0', '1', '2', '3', '4', '5', 
 
            'a', 'd', 'e', 'f', 'h', 'i', 'j', 'k', 'l', 'n', 'p', 'r', 's', 't', 'v', 'y', 'z',"'",'space',
 
            'backspace', 'return', 'escape');
 
    end;
 
    tab.kbd = function(s, down, key)
 
        if (not down) then
 
            if (key == "escape") then
 
                back();
 
            elseif (key == "return") then
 
                if (s.input) then
 
                    s:check(s.input);
 
                end;
 
            elseif (key == "backspace") then
 
                if (s.input:len() > 0) then
 
                    s.input = s.input:sub(1, s.input:len() - 1);
 
                end;
 
            else
 
                if (string.len(s.input) < s.maxlen) then
 
                    s.input = s.input .. key;
 
                    -- hide buttons :)
 
                end;
 
            end;
 
        end;
 
        pr("");
 
    end;
 
    tab.obj = {
 
        "_kh_input1",
 
        "_kh_input2",
 
        "_kh_input3",
 
        "_kh_input4",
 
        "_kh_input5",
 
        "_kh_inputa",
 
        "_kh_inputd",
 
        "_kh_inpute",
 
        "_kh_inputf",
 
        "_kh_inputh",
 
        "_kh_inputi",
 
        "_kh_inputj",
 
        "_kh_inputk",
 
        "_kh_inputl",
 
        "_kh_inputn",
 
        "_kh_inputp",
 
        "_kh_inputr",
 
        "_kh_inputs",
 
        "_kh_inputt",
 
        "_kh_inputv",
 
        "_kh_inputy",
 
        "_kh_inputz",
 
        "_kh_inputhp",
 
        "_kh_inputsp",
 
        "_kh_backspace",
 
        "_kh_cancel",
 
        "_kh_enter"
 
    };
 
    return room(tab);
 
end;
 
 
_kh_input_key = function(key, key_text)
 
    if not key_text then
 
        key_text = key;
 
    end;
 
    return obj {
 
        nam = "_kh_input" .. key;
 
        dsc = "{" .. key_text .. "}";
 
        act = function(s)
 
            if (here().input:len() < here().maxlen) then
 
                here().input = here().input .. key;
 
            end;
 
            return "";
 
        end;
 
    };
 
end;
 
 
_kh_inputa = _kh_input_key("a");
 
_kh_inputb = _kh_input_key("b");
 
_kh_inputc = _kh_input_key("c");
 
_kh_inputd = _kh_input_key("d");
 
_kh_inpute = _kh_input_key("e");
 
_kh_inputf = _kh_input_key("f");
 
_kh_inputg = _kh_input_key("g");
 
_kh_inputh = _kh_input_key("h");
 
_kh_inputi = _kh_input_key("i");
 
_kh_inputj = _kh_input_key("j");
 
_kh_inputk = _kh_input_key("k");
 
_kh_inputl = _kh_input_key("l");
 
_kh_inputm = _kh_input_key("m");
 
_kh_inputn = _kh_input_key("n");
 
_kh_inputo = _kh_input_key("o");
 
_kh_inputp = _kh_input_key("p");
 
_kh_inputq = _kh_input_key("q");
 
_kh_inputr = _kh_input_key("r");
 
_kh_inputs = _kh_input_key("s");
 
_kh_inputt = _kh_input_key("t");
 
_kh_inputu = _kh_input_key("u");
 
_kh_inputv = _kh_input_key("v");
 
_kh_inputw = _kh_input_key("w");
 
_kh_inputx = _kh_input_key("x");
 
_kh_inputy = _kh_input_key("y");
 
_kh_inputz = _kh_input_key("z");
 
_kh_inputsp = _kh_input_key(" ", "Пробел");
 
_kh_inputhp = _kh_input_key("'", "'");
 
 
_kh_input1 = obj {
 
    nam = "_kh_input1";
 
    dsc = "{1}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "1";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input2 = obj {
 
    nam = "_kh_input2";
 
    dsc = "{2}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "2";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input3 = obj {
 
    nam = "_kh_input3";
 
    dsc = "{3}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "3";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input4 = obj {
 
    nam = "_kh_input4";
 
    dsc = "{4}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "4";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input5 = obj {
 
    nam = "_kh_input5";
 
    dsc = "{5}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "5";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input6 = obj {
 
    nam = "_kh_input6";
 
    dsc = "{6}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "6";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input7 = obj {
 
    nam = "_kh_input7";
 
    dsc = "{7}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "7";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input8 = obj {
 
    nam = "_kh_input8";
 
    dsc = "{8}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "8";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input9 = obj {
 
    nam = "_kh_input9";
 
    dsc = "{9}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "9";
 
        end;
 
        return "";
 
    end;
 
};
 
 
_kh_input0 = obj {
 
    nam = "_kh_input0";
 
    dsc = "{0}";
 
    act = function(s)
 
        if (here().input:len() < here().maxlen) then
 
            here().input = here().input .. "0";
 
        end;
 
    end;
 
};
 
 
_kh_backspace = obj {
 
    nam = "_kh_back";
 
    dsc = "{Стереть}";
 
    act = function(s)
 
        if (here().input:len() > 0) then
 
            here().input = here().input:sub(1, here().input:len() - 1);
 
        end;
 
    end;
 
};
 
 
_kh_cancel = obj {
 
    nam = "_kh_cancel";
 
    dsc = "{Отмена}";
 
    act = function(s)
 
        back();
 
    end;
 
};
 
 
_kh_enter = obj {
 
    nam = "_kh_enter";
 
    dsc = "{Ввод}";
 
    act = function(s)
 
        if (here().input) then
 
            here():check(here().input);
 
        end;
 
    end;
 
};
 
 
 
--[[
 
	Создает obj, который добавляет другой obj на сцену при активации и становится неинтерактивным
 
	nam - имя объекта
 
	dsc_a - описание до активации
 
	dsc_b - описание после активации
 
	act_a - описание взаимодействия до активации
 
	act_b - описание взаимодействия после активации
 
	o2 - obj, добавляемый на сцену
 
	r - удаляет объект после активации
 
]]
 
function obscured_obj(nam, dsc_a, act_a, o2, r, dsc_b, act_b)
 
	return obj {
 
		var {
 
			activated = false;
 
		};
 
		nam = nam;
 
		dsc = function(s)
 
			if (s.activated) then
 
				return dsc_b;
 
			else 
 
				return dsc_a;
 
			end;
 
		end;
 
		act = function(s)
 
			if (s.activated) then
 
				return act_b;
 
			else
 
				s.activated = true;
 
				put(o2, here());
 
				if (r) then
 
					remove(r, here());
 
				end;
 
				return act_a;
 
			end;
 
		end;
 
	};
 
end;
 
 
_atlantis_coder = input_alphabet_nav {
 
    nam = "Кодировщик";
 
    maxlen = 32;
 
    label = "Сообщение:";
 
    check = function(s, input)
 
        if type(_atlantis_suit_menu._here.checkCoder) == "function" then
 
            pn(_atlantis_suit_menu._here:checkCoder());
 
        else
 
            pn [[Лампочки кодировщика зажигаются в заданной последовательности, но ничего не происходит. ]];
 
        end;
 
        back();
 
    end;
 
};
 
 
_atlantis_suit_menu = dlg {
 
	nam = "Скафандр";
 
	_item = nil;
 
	dsc = [[
 
		Что вы хотите сделать?
 
	]];
 
    entered = function(s)
 
        if (s._item.has_coder) then
 
            pon(2);
 
        else
 
            poff(2);
 
        end;
 
    end;   
 
	phr = {
 
		{1, always = "true", "Использовать рацию", function(s)
 
			local val = EngineUtils.getValue(_atlantis.suit_menu._item.dlg, _atlantis.suit_menu._item);
 
			if (val) then
 
				walkin(val);
 
				stead.ref(val).__from__ = _atlantis.suit_menu.__from__;
 
			else
 
				back();
 
				return "Никто не отвечает";
 
			end;
 
		end};
 
		{2, always = "true", "Снять скафандр", function(s)
 
        {2, always = "true", "Использовать кодировщик", code [[ walkin("_atlantis_coder"); ]]};
 
		{3, always = "true", "Снять скафандр", function(s)
 
			if (EngineUtils.getValue(_atlantis_suit_menu._item.cantakeoff, _atlantis_suit_menu._item)) then
 
				drop(_atlantis._uit_menu._item);
 
				back();
 
				return "Вы снимаете скафандр";
 
			else
 
				back();
 
				return "Вы не можете снять скафандр сейчас";
 
			end;
 
		end};
 
		{3, always = "true", "Отмена", function(s)
 
		{4, always = "true", "Отмена", function(s)
 
			back();
 
			return "";
 
		end};
 
	};
 
};
 
 
_atlantis = {
 
	suit_inv = function(s)
 
		_atlantis_suit_menu._item = s;
 
        _atlantis_suit_menu._here = here();
 
		walkin(_atlantis_suit_menu);
 
	end;
 
};
 
 
suit = function(tab)
 
	if (not tab.inv) then
 
		tab.inv = _atlantis.suit_inv;
 
	end;
 
	
 
	return obj(tab);
 
end;
 
 
labyrinth = function(tab)
 
    local enter = tab.enter;
 
    local exit = tab.exit;
 
    local dsc = tab.dsc;
 
    local lab;
 
    tab.enter = function(s)
 
        path('e1'):disable();
 
        path('e2'):disable();
 
        path('e3'):disable();
 
        path('e4'):disable();
 
        path('ex'):disable();
 
        
 
        local e1open = s.map[s.position].e1 and not EngineUtils.getValue(s.map[s.position].e1lock, s);
 
        local e2open = s.map[s.position].e2 and not EngineUtils.getValue(s.map[s.position].e2lock, s);
 
        local e3open = s.map[s.position].e3 and not EngineUtils.getValue(s.map[s.position].e3lock, s);
 
        local e4open = s.map[s.position].e4 and not EngineUtils.getValue(s.map[s.position].e4lock, s);
 
        local exopen = s.map[s.position].ex and not EngineUtils.getValue(s.map[s.position].exlock, s);
 
        
 
        if (e1open) then
 
            path('e1'):enable();
 
        end;
 
        if (e2open) then
 
            path('e2'):enable();
 
        end;
 
        if (e3open) then
 
            path('e3'):enable();
 
        end;
 
        if (e4open) then
 
            path('e4'):enable();
 
        end;
 
        if (exopen) then
 
            path('ex'):enable();
 
        end;
 
        if (type(enter) == 'function') then
 
            enter(s);
 
        end;
 
        if (type(s.map[s.position].enter) == 'function') then
 
            s.map[s.position].enter(s);
 
        end;
 
    end;
 
    tab.exit = function(s)
 
        if (type(exit) == 'function') then
 
            exit(s);
 
        end;
 
        if (type(s.map[s.position].exit) == 'function') then
 
            s.map[s.position].exit(s);
 
        end;
 
    end;
 
    tab.dsc = function(s)
 
        if (type(dsc) == "function") then
 
            return dsc(s);
 
        else
 
            return dsc .. s.map[s.position].name;
 
        end;
 
    end;
 
    tab.way = {
 
        kh_vroom(tab.dir1, function()
 
            lab.oldposition = lab.position;
 
            lab.position = lab.map[lab.position].e1;
 
            return lab;
 
        end, "e1");
 
        kh_vroom(tab.dir2, function()
 
            lab.oldposition = lab.position;
 
            lab.position = lab.map[lab.position].e2;
 
            return lab;
 
        end, "e2");
 
        kh_vroom(tab.dir3, function()
 
            lab.oldposition = lab.position;
 
            lab.position = lab.map[lab.position].e3;
 
            return lab;
 
        end, "e3");
 
        kh_vroom(tab.dir4, function()
 
            lab.oldposition = lab.position;
 
            lab.position = lab.map[lab.position].e4;
 
            return lab;
 
        end, "e4");
 
        kh_vroom(tab.ex, function()
 
            return lab.map[lab.position].ex;
 
        end, "ex");
 
        kh_vroom("Ждать", function()
 
            lab.oldposition = lab.position;
 
            return lab;
 
        end, "wt");
 
    };
 
    
 
    lab = room(tab);
 
    print(tab);
 
    print(lab);
 
    if (not tab.position) then
 
        stead.add_var(tab, { position = "00"; });
 
    end;
 
    
 
    stead.add_var(tab, { oldposition = tab.position; });
 
    return lab;
 
end;
 
\ No newline at end of file
0 comments (0 inline, 0 general)