Changeset - 037e19ceec23
[Not reviewed]
default
0 3 0
Silverwing - 8 years ago 2017-02-11 15:39:16

More leviathan improvements
3 files changed with 23 insertions and 40 deletions:
0 comments (0 inline, 0 general)
leviathan.lua
Show inline comments
 
--[[
 
Ваша подводная лодка - Левиафан
 
Для начала вам придется починить ее
 
Имеет электрический двигатель
 
Для запуска машины потребуется его починить и обеспечить энергией
 
Левиафан - достаточно большая подводная лодка. Хотя она может управляться одним человеком, рассчитана она на много большее.
 
 
Имеется три доступных уровня освещения: 
 
Не освещено - ничего не видно, передвигаться по кораблю невозможно
 
Плохо освещено - Описания минимальны, большинство действий недостпны
 
Хорошо освещено - полные описания, все действия доступны
 
 
Можно включить или выключить внешнее освещение
 
 
Скафандры придется зарабатывать на Атлантиде
 
]]
 
 
-- TODO персонажи не должны обсуждать личные темы по телефону, только при встрече
 
 
submarine_leviathan = obj {
 
	var {
 
		hull_integrity = 100; -- Целостность корпуса
 
		electric_integrity = 100; -- Целостность электросистем
 
		torpedoes = 2; -- Количество заряженных торпед
 
		suits = 2; -- Количество водолазных костюмов.
 
		battery = false; -- Состояние батареи 
 
		circuit_breaks = 2; -- Разрывы цепи
 
		valves_to_replace = 2; -- Количество клапанов, которые нужно заменить для полноценной работы
 
		power_on = false; -- включена ли энергия
 
		air_level = 0; -- запас воздуха. Максимум - 5 дней(5 * 24 * 60 * 60 = 432000)
 
		airpump = false;
 
        refit = false;      
 
	};
 
	nam = "submarine_leviathan";
 
	disp = "Левиафан";
 
	dsc = function(s)
 
        --[[
 
            atl_aqua_leviathan_dock
 
            iyh_far_from_entrance_foot
 
            ctt_iraa_city
 
            ctt_iraa_near_temple
 
            ctt_dyp_city
 
            ctt_dyp_temple_entrance
 
        ]]
 
        return [[Вы видите "{Левиафан}" - вашу субмарину. ]];
 
    end;
 
	act = [[Несмотря на проведенные в бездействии годы, субмарина сейчас в отличном состоянии. Из иллюминаторов льется яркий свет. На борту виднеется слегка пошарпанная, но читаемая надпись "А04 - Левиафан" ]];
 
};
 
 
leviathan_airlock = darkroom {
 
	nam = "leviathan_airlock";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, шлюз";
 
	leviathan = true;
 
	dsc_lit = "Шлюзовой отсек Левиафана представляет собой небольшую круглую камеру, около двух метров в диаметре. Отсек освещен ярким светом электрических ламп, смонтированных на стенах. ";
 
	dsc_halflit = "Шлюзовой отсек Левиафана представляет собой небольшую круглую камеру, около двух метров в диаметре. В свете лампы вы различаете предметы окружения. На стенах смонтированы электрические лампы, однако они сейчас не горят. ";
 
	dsc_dark = "Шлюзовой отсек Левиафана представляет собой небольшую круглую камеру, около двух метров в диаметре. Сейчас здесь темно и вы почти ничего не видите. ";
 
	way = {
 
		kh_vroom("В кают-компанию", function(s)
 
			if (have(item_suit)) then
 
				remove(item_suit, pl);
 
			end;
 
			return "leviathan_wardroom";
 
		end, 1);
 
		kh_vroom("В люк", function()
 
			local val = EngineUtils.getValue(where(submarine_leviathan).no_exit);
 
			if (val) then
 
				pr(val);
 
				return false;
 
			else
 
				if (where(submarine_leviathan).underwater) then
 
					put(item_suit, pl);
 
				elseif (have(item_suit)) then
 
					remove(item_suit, pl);
 
				end;
 
				return where(submarine_leviathan);
 
			end;
 
		end, 2);
 
	};
 
    obj = {
 
        "leviathan_suits",
 
        "leviathan_trapdoor"
 
    };
 
};
 
 
leviathan_suits = obj {
 
    nam = "leviathan_suits";
 
    dsc = "У стены стоят два {водолазных костюма}. ";
 
    act = "Костюмы для глубоководного погружения. ";
 
};
 
 
leviathan_trapdoor = obj {
 
    nam = "leviathan_trapdoor";
 
    dsc = "На потолке расположен люк, ведущий наружу субмарины. ";
 
};
 
 
leviathan_captains_cabin = darkroom {
 
    var {
 
        light_on = false;
 
    };
 
    has_light = function(s)
 
        return s.light_on and submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;
 
	nam = "leviathan_captains_cabin";
 
	disp = "Левиафан, каюта капитана";
 
	leviathan = true;
 
	dsc_lit = [[Каюта капитана несколько больше остальных. Под потолком расположена элетрическая лампа, излучающая яркий свет. ]];
 
	dsc_halflit = [[Вы находитесь в каюте, очевидно, предназначенной для капитана. Под потолком расположена элетрическая лампа, однако сейчас она не горит. Эта каюта немного больше остальных. В слабом свете лампы вы с трудом различаете очертания дверей и предметов. ]];
 
	dsc_dark = [[Вы находитесь в одной из кают. В темноте вы не можете ничего различить. ]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
		"phone_cabin";
 
        "lev_capn_desk";
 
        "lev_capn_map";
 
        "lev_capn_chair";
 
        "lev_capn_bed";
 
        "lev_capn_view";
 
	};
 
};
 
 
lev_capn_desk = obj {
 
    nam = "lev_capn_desk";
 
    dsc = [[У стены установлен небольшой стол с несколькими {ящиками}. ]];
 
    act = "Ящики пусты. ";
 
};
 
 
lev_capn_map = obj {
 
    nam = "lev_capn_map";
 
    dsc = [[Над столом висит {карта} Атлантического океана. ]];
 
    act = function(s) 
 
        if atlantis_found then
 
            return [[Карта Атлантического океана, судя по маркировке, принадлежащая компании "Вестхейвен Трансоушен". На ней изображено несколько объектов, имеющих значение для компании и, в частности, Атлантида. ]];
 
        else
 
            atlantis_found = true;
 
            return [[Карта Атлантического океана, судя по маркировке, принадлежащая компании "Вестхейвен Трансоушен". Вы внимательно осматриваете карту в поисках чего-нибудь необычного. Ваше внимание привлекает отметка "Атлантида", сделанная посреди океана. К сожалению, никаких пояснений у вас нет и единственное, что вы можете сделать - это попытаться добраться до этой точки. ]];
 
        end;
 
    end;
 
};
 
 
lev_capn_chair = obj {
 
    nam = "lev_capn_chair";
 
    dsc = "Рядом со столом стоит {кресло}";
 
    act = "Капитанское кресло. Удобное. ";
 
};
 
 
lev_capn_bed = obj {
 
    nam = "lev_capn_bed";
 
    dsc = "У стены напротив стола расположена {койка}. ";
 
    act = "Мне сейчас некогда спать. ";
 
};
 
 
lev_capn_view = obj {
 
    nam = "lev_capn_view";
 
    dsc = "Напротив входа расположен {иллюминатор}. ";
 
    act = function(s)
 
        return here().view_left;
 
    end;
 
};
 
 
lev_capn_ls = obj {
 
    nam = "lev_capn_ls";
 
    dsc = function(s)
 
        if (here().light_on) then
 
            return "У входа находится {выключатель}, Сейчас он включен. ";
 
        else
 
            return "У входа находится {выключатель}, Сейчас он выключен. ";
 
        end;
 
    end;
 
    act = function(s)
 
        pr [[Вы переключаете выключатель. ]];
 
        if (here().light_on) then
 
            here().light_on = false;
 
            if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
                pr [[Свет гаснет. ]];
 
            else
 
                pr [[Ничего не происходит. ]];
 
            end;
 
        else
 
            here().light_on = true;
 
            if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
                pr [[Свет зажигается. ]];
 
            else
 
                pr [[Ничего не происходит. ]];
 
            end;
 
        end;
 
    end;
 
};
 
 
leviathan_cabin_1 = darkroom {
 
	nam = "leviathan_cabin_1";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;
 
	disp = "Левиафан, каюта №1";
 
	leviathan = true;
 
	dsc_lit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, излучающая яркий свет. ]];
 
    dsc_halflit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, однако сейчас она не горит. В слабом свете лампы вы с трудом различаете очертания дверей и предметов.  ]]; 
 
    dsc_dark = [[В помещении темно и вы ничего не видите. ]];  
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
    obj = {
 
        'lev_cab_table';
 
        'lev_cab_beds';
 
        'lev_cab_view';
 
    };   
 
};
 
 
leviathan_cabin_2 = darkroom {
 
	nam = "leviathan_cabin_2";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, каюта №2";
 
	leviathan = true;
 
	dsc_lit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, излучающая яркий свет. ]];
 
    dsc_halflit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, однако сейчас она не горит. В слабом свете лампы вы с трудом различаете очертания дверей и предметов.  ]]; 
 
    dsc_dark = [[В помещении темно и вы ничего не видите. ]];  
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
    obj = {
 
        'lev_cab_table';
 
        'lev_cab_beds';
 
        'lev_cab_view';
 
    };   
 
};
 
 
leviathan_cabin_3 = darkroom {
 
	nam = "leviathan_cabin_3";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, каюта №3";
 
	leviathan = true;
 
	dsc_lit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, излучающая яркий свет. ]];
 
    dsc_halflit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, однако сейчас она не горит. В слабом свете лампы вы с трудом различаете очертания дверей и предметов.  ]]; 
 
    dsc_dark = [[В помещении темно и вы ничего не видите. ]];  
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};      
 
    obj = {
 
        'lev_cab_table';
 
        'lev_cab_beds';
 
        'lev_cab_view';
 
    };   
 
};
 
 
leviathan_cabin_4 = darkroom {
 
	nam = "leviathan_cabin_4";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, каюта №4";
 
	leviathan = true;
 
	dsc_lit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, излучающая яркий свет. ]];
 
    dsc_halflit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, однако сейчас она не горит. В слабом свете лампы вы с трудом различаете очертания дверей и предметов.  ]]; 
 
    dsc_dark = [[В помещении темно и вы ничего не видите. ]];  
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
    obj = {
 
        'lev_cab_table';
 
        'lev_cab_beds';
 
        'lev_cab_view';
 
    };   
 
};
 
 
leviathan_cabin_5 = darkroom {
 
	nam = "leviathan_cabin_5";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, каюта №5";
 
	leviathan = true;
 
	dsc_lit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, излучающая яркий свет. ]];
 
    dsc_halflit = [[Эта каюта ничем не отличается от других, расположенных по левому борту субмарины. Под потолком расположена электрическая лампа, однако сейчас она не горит. В слабом свете лампы вы с трудом различаете очертания дверей и предметов.  ]]; 
 
    dsc_dark = [[В помещении темно и вы ничего не видите. ]];  
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 0);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
    obj = {
 
        'lev_cab_table';
 
        'lev_cab_beds';
 
        'lev_cab_view';
 
    };
 
};
 
 
lev_cab_table = obj {
 
    nam = "lev_cab_table";
 
    dsc = [[У стены рядом с иллюминатором расположен небольшой {столик}. ]];
 
    act = "Столик пуст. ";
 
};
 
 
lev_cab_beds = obj {
 
    nam = "lev_cab_beds";
 
    dsc = [[Напротив стола расположены две {койки} одна над другой. ]];
 
    act = "Мне сейчас некогда спать. ";
 
};
 
 
lev_cab_view = obj {
 
    nam = "lev_cab_view";
 
    dsc = "Напротив входа расположен {иллюминатор}. ";
 
    act = function(s)
 
        return here().view_left;
 
    end;
 
};
 
 
leviathan_corridor = darkroom {
 
	nam = "leviathan_corridor";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, коридор";
 
	leviathan = true;
 
	dsc_lit = [[Длинный коридор со множеством дверей. По всей длине коридора на стенах расположены электрические лампы, излучающие яркий свет. ]];
 
	dsc_halflit = [[Длинный темный коридор. В слабом свете лампы вы с трудом различаете очертания предметов и множества дверей. ]];
 
	dsc_dark = [[Длинный темный коридор. в темноте вы почти ничего не видите. ]];
 
	way = {
 
		kh_vroom("В каюту капитана", "leviathan_captains_cabin", 1);
 
		kh_vroom("В каюту №1", "leviathan_cabin_1", 1);
 
		kh_vroom("В каюту №2", "leviathan_cabin_2", 1);
 
		kh_vroom("В каюту №3", "leviathan_cabin_3", 1);
 
		kh_vroom("В каюту №4", "leviathan_cabin_4", 1);
 
		kh_vroom("В каюту №5", "leviathan_cabin_5", 1);
 
		kh_vroom("В кают-компанию", "leviathan_wardroom", 1);
 
		kh_vroom("В грузовой отсек", "leviathan_cargo_hold", 1);
 
		kh_vroom("В машинный отсек", "leviathan_engines", 1);
 
		kh_vroom("На нижнюю палубу", "leviathan_lower_deck", 1);
 
	};
 
	obj = {
 
		'leviathan_corridor_wiring';
 
	};
 
};
 
 
leviathan_cargo_hold = darkroom {
 
	nam = "leviathan_cargo_hold";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, грузовой отсек";
 
	leviathan = true;
 
	dsc_lit = [[Грузовой отсек Левиафана погружен в кромешный мрак. Отсек практически пуст, не считая обломков, очевидно, оставшихся здесь с момента создания субмарины. Из электрических ламп, установленных на потолке, исходит яркий свет. ]];
 
	dsc_halflit = [[Грузовой отсек Левиафана погружен в кромешный мрак. В свете лампы вы видите, что отсек практически пуст, не считая обломков, очевидно, оставшихся здесь с момента создания субмарины. ]];
 
	dsc_dark = [[Грузовой отсек Левиафана погружен в кромешный мрак. ]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
		"leviathan_cargo_wiring";
 
	};
 
};
 
 
leviathan_wardroom = darkroom {
 
	nam = "leviathan_wardroom";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, кают-компания";
 
	leviathan = true;
 
	dsc_lit = [[В центре просторной кают-компании Левиафана укреплен массивный деревянный стол. Электрические лампы, укрепленные на потолке над столом и на стенах излучают яркий свет. ]];
 
	dsc_halflit = [[В слабом свете лампы вы с трудом различаете очертания предметов. Судя по всему, вы находитесь в кают-компании. В центре установлен массивный стол, вокруг которого стоят несколько стульев. ]];
 
	dsc_dark = [[Кают-компания погружена во мрак и вы совсем ничего не видите. ]];
 
	way = {
 
		kh_vroom("В рубку", "leviathan_wheelhouse", 1);
 
		kh_vroom("В шлюз", "leviathan_airlock", 1);
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
		kh_vroom("В грузовой отсек", "leviathan_cargo_hold", 1):disable();
 
		kh_vroom("В машинный отсек", "leviathan_engines", 1):disable();
 
	};
 
	obj = {
 
		"phone_wardroom";
 
		"leviathan_wardroom_wiring";
 
	};
 
};
 
 
leviathan_engines = darkroom {
 
	nam = "leviathan_engines";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, машинное отделение";
 
	leviathan = true;
 
	dsc_lit = [[Вы стоите на небольшой металлической платформе посреди достаточно большого помещения. Вверху и внизу тянутся какие-то трубы. Слева и справа от вас расположены механизмы, приводящие субмарину в движение. Единственная лампа, расположенная над входом, дает достаточно света, чтобы можно было осмотреться. ]];
 
	dsc_halflit = [[В слабом свете лампы вы с трудом различаете очертания предметов. Вы стоите на небольшой металлической платформе посреди достаточно большого помещения. Вверху и внизу тянутся какие-то трубы. Слева и справа от вас расположены механизмы, приводящие субмарину в движение. ]];
 
	dsc_dark = [[Машинный отсек Левиафана погружен во мрак и вы совсем ничего не видите. ]];
 
	-- Равномерный гул электрических двигателей сообщает о полной готовности субмарины. 
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
	};
 
	obj = {
 
        'leviathan_battery';
 
		'leviathan_breaker';
 
		'leviathan_engineering_sensors';
 
		'leviathan_engineering_wiring';
 
	};
 
};
 
 
leviathan_engineering_sensors = obj {
 
	nam = "leviathan_engineering_sensors";
 
	dsc = [[Рядом с батареей расположена {панель} со множеством лампочек. ]];
 
	act = function(s)
 
		if (submarine_leviathan.battery) then
 
			pr("На панели горят следующие лампочки: ");
 
			pr("батарея работает");
 
			if (submarine_leviathan.power_on) then
 
				pr(", питание включено");
 
                if (submarine_leviathan.airpump) then
 
                    pr(", воздушные насосы включены");
 
                end;
 
                if (submarine_leviathan.circuit_breaks > 0) then
 
                    pr(", разорвана цепь освещения");
 
                end;
 
            end;         
 
			pr(". ");
 
		else
 
			p("На панели не горит ни одна лампочка. ");
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_battery = obj {
 
	nam = "leviathan_battery";
 
	dsc = function(s)
 
		if (s.opened) then
 
			return [[В дальнем конце помещения расположен {блок аккумуляторных батарей}. Крышка блока открыта и вы видите, что электроды подверглись сильной коррозии за долгое время неиспользования. ]];
 
		else
 
			return [[В дальнем конце помещения занимает {блок аккумуляторных батарей}. Крышка блока закрыта. ]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (s.opened) then
 
			s.opened = false;
 
			return [[Вы возвращаете крышку блока батарей на место. ]];
 
		else
 
			if (not submarine_leviathan.battery) then
 
				s.opened = true;
 
				return [[Вы сдвигаете крышку блока батарей в сторону, получая доступ к ней. ]];
 
			else
 
				return [[Незачем это трогать. ]];
 
			end;
 
		end;
 
	end;
 
	used = function(s, o)
 
		if (o == item_electrodes) then
 
			remove(item_electrodes, pl);
 
			submarine_leviathan.battery = true;
 
			s.opened = false;
 
			return [[Вы заменяете электроды. Теперь аккумулятор готов к работе. Вы возвращаете крышку блока батарей на место. ]];
 
		else
 
			return false;
 
		end;
 
	end;
 
	seen_level = 1;
 
	opened = false;
 
};
 
 
leviathan_breaker = obj {
 
	nam = "leviathan_breaker";
 
	dsc = function(s)
 
		if (submarine_leviathan.power_on) then
 
			return [[Рядом с батареей укреплен {рубильник}. Сейчас он включен. ]];
 
		else
 
			return [[Рядом с батареей укреплен {рубильник}. Сейчас он выключен. ]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (submarine_leviathan.power_on) then
 
			submarine_leviathan.power_on = false;
 
			-- TODO включать свет по всему Левиафану, если восстановлены разрывы цепи и установлена батарея
 
			-- TODO включать двигатель если установлена батарея
 
			pr([[Вы выключаете рубильник. ]]);
 
		else
 
			submarine_leviathan.power_on = true;
 
			-- TODO включать двигатель если установлена батарея
 
			pr([[Вы включаете рубильник. ]]);
 
			if (submarine_leviathan.battery and submarine_leviathan.circuit_breaks == 0) then
 
				leviathan_airlock.has_light = true;
 
				leviathan_wardroom.has_light = true;
 
				leviathan_wheelhouse.has_light = true;
 
				leviathan_corridor.has_light = true;
 
				leviathan_cabin_1.has_light = true;
 
				leviathan_cabin_2.has_light = true;
 
				leviathan_cabin_3.has_light = true;
 
				leviathan_cabin_4.has_light = true;
 
				leviathan_cabin_5.has_light = true;
 
				leviathan_captains_cabin.has_light = true;
 
				leviathan_cargo_hold.has_light = true;
 
				leviathan_engines.has_light = true;
 
				leviathan_lower_deck.has_light = true;
 
				leviathan_life_support.has_light = true;
 
				pr([[Повсюда зажигается яркий свет, на мгновение ослепляя вас. ]]);
 
				pr([[Повсюду зажигается яркий свет, на мгновение ослепляя вас. ]]);
 
			end;
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_lower_deck = darkroom {
 
	nam = "leviathan_lower_deck";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, нижняя палуба";
 
	leviathan = true;
 
	dsc_lit = [[Большой отсек на нижней палубе Левиафана освещен электрическими лампами, укрепленными на стенах. Повсюду раскиданы неизвестно откуда взявшиеся обломки металла. В передней части помещения вы видите несколько отверстий для зарядки торпедных аппаратов. ]];
 
	dsc_halflit = [[Большой отсек на нижней палубе Левиафана слабо освещен вашей лампой. Повсюду раскиданы неизвестно откуда взявшиеся обломки металла. В передней части помещения вы видите несколько отверстий для зарядки торпедных аппаратов. ]];
 
	dsc_dark = [[На нижней палубе Левиафана темно и вы совсем ничего не видите. ]];
 
	way = {
 
		kh_vroom("В коридор", "leviathan_corridor", 1);
 
		kh_vroom("К системе жизнеобеспечения", "leviathan_life_support", 1);
 
	};
 
	obj = {
 
		"leviathan_lower_wiring";
 
	};
 
};
 
 
leviathan_life_support = darkroom {
 
	nam = "leviathan_life_support";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, система жизнеобеспечения";
 
	leviathan = true;
 
	dsc_lit = [[Электрическая лампа освещает важнейший отсек корабля. Здесь расположено все необходимое для обеспечения команды воздухом для дыхания в течение нескольких месяцев. ]];
 
	dsc_halflit = [[Слабый свет лампы освещает важнейший отсек корабля. Здесь расположено все необходимое для обеспечения команды воздухом для дыхания в течение нескольких месяцев. ]];
 
	dsc_dark = [[Отсек погружен во мрак и вы не видите совсем ничего. ]];
 
	way = {
 
		kh_vroom("Назад", "leviathan_lower_deck", 1);
 
	};
 
	obj = {
 
		'leviathan_airtanks';
 
		'leviathan_airregen';
 
		"leviathan_life_wiring";
 
	};
 
};
 
 
leviathan_airtanks = obj {
 
	nam = "leviathan_airtanks";
 
	dsc = function(s)
 
		local percent = submarine_leviathan.air_level / 432000 * 100;
 
		if (percent < 1) then
 
			return [[Большую часть помещения занимают {кислородные баллоны}. Толстые стенки из прочного сплава способны выдержать огромное давление. Судя по показаниям приборов, баллоны пусты. ]]
 
		else
 
			return [[Большую часть помещения занимают {кислородные баллоны}. Толстые стенки из прочного сплава способны выдержать огромное давление. Судя по показаниям приборов, баллоны заполнены на ]] .. tostring(math.floor(percent + 0.5)) .. "%. ";
 
		end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_airregen = obj {
 
	nam = "leviathan_airregen";
 
	dsc = [[{Установка регенерации воздуха} сейчас находится в плачевном состоянии - часть деталей отсутствуют, еще некоторые поломаны. ]];
 
	seen_level = 1;
 
};
 
 
leviathan_wheelhouse = darkroom {
 
	nam = "leviathan_wheelhouse";
 
    has_light = function(s)
 
        return submarine_leviathan.power_on and submarine_leviathan.battery;
 
    end;   
 
	disp = "Левиафан, рубка";
 
	leviathan = true;
 
	dsc_lit = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[Небольшое помещение в передней части субмарины освещено ярким светом электрических ламп. Через три огромных иллюминатора вы можете увидеть происходящее снаружи субмарины. ]] .. (view);
 
	end;
 
	dsc_halflit = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[Небольшое помещение в передней части субмарины освещено слабым светом вашей лампы. Через три огромных иллюминатора вы можете увидеть происходящее снаружи субмарины. ]] .. (view);
 
	end;
 
	dsc_dark = function(s)
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[Небольшое помещение в передней части субмарины не освещено. В темноте вы ничего не можете разглядеть. Через три огромных иллюминатора вы можете увидеть происходящее снаружи субмарины. ]] .. (view);
 
	end;
 
	way = {
 
		kh_vroom("В кают-компанию", "leviathan_wardroom", 2);
 
	};
 
	obj = {
 
		'leviathan_handwheel';
 
		'leviathan_airpump_control';
 
		'leviathan_controls';
 
		'leviathan_wheelhouse_sensors';
 
		"leviathan_wheelhouse_wiring";
 
	};
 
};
 
 
leviathan_controls = obj {nam = '1'}
 
 
leviathan_handwheel = obj {
 
	nam = "leviathan_handwheel";
 
	dsc = [[Перед вами расположен {штурвал}. Рядом с ним расположено несколько рычагов. ]];
 
	act = function(s)
 
		if (atlantis_found and submarine_leviathan.air_level > 400000 and submarine_leviathan.circuit_breaks == 0 and submarine_leviathan.power_on) then
 
			--walkin("demo_end");
 
			local dlg = EngineUtils.getValue(where(submarine_leviathan).handwheel_room);
 
			if (dlg) then
 
				walkin(dlg);
 
			else
 
				walkin('leviathan_dlg');
 
			end;
 
		elseif (not submarine_leviathan.power_on) then
 
			return [[Без электричества _"Левиафан"_ не сдвинется с места. ]];
 
		elseif (not atlantis_found) then
 
			return [[Вы не знаете, куда плыть. ]];
 
		elseif (submarine_leviathan.air_level <= 400000) then
 
			return [[Без воздуха вы далеко не уплывете. ]];
 
		elseif (submarine_leviathan.circuit_breaks > 0) then
 
			return [[В темноте вы не можете управлять кораблем. ]];
 
		end;
 
	end;
 
};
 
 
leviathan_airpump_control = obj {
 
	nam = "leviathan_airpump_control";
 
	dsc = function(s)
 
		if (submarine_leviathan.airpump) then
 
			return [[Один из них отвечает за управление {воздушными насосами} и находится сейчас во включенном состоянии. ]];
 
		else
 
			return [[Один из них отвечает за управление {воздушными насосами} и находится сейчас в выключенном состоянии.  ]];
 
		end;
 
	end;
 
	act = function(s)
 
		if (submarine_leviathan.airpump) then
 
			submarine_leviathan.airpump = false;
 
			return [[Вы выключаете воздушные насосы. ]];
 
		else
 
			lifeon(s);
 
			submarine_leviathan.airpump = true;
 
			return [[Вы включаете воздушные насосы. ]];
 
		end;
 
	end;
 
	life = function(s)
 
		if (submarine_leviathan.power_on) then
 
			if (submarine_leviathan.airpump and submarine_leviathan.battery) then
 
				submarine_leviathan.air_level = submarine_leviathan.air_level + 250;
 
				if (submarine_leviathan.air_level > 432000) then submarine_leviathan.air_level = 432000;
 
				pr([[Вы слышите гул работающих насосов. ]]);
 
				end;
 
			end;
 
		end;
 
		if (submarine_leviathan.power_on and submarine_leviathan.airpump and submarine_leviathan.battery) then
 
            submarine_leviathan.air_level = submarine_leviathan.air_level + 4000;
 
            if (submarine_leviathan.air_level > 432000) then 
 
                submarine_leviathan.air_level = 432000;
 
                lifeoff(s);
 
            end;
 
            if (here().leviathan) then
 
                pr([[Вы слышите гул работающих насосов. ]]);
 
            end;
 
        end;
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_controls = obj {
 
	nam = "leviathan_controls";
 
	dsc = [[Остальные {рычаги} используются для управления движением субмарины. ]];
 
	seen_level = 1;
 
};
 
 
leviathan_wheelhouse_sensors = obj {
 
	nam = "leviathan_wheelhouse_sensors";
 
	dsc = [[Чуть ниже рычагов находится небольшая {панель} с лампочками и стрелками каких-то приборов. ]];
 
	act = function(s)
 
		if (submarine_leviathan.battery) then
 
			pr("На панели горят следующие лампочки: ");
 
			pr("батарея работает");
 
			if (submarine_leviathan.power_on) then
 
				pr(", питание включено");
 
			end;
 
			if (submarine_leviathan.airpump) then
 
				pr(", воздушные насосы включены");
 
			end;
 
			if (submarine_leviathan.circuit_breaks > 0) then
 
				pr(", разорвана цепь освещения");
 
			end;
 
			pr(". ");
 
		else
 
			pr("На панели не горит ни одна лампочка. ");
 
		end;
 
		local percent = submarine_leviathan.air_level / 432000 * 100;
 
		pr ([[
 
			Кислородные баллоны заполнены на 
 
		]] .. tostring(math.floor(percent + 0.5)) .. "%. ");
 
	end;
 
	seen_level = 1;
 
};
 
 
leviathan_wiring_dsc = [[Под потолком висят какие-то {провода}. ]];
 
 
leviathan_wiring_act = function(s)
 
	if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
		return [[Возможно, лучше отключить электричество, прежде чем копаться в проводах. ]];
 
	end;
 
	if (s.state == 0) then
 
		return [[Некоторые провода разорваны. ]];
 
	elseif (s.state == 1) then
 
		return [[Некоторые провода перемотаны изолентой. ]];
 
	else
 
		return [[Провода в порядке. ]];
 
	end;
 
end;
 
 
leviathan_wiring_used = function(s, o)
 
	if (submarine_leviathan.power_on and submarine_leviathan.battery) then
 
		return [[Возможно, лучше отключить электричество, прежде чем копаться в проводах. ]];
 
	end;
 
	if (o == item_ducttape and s.state == 0) then
 
		s.state = 1;
 
		submarine_leviathan.circuit_breaks = submarine_leviathan.circuit_breaks - 1;
 
		if (submarine_leviathan.circuit_breaks == 0) then
 
			for i = 1, #leviathan_wiring do
 
				leviathan_wiring[i]:disable();
 
				-- TODO если игрок ТУП pr("Скорее всего, это был последний разрыв. Можно проверять. ");
 
			end;
 
		end;
 
		return [[Вы соединяете провода и заматываете их изолентой. ]];
 
	end;
 
end;
 
 
leviathan_wheelhouse_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_wheelhouse_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_wardroom_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_wardroom_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_engineering_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_engineering_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
 	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_cargo_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_cargo_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_corridor_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_corridor_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_lower_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_lower_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_life_wiring = obj {
 
    var {
 
        state = 2;
 
    };
 
	nam = "leviathan_life_wiring";
 
	dsc = leviathan_wiring_dsc;
 
	act = leviathan_wiring_act;
 
	used = leviathan_wiring_used;
 
	seen_level = 1;
 
};
 
 
leviathan_wiring = {
 
	leviathan_wheelhouse_wiring;
 
	leviathan_wardroom_wiring;
 
	leviathan_engineering_wiring;
 
	leviathan_cargo_wiring;
 
	leviathan_corridor_wiring;
 
	leviathan_lower_wiring;
 
	leviathan_life_wiring;
 
};
 
 
leviathan_dlg = dlg {
 
	nam = "leviathan_dlg";
 
	disp = "Левиафан, рубка";
 
	dsc = function()
 
		local view = "";
 
		if (type(where(submarine_leviathan).view) == "function") then
 
			view = where(submarine_leviathan):view();
 
		else
 
			view = where(submarine_leviathan).view;
 
		end;
 
		
 
		return [[Вы находитесь в рубке Левиафана перед штурвалом. Отсюда вы можете направиться куда-нибудь. Яркий свет электрических ламп освещает помещение. ]] .. (view);
 
	end;
 
	update_options = function()
 
		leviathan_dlg:poff("atlantis", "old_temple", "iraaphaanotrr", "iraaphaanotrr_temple", "dypatreanotrr", "dypatreanotrr_temple");
 
		if (atlantis_found and where(submarine_leviathan) ~= atl_aqua_leviathan_dock) then
 
			leviathan_dlg:pon("atlantis");
 
		end;
 
		if (temple_found and where(submarine_leviathan) ~= iyh_far_from_entrance_foot) then
 
			leviathan_dlg:pon("old_temple");
 
		end;
 
		if (nearest_cities_found) then
 
			if (where(submarine_leviathan) ~= ctt_iraa_city) then
 
				leviathan_dlg:pon("iraaphaanotrr");
 
			end;
 
			if (where(submarine_leviathan) ~= ctt_dyp_city) then
 
				leviathan_dlg:pon("dypatreanotrr");
 
			end;
 
		end;
 
		if (iraaphaanotrr_temple_found and where(submarine_leviathan) ~= ctt_iraa_near_temple) then
 
			leviathan_dlg:pon("iraaphaanotrr_temple");
 
		end;
 
		if (dypatreanotrr_temple_found and where(submarine_leviathan) ~= ctt_dyp_temple_entrance) then
 
			leviathan_dlg:pon("dypatreanotrr_temple");
 
		end;
 
	end;
 
	enter = function(s)
 
		s.update_options();
 
	end;
 
	phr = {
 
		{tag="atlantis", always = "true", "Атлантида", function()
 
			return "Вы прибыли в Атлантиду";
 
		end, function()
 
			move(submarine_leviathan, "atl_aqua_leviathan_dock");
 
			leviathan_dlg:update_options();
 
		end},
 
		{tag="old_temple", always = "true", "Старый храм", function()
 
			return "Вы прибыли в старый храм";
 
		end, function()
 
			move(submarine_leviathan, "iyh_far_from_entrance_foot");
 
			leviathan_dlg:update_options();
 
		end},
 
		{tag="iraaphaanotrr", always = "true", "Ираафаанотр", function()
 
			return "Вы прибыли в Ираафаанотр";
 
		end, function()
 
			move(submarine_leviathan, "ctt_iraa_city");
 
			leviathan_dlg:update_options();
 
		end},
 
		{tag="iraaphaanotrr_temple", always = "true", "Храм Ираафаанотра", function()
 
			return "Вы прибыли в храм Ираафаанотра";
 
		end, function()
 
			move(submarine_leviathan, "ctt_iraa_near_temple");
 
			leviathan_dlg:update_options();
 
		end},
 
		{tag="dypatreanotrr", always = "true", "Дипатреанотр", function()
 
			return "Вы прибыли в Дипатреанотр";
 
		end, function()
 
			move(submarine_leviathan, "ctt_dyp_city");
 
			leviathan_dlg:update_options();
 
		end},
 
		{tag="dypatreanotrr_temple", always = "true", "Храм Дипатреанотра", function()
 
			return "Вы прибыли в храм Дипатреанотра";
 
		end, function()
 
			move(submarine_leviathan, "ctt_dyp_temple_entrance");
 
			leviathan_dlg:update_options();
 
		end},
 
		{always = "true", "Назад", "", function()
 
			back();
 
		end}
 
	};
 
};
 
 
phone_wheelhouse = obj {
 
	nam = "phone_wheelhouse";
 
	disp = "Телефон";
 
	dsc = [[Рядом со штурвалом установлен {телефонный аппарат} для связи в пределах субмарины. ]];
 
	act = function(s)
 
        if (not submarine_leviathan.power_on or not submarine_leviathan.battery) then
 
            return [[Без электричества телефон не заработает. ]];
 
        elseif (#pl.party < 1) then
 
            return [[Здесь никого нет. ]];
 
        else
 
            walkin(phone_dlg);
 
        end;      
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_cabin = obj {
 
	nam = "phone_cabin";
 
	disp = "Телефон";
 
	dsc = [[На столе установлен {телефонный аппарат} для связи в пределах субмарины. ]];
 
	act = function(s)
 
		if (not submarine_leviathan.power_on or not submarine_leviathan.battery) then
 
            return [[Без электричества телефон не заработает. ]];
 
        elseif (#pl.party < 1) then
 
            return [[Здесь никого нет. ]];
 
        else
 
            walkin(phone_dlg);
 
        end;
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_wardroom = obj {
 
	nam = "phone_wardroom";
 
	disp = "Телефон";
 
	dsc = [[На столе, рядом с креслом командира установлен {телефонный аппарат} для связи в пределах субмарины. ]];
 
	act = function(s)
 
		if (not submarine_leviathan.power_on or not submarine_leviathan.battery) then
 
            return [[Без электричества телефон не заработает. ]];
 
        elseif (#pl.party < 1) then
 
            return [[Здесь никого нет. ]];
 
        else
 
            walkin(phone_dlg);
 
        end;
 
	end;
 
	seen_level = 1;
 
};
 
 
phone_dlg = dlg {
 
	nam = "phone_dlg";
 
	disp = "Телефон";
 
	hideinv = true;
 
	dsc = [[Вы снимаете трубку и можете вызвать кого-нибудь. ]];
 
	entered = function(s)
 
		poff("phaetlarr", "learr", "radcliffe", "wright", "aikerjarr", "anna");
 
		for i = 1, #pl.party do
 
			pon(pl.party[i]);
 
		end;
 
	end;
 
	phr = {
 
		{ tag = "aikerjarr", always = true, "Аикерьярр", [[Аикерьярр не берет трубку. ]]},
 
		{ tag = "phaetlarr", always = true, "Фаэтларр", code = [[walkin(phaetlarr_phone_dlg)]]},
 
		{ tag = "learr", always = true, "Леарр", code = [[walkin(learr_phone_dlg)]]},
 
		{ tag = "radcliffe", always = true, "Уолтер Рэдклифф", code = [[walkin(radcliffe_phone_dlg)]]},
 
		{ tag = "wright", always = true, "Джек Райт", code = [[walkin(wright_phone_dlg)]]},
 
		{ tag = "anna", always = true, "Анна Рэдклифф", code = [[walkin(anna_phone_dlg)]]},
 
		{ tag = "exit", always = true, "Положить трубку", code = [[back()]]}
 
	}
 
};
 
 
function leviathan_init()
 
	put(submarine_leviathan:disable(), dock_mooring);
 
	local i = 0;
 
	while i < submarine_leviathan.circuit_breaks do
 
		local t = rnd(#leviathan_wiring);
 
		if (leviathan_wiring[t].state == 2) then
 
			leviathan_wiring[t].state = 0;
 
			i = i + 1;
 
		end;
 
	end;
 
end;
 
\ No newline at end of file
utils.lua
Show inline comments
 
--[[
 
	Общие утилиты для игр на Instead. Скорее всего будут повторно использоваться в следующих играх, если таковые будут.
 
]]
 
 
--[[
 
]]
 
ArrayUtils = {
 
	indexOf = function(array, item)
 
		for i = 1, #array do
 
			if (array[i] == item) then
 
				return i;
 
			end;
 
		end;
 
		return 0;
 
	end;
 
};
 
 
--[[
 
	
 
]]
 
PartyUtils = {
 
	addToParty = function(object)
 
		if (object.home) then 
 
			if (ArrayUtils.indexOf(pl.party, object.nam) == 0) then
 
				move(object, object.home);
 
				table.insert(pl.party, object.nam);
 
			end;
 
		end;
 
	end;
 
};
 
 
--[[
 
    functions, design to simplify some typical actions while developing Instead game
 
]]
 
EngineUtils = {
 
    getStringValue = function(source, param)
 
        local value = "";
 
        if (type(source) == "function") then
 
            value = source(param);
 
        else
 
            value = source;
 
        end;
 
 
        return value;
 
    end;
 
 
    getValue = function(source, param)
 
        local value = nil;
 
        if (type(source) == "function") then
 
            value = source(param);
 
        else
 
            value = source;
 
        end;
 
 
        return value;
 
    end;
 
};
 
 
--[[
 
	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;
 
        disp = disp;
 
        entered = entered;
 
        hideinv = true;
 
        cutscene = true;
 
        dsc = dsc;
 
        obj = {
 
            vway("continue", "{Продолжить}", nxt);
 
        };
 
    };
 
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;
 
 
_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;
 
        return "";
 
    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;
 
        return "";
 
    end;
 
};
 
 
_kh_cancel = obj {
 
    nam = "_kh_cancel";
 
    dsc = "{Отмена}";
 
    act = function(s)
 
        back();
 
        return "";
 
    end;
 
};
 
 
_kh_enter = obj {
 
    nam = "_kh_enter";
 
    dsc = "{Ввод}";
 
    act = function(s)
 
        if (here().input) then
 
            here():check(here().input);
 
        end;
 
        return "";
 
    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_suit_menu = dlg {
 
	nam = "Скафандр";
 
	_item = nil;
 
	dsc = [[
 
		Что вы хотите сделать?
 
	]];
 
	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)
 
			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)
 
			back();
 
			return "";
 
		end};
 
	};
 
};
 
 
_atlantis = {
 
	suit_inv = function(s)
 
		_atlantis_suit_menu._item = s;
 
		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
wright.lua
Show inline comments
 
--[[
 
Здесь игрок получает адреса всех ключевых локаций первой части
 
]]
 
door_wright = obj {
 
    var {
 
        locked = true;
 
    };
 
	nam = "door_wright";
 
	disp = "Дверь";
 
	act = function(s)
 
		if (s.locked) then
 
			walkin "wright_entry_dlg";
 
		end;
 
		return true;
 
	end;
 
	dsc = function(s)
 
		if (s.locked) then
 
			return [[Обшарпанная деревянная {дверь}, ведущая в дом, заперта изнутри. ]];
 
		else
 
			return [[Обшарпанная деревянная {дверь}, ведущая в дом, незаперта. ]];
 
		end;
 
	end;
 
};
 
 
char_wright_home = obj {
 
    var {
 
        known = false;
 
        documents = false;
 
        known_leviathan = false;
 
    };
 
	nam = "char_wright_home";
 
	disp = "Джек Райт";
 
	dsc = function(s)
 
		if (s.documents) then
 
			return [[За столом сидит {Джек Райт} и с интересом рассматривает схемы, которые вы ему отдали. ]];
 
		else
 
            if (s.known) then
 
                return [[За столом сидит {Джек Райт}, неспешно просматривая какие-то бумаги. ]];
 
            else
 
			    return [[За столом сидит {молодой человек}, неспешно просматривающий какие-то бумаги. ]];
 
            end;         
 
		end;
 
	end;
 
	act = function(s)
 
		walkin(wright_dlg);
 
	end;
 
};
 
 
wright_dlg = dlg {
 
    var {
 
        state = 1;
 
    };
 
	nam = "wright_dlg";
 
	disp = "Джек Райт";
 
	entered = function(s)
 
        if (submarine_leviathan.power_on and submarine_leviathan.airpump and submarine_leviathan.battery and submarine_leviathan.air_level < 432000) then
 
            submarine_leviathan.air_level = 432000;
 
            lifeoff(s);
 
        end;   
 
		if (atlantis_found and submarine_leviathan.air_level > 400000 and submarine_leviathan.circuit_breaks == 0 and submarine_leviathan.power_on) then
 
			psub('leviathan_restored');
 
			return [[Джек Райт отвлекается от газеты: "Добрый день". ]];
 
		elseif (s.state == 1) then
 
			--First meeting
 
            char_wright_home.known = true;         
 
			psub('first_visit');
 
			return [[Перед вами молодой человек, одетый в недорогой, но опрятный костюм. Его бледное лицо украшает короткая темная борода и пышные усы. Темные волосы коротко острижены. Серые глаза с интересом разглядывают вас. Он протягивает вам руку и представляется: "Добрый день. Мое имя -- Джек Райт. Майкл -- мой отец, но он пропал несколько лет назад". ]];
 
		elseif (s.state == 2) then
 
			--Documents not given
 
			psub('ask_documents');
 
			return [[Джек отвлекается от газеты: "Добрый день. Вы обещали принести какие-то документы". ]];
 
		elseif (s.state == 3) then
 
			--Documents given
 
			if (not leviathan_discovered) then
 
				psub('checking_documents');
 
				return [[Джек отвлекается от документов: "Добрый день. Если вы по поводу документов, то я еще ничего не нашел". ]];
 
			else
 
				s.state = 5;
 
				warehouse32_found = true;
 
				psub('warehouse_discovered');
 
				return [[Джек отвлекается от документов: "Добрый день. У меня хорошие новости. Я нашел склад 32", - он достает карту города и показывает вам место. ]];
 
			end;
 
		elseif (s.state == 4) then
 
			--Documents taken back
 
			psub('ask_documents2');
 
			return [[Джек отвлекается от газеты: "Добрый день. Я хотел бы еще раз вглянуть на эти бумаги". ]];
 
		elseif (s.state == 5) then
 
			psub('warehouse_discovered2');
 
            poff("phr_warehouse_visited");
 
            poff("phr_leviathan");
 
            if (warehouse32_visited) then
 
                pon("phr_warehouse_visited");
 
            end;
 
            if (not char_wright_home.known_leviathan) then
 
                pon("phr_leviathan");
 
            end;
 
			return [[Джек отвлекается от газеты: "Добрый день". ]];
 
		elseif (s.state == 7) then
 
			psub('warehouse_discovered3');
 
			return [[Джек отвлекается от газеты: "Добрый день". ]];
 
		end;
 
	end;
 
	phr = {
 
		{tag='first_visit'};
 
		{"Мое имя -- Дэвид Дрейк. Мне удалось найти кое-какие документы в одном из тайников отца. Этот адрес был среди них. Вы что-то знаете о судьбе моего отца? ", [[Джек вздыхает: "Это бесполезно. Я изучил практически все, до чего сумел дотянуться - газеты, судебные дела. И ничего - никаких зацепок. Компания обанкротилась, руководители пропали". ]], code [[wright_dlg.state = 2; psub('ask_documents'); ]]};
 
		{tag='ask_documents'};
 
		{always = true, "[Отдать документы]Посмотрите это. Не думаю, что вы это видели. ", [[Джек нехотя забирает бумаги из ваших рук и бегло их осматривает. Пожимая плечами, он комментирует: "Ничего интересного, просто планы старых зданий. Док 2? Отец там часто бывал, впрочем не думаю, что после 10 лет там что-то осталось. Если хотите - можете оставить документы, я попробую разузнать побольше". ]], code [[ 
 
			dock_found = true;
 
			wright_dlg.state = 3; 
 
			remove(item_charts, pl); 
 
			psub("checking_documents");
 
		]]};
 
		{always = true, "У меня есть несколько вопросов. ", [[Джек кивает: "Чем смогу - помогу". ]], code [[psub('questions')]]};
 
		{always = true, "Я вернусь позже. ", [[ Джек возвращается к своим делам: "До встречи". ]], code [[ back(); ]]};
 
		{tag='checking_documents'};
 
		{always = true, "Вы можете вернуть мне бумаги? ", [["Конечно. Если принесете их снова -- я возобновлю поиски", - Джек возвращает вам документы. ]], code [[
 
			wright_dlg.state = 4;
 
			put(item_charts, pl);
 
			back();
 
		]]};
 
		{always = true, "У меня есть несколько вопросов. ", [[Джек кивает: "Чем смогу - помогу". ]], code [[psub('questions')]]};
 
		{always = true, "Я вернусь позже. ", [[Джек возвращается к своим делам: "До встречи". ]], code [[ back(); ]]};
 
		{tag='questions'};
 
		{"Чем ваш отец занимался в Вестхейвен Трансоушен? ", [["Частично", - Джек показывает на картину на стене: "Он проектировал корабли, был главным инженером. Перед тем, как исчезнуть, он часто запирался в этом кабинете, подолгу что-то чертил. До глубокой ночи книги читал... Никаких материалов он не оставил. Он, вообще, очень ответственно относился к этому - никто никогда не знал, чем конкретно он занимается, кроме его подчиненных и вашего отца". ]]};
 
		{always = true, "Вернемся к делу. ", [[Джек кивает: "Хорошо". ]], code [[ pret(); ]]};
 
		{tag='ask_documents2'};
 
		{always = true, "[Отдать документы]Вот документы. ", [[Джек забирает бумаги и раскладывает их на своем столе: "Спасибо, я посмотрю, что смогу найти". ]], code[[ wright_dlg.state = 3; remove(item_charts, pl); back(); ]]};
 
		{always = true, "У меня есть несколько вопросов. ", [[Джек кивает: "Чем смогу - помогу". ]], code [[psub('questions')]]};
 
		{always = true, "Я вернусь позже. ", [[Джек возвращается к своим делам: "До встречи". ]], code [[ back(); ]]};
 
		{tag='warehouse_discovered'};
 
		{"[Рассказать о Левиафане]Я кое-что нашел в доке...", [[Джек мгновенно вскакивает со стула, восклицая: "Ничего себе, я должен это видеть!" ]], code [[
 
            char_wright_home.known_leviathan = true;
 
            rel_jack = rel_jack + 1;
 
            walkin('wright_leviathan_cutscene1'); 
 
        ]]};
 
		{always = true, "Отлично, я съезжу туда и посмотрю, что удастся найти. ", [[Джек возвращается к своим делам: "До встречи". ]], code [[ back(); ]]};
 
		{tag='warehouse_discovered2'};
 
        {tag="phr_leviathan", "[Рассказать о Левиафане]Я кое-что нашел в доке...", [[Джек мгновенно вскакивает со стула, восклицая: "Ничего себе, я должен это видеть!" ]], code [[
 
            char_wright_home.known_leviathan = true;
 
            rel_jack = rel_jack + 1;
 
            walkin('wright_leviathan_cutscene1'); 
 
        ]]};      
 
		{tag="phr_warehouse_visited", always = true, "На склад мне попасть не удалось. ", function(s)
 
            if (char_wright_home.known_leviathan) then
 
                psub("warehouse_break_in");
 
                return [[Джек с досадой стучит по столу: "Черт! "^ Еще пару минут он задумчиво сидит в кресле, после чего предлагает идею: "Мы можем попробовать проникнуть туда тайком. Я довезу вас туда, но внутри все делать придется вам". ]]
 
            else
 
                psub('warehouse_break_in_reluctant');
 
                return [[Джек вздыхает: "Ну вот и все. Боюсь, больше мы ничего не узнаем". ]];
 
            end;
 
        end};
 
		{always = true, "Я вернусь позже. ", [[Джек возвращается к своим делам: "До встречи". ]], code [[ back(); ]]};
 
		{tag='warehouse_break_in'};
 
		{always = true, "Надо попробовать. ", [["Хорошо", - отвечает Джек. Приготовления занимают все время до вечера. Наконец, после наступления темноты, вы садитесь в повозку и Джек привозит вас к складу 32. ]], code [[ walk('warehouse_32_night'); ]]};
 
		{always = true, "Лучше не стоит. ", [[Джек разочарованно отвечает: "Очень жаль". ]], code [[ pret(); ]]};
 
        {tag='warehouse_break_in_reluctant'};
 
        {always = true, "Мы можем попробовать проникнуть туда. Вдруг там что-то сохранилось?", [[Джек удивленно переспрашивает: "Проникнуть? Дэвид, вы в своем уме?"]], code [[ psub("w_bir2");]]};
 
        {always = true, "Я пойду", [[Джек возвращается к своим делам: "До встречи". ]]};
 
        {tag="w_bir2"};
 
        {always = true, "Если мы хотим найти моего и вашего отца - нам нужно действовать вместе", [[Джек отрицательно качает головой: "Я не готов действовать такими методами". ]], code [[ psub("w_bir3");]]};
 
        {always = true, "Вы правы, это глупо", [[Джек молча кивает. ]], code [[ pret(); ]]};
 
        {tag="w_bir3"};
 
        {"Вы готовы остановиться в шаге от цели?", [[Джек отвечает не сразу: "Мы не знаем, насколько мы близко. "]]};
 
        { "У нас нет другого выбора. Это наша единственная зацепка", [[Джек берет карандаш, вертит его в руках несколько минут, потом смотрит на картину. Наконец, он соглашается: "Будь по вашему". Приготовления занимают все время до вечера. Наконец, после наступления темноты, вы садитесь в повозку и Джек привозит вас к складу 32. ]], code [[
 
            rel_jack = rel_jack - 1;
 
            walk("warehouse_32_night");
 
        ]]};
 
        {"У вас есть другие предложения?", [[Джек вздыхает: "Нет. Придется признать, поиски зашли в тупик". ]]};
 
        {always = true, "Вы правы, это глупо", [[Джек молча кивает. ]], code [[ psub("warehouse_break_in_reluctant"); ]]};
 
		{tag='warehouse_discovered3'};
 
		{always = true, "Надо еще раз попасть на склад. ", [["Хорошо", - отвечает Джек. После наступления темноты, вы садитесь в повозку и Джек привозит вас к складу 32. ]], code [[ psub('warehouse_break_in'); ]]};
 
		{always = true, "Я вернусь позже. ", [["До встречи". ]], code [[ back(); ]]};
 
		{tag='leviathan_restored_known'};
 
		{always = true, "Мне удалось починить \"Левиафан\". Мне понадобится помощник на борту. ", [[Джек поднимается с кресла и одевает пальто: "Безусловно, я готов", - сообщает вам он. "Здесь меня ничто не держит". ]], code [[ 
 
			lifeon("char_wright");
 
			table.insert(pl.party, 'wright');
 
			walk('leviathan_wardroom'); 
 
		]]};
 
		{always = true, "Я вернусь позже. ", [[
 
			"До встречи".
 
		]], code [[ back(); ]]};
 
        {tag='leviathan_restored'};
 
        {always = true, "Я нашел подводный корабль. Мне понадобится помощь в управлении им. ", [[Джек мгновенно вскакивает со стула, восклицая: "Ничего себе! Я должен это видеть!". ]], code [[ 
 
            lifeon("char_wright");
 
            table.insert(pl.party, 'wright');
 
            walk('wright_leviathan_cutscene2'); 
 
        ]]};
 
        {always = true, "Я вернусь позже. ", [[
 
            "До встречи".
 
        ]], code [[ back(); ]]};
 
	};
 
};
 
 
wright_leviathan_cutscene2 = cutscene("wright_leviathan_cutscene2", "Причал", [[Вместе с Джеком вы приезжаете в док. Райт долго и с интересом осматривает корпус _"Левиафана"_. Внутри, Джек долго обходит отсеки, разглядывая все узлы. Наконец, вы оказываетесь в кают-компании и он сообщает: "Я готов". ]], 'leviathan_wardroom');
 
 
wright_leviathan_cutscene1 = dlg {
 
	nam = "wright_leviathan_cutscene1";
 
	disp = "Причал";
 
	entered = [[
 
		Вместе с Джеком вы приехали в док 2. Райт долго и с интересом осматривает металлический корпус субмарины. С задумчивым видом он ходит вокруг, рассматривая его. Наконец он спрашивает: "Она работает?"
 
	]];
 
	phr = {
 
		{"10 лет под водой. Не думаю, что там хоть что-то сохранилось... ", [[
 
			Джек задумчиво смотрит на металлический корпус, на табличку с выгравированным названием. Наконец он говорит: "Надо попытаться попасть внутрь, а затем посмотрим". Еще немного постояв, он возвращается к кэбу. Джек оборачивается к вам и спрашивает: "Едешь?"
 
		]], code [[ psub('choice'); ]]};
 
		{"Не уверен, но, думаю, да. ", [[
 
			Джек задумчиво смотрит на металлический корпус, на табличку с выгравированным названием. Наконец он говорит: "Надо попытаться попасть внутрь, а затем посмотрим". Еще немного постояв, он возвращается к кэбу. Джек оборачивается к вам и спрашивает: "Едешь?"
 
		]], code [[ psub('choice'); ]]};
 
		{tag='choice'};
 
		{"Да, поехали. ", [[	
 
			Вы садитесь в кэб и возвращаетесь домой к Джеку. 
 
		]], [[
 
			walk('wright_house_cabinet');
 
		]]};
 
		{"Я останусь тут. ", [[	
 
			Джек садится в кэб и уезжает домой. 
 
		]], [[
 
			walk('dock_mooring');
 
		]]};
 
	};
 
};
 
 
wright_entry_dlg = dlg {
 
	nam = "wright_entry_dlg";
 
	disp = "Голос за дверью";
 
	entered = function(s)
 
		psub("start");
 
		return [[
 
			Вы стучите в дверь. Через некоторое время вам отвечает сонный голос: "Кто здесь?"
 
		]];
 
	end;
 
	hideinv = true;
 
	phr = {
 
		{tag = "start"};
 
		{always = true, "Могу я увидеть Майкла Райта?", [[
 
			"Кто спрашивает?"
 
		]], code [[ psub('who') ]]};
 
		{always = true, "Извините, я ошибся адресом", code [[ back(); ]]},
 
		{tag = 'who'};
 
		{"Вы знаете Уильяма Дрейка?", [[
 
			"Понятия не имею. Кто спрашивает?" - В голосе собеседника явно прослеживается некоторое недовольство. 
 
		]], code [[ psub('irritated') ]]};
 
		{"Майкл Райт здесь живет?", [[
 
			"Кто спрашивает?" - В голосе собеседника явно прослеживается некоторое недовольство. 
 
		]], code [[ psub('irritated') ]]};
 
		{always = true, "У меня важное сообщение для него", [[
 
			"Он тут не живет уже много лет. Уходите" - вам показалось, что голос собеседника слегка дрогнул при этих словах. 
 
		]], code [[ back(); ]]};
 
		{tag = 'irritated'};
 
		{"Мой отец - Уильям Дрейк, работал с Майклом Райтом. Так вы знаете его?", [[
 
			Вы слышите звук отодвигающегося засова и ответ: "Проходите". 
 
		]], code [[ 
 
			door_wright.locked = false;
 
			path("В дом", wright_house):enable();
 
			back();
 
		]]};
 
	};
 
};
 
 
wright_drawing = obj {
 
	nam = 'wright_drawing';
 
	dsc = [[На стене напротив двери висит большая {картина}, изображающая пароход. ]];
 
	act = [[На картине во всех деталях изображен пароход _"Огненная стрела"_, принадлежавший Вестхейвен Трансоушен, полным ходом идущий по бескрайнему океану. Яркое солнце освещает палубу, на которой находится множество пассажиров, прогуливающихся, общающихся, сидящих на скамейках. Из всех трех труб _"Огненной стрелы"_ идет густой черный дым, а на корме развевается флаг Соединенного Королевства. Под картиной вы видите небольшую табличку с надписью: _"Майклу Райту, создателю ,,Огненной стрелы''. Альберт Мур, 1889"_. ]];
 
};
 
 
wright_table = obj {
 
	nam = "wright_table";
 
	disp = "Стол";
 
	dsc =[[В центре комнаты стоит массивный дубовый стол. На его полированной поверхности разбросаны в кажущемся беспорядке бумаги, письменные принадлежности, старые газеты и другие предметы. ]];
 
};
 
 
wright_house_cabinet = room {
 
	nam = "wright_house_cabinet";
 
	disp = "Дом Райта, кабинет";
 
	dsc = [[Стены комнаты оклеены старыми обоями с полустершимся рисунком. Сквозь большие окна в комнату проникает достаточно света. ]];
 
	obj = {
 
        'wright_drawing',   
 
		'wright_table',
 
		'char_wright_home'
 
	};
 
	way = {
 
		vroom("В гостиную", "wright_house_front_room");
 
	};
 
};
 
 
wright_house_front_room = room {
 
	nam = "wright_house_front_room";
 
	disp = "Дом Райта, гостиная";
 
	dsc = [[Окна в гостиной завешены тяжелыми занавесками и в полутьме вы с трудом различаете очертания предметов интерьера - дорогих старых кресел, изящно украшенных шкафов, покрытых многолетним слоем пыли канделябров. ]];
 
	entered = function(s)
 
		if (not s.visited) then
 
			s.visited = true;
 
			pn([[У двери стоит молодой человек, примерно вашего возраста. Как только вы заходите, он закрывает за вами дверь и просит проследовать за ним в кабинет. ]]);
 
		end;
 
	end;
 
	way = {
 
		vroom("На улицу", "wright_house");
 
		vroom("В кабинет", "wright_house_cabinet");
 
	};
 
};
 
 
wright_house = room {
 
	nam = "wright_house";
 
	disp = "Дом Райта";
 
	enter = function(s)
 
		put(char_coachman, here());
 
	end;
 
    dsc = [[Небольшой кирпичный особняк, принадлежащий Майклу Райту, стоит на одной из тихих улочек, на окраине Лондона. Дом выглядит неухоженным - штукатурка местами осыпалась, лужайка заросла высокой травой, часть окон закрыта ставнями, явно давно не открывавшимися. ]];
 
	obj = {'door_wright'};
 
	way = {
 
		vroom("В дом", "wright_house_front_room"):disable();
 
	};
 
};
 
\ No newline at end of file
0 comments (0 inline, 0 general)