Changeset - 0e8e3f82de50
[Not reviewed]
default
0 2 0
silverwing - 7 years ago 2017-07-08 06:43:20

phr as function
2 files changed with 12 insertions and 3 deletions:
0 comments (0 inline, 0 general)
atlantis_navjiarr.lua
Show inline comments
 
@@ -248,435 +248,443 @@ dyp_temple_navigation = dlg {
 
            move(submarine_leviathan, "dyp_temple_south_far");
 
            psub("dyp_temple_south_far");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_south_far"};
 
        {always=true, "[На север, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_south_west");
 
            psub("dyp_temple_south_west");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_north_west"};
 
        {always=true, "[На юго-восток, к храму]", function()
 
            move(submarine_leviathan, "dyp_temple_entrance");
 
            psub("dyp_temple_entrance");
 
        end};
 
        {always=true, "[На запад, в Дипатреанотр]", function()
 
            move(submarine_leviathan, "dyp_city_east");
 
            psub("dyp_city_east");
 
            --TODO enter the city
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_north"};
 
        {always=true, "[На юго-запад, к храму]", function()
 
            move(submarine_leviathan, "dyp_temple_entrance");
 
            psub("dyp_temple_entrance");
 
        end};
 
        {always=true, "[На юг, к скале]", function()
 
            move(submarine_leviathan, "dyp_temple_east");
 
            psub("dyp_temple_east");
 
        end};
 
        {always=true, "[На север, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_middle");
 
            psub("dyp_temple_crevice_middle");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_crevice_middle"};
 
        {always=true, "[На юг, к зарослям]", function()
 
            move(submarine_leviathan, "dyp_temple_north");
 
            psub("dyp_temple_north");
 
        end};
 
        {always=true, "[На восток, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_east");
 
            psub("dyp_temple_crevice_east");
 
        end};
 
        {always=true, "[На север, к скале]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_4");
 
            psub("dyp_temple_cliff_4");
 
        end};
 
        {always=true, "[На запад, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_west");
 
            psub("dyp_temple_crevice_west");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_crevice_east"};
 
        {always=true, "[На юго-запад, к зарослям]", function()
 
            move(submarine_leviathan, "dyp_temple_north");
 
            psub("dyp_temple_north");
 
        end};
 
        {always=true, "[На восток, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_far_east");
 
            psub("dyp_temple_crevice_far_east");
 
        end};
 
        {always=true, "[На северо-восток, к костям]", function()
 
            move(submarine_leviathan, "dyp_temple_whale");
 
            psub("dyp_temple_whale");
 
        end};
 
        {always=true, "[На север, к скале]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_5");
 
            psub("dyp_temple_cliff_5");
 
        end};
 
        {always=true, "[На запад, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_middle");
 
            psub("dyp_temple_crevice_middle");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_crevice_far_east"};
 
        {always=true, "[На север, к костям]", function()
 
            move(submarine_leviathan, "dyp_temple_whale");
 
            psub("dyp_temple_whale");
 
        end};
 
        {always=true, "[На запад, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_east");
 
            psub("dyp_temple_crevice_east");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_crevice_west"};
 
        {always=true, "[На север, к скале]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_3");
 
            psub("dyp_temple_cliff_3");
 
        end};
 
        {always=true, "[На восток, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_middle");
 
            psub("dyp_temple_crevice_middle");
 
        end};
 
        {always=true, "[На юго-восток, к зарослям]", function()
 
            move(submarine_leviathan, "dyp_temple_north");
 
            psub("dyp_temple_north");
 
        end};
 
        {always=true, "[На запад, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_far_west");
 
            psub("dyp_temple_crevice_far_west");
 
        end};
 
        {always=true, "[На северо-запад, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_warning");
 
            psub("dyp_temple_warning");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_crevice_far_west"};
 
        {always=true, "[На север, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_warning");
 
            psub("dyp_temple_warning");
 
        end};
 
        {always=true, "[На восток, вдоль ущелья]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_west");
 
            psub("dyp_temple_crevice_west");
 
        end};
 
        {always=true, "[На юг, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_north_west");
 
            psub("dyp_temple_north_west");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_warning"};
 
        {always=true, "[На север, к скале]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_2");
 
            psub("dyp_temple_cliff_2");
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_far_west");
 
            psub("dyp_temple_crevice_far_west");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_cliff_1"};
 
        {always=true, "[На восток, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_2");
 
            psub("dyp_temple_cliff_2");
 
        end};
 
        {always=true, "[На юго-восток, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_warning");
 
            psub("dyp_temple_warning");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_cliff_2"};
 
        {always=true, "[На восток, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_3");
 
            psub("dyp_temple_cliff_3");
 
        end};
 
        {always=true, "[На юг, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_warning");
 
            psub("dyp_temple_warning");
 
        end};
 
        {always=true, "[На запад, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_1");
 
            psub("dyp_temple_cliff_1");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_cliff_3"};
 
        {always=true, "[На восток, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_4");
 
            psub("dyp_temple_cliff_4");
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_west");
 
            psub("dyp_temple_crevice_west");
 
        end};
 
        {always=true, "[На юго-запад, к обелиску]", function()
 
            move(submarine_leviathan, "dyp_temple_warning");
 
            psub("dyp_temple_warning");
 
        end};
 
        {always=true, "[На запад, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_2");
 
            psub("dyp_temple_cliff_2");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_cliff_4"};
 
        {always=true, "[На восток, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_5");
 
            psub("dyp_temple_cliff_5");
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_middle");
 
            psub("dyp_temple_crevice_middle");
 
        end};
 
        {always=true, "[На запад, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_3");
 
            psub("dyp_temple_cliff_3");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_cliff_5"};
 
        {always=true, "[На восток, вдоль скалы]", function()
 
            temple_found = true;
 
            move(submarine_leviathan, "iyh_far_from_entrance_foot");
 
            walk("iyh_far_from_entrance");
 
            --TODO катсцена при первом прибытии
 
        end};
 
        {always=true, "[На юго-восток, к костям]", function()
 
            move(submarine_leviathan, "dyp_temple_whale");
 
            psub("dyp_temple_whale");
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_east");
 
            psub("dyp_temple_crevice_east");
 
        end};
 
        {always=true, "[На запад, вдоль скалы]", function()
 
            move(submarine_leviathan, "dyp_temple_cliff_4");
 
            psub("dyp_temple_cliff_4");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
        
 
        {tag="dyp_temple_whale"};
 
        {always=true, "[На север, к храму]", function()
 
            temple_found = true;
 
            move(submarine_leviathan, "iyh_far_from_entrance_foot");
 
            walk("iyh_far_from_entrance");
 
            --TODO катсцена при первом прибытии
 
        end};
 
        {always=true, "[На юг, к ущелью]", function()
 
            move(submarine_leviathan, "dyp_temple_crevice_far_east");
 
            psub("dyp_temple_crevice_far_east");
 
        end};
 
        {always=true, "[Отойти от штурвала]", code = [[
 
            walk('leviathan_wheelhouse');
 
        ]]};
 
        {always=true, "[Отправиться в другое место]", code = [[
 
            walk('leviathan_dlg');
 
        ]]};
 
    };
 
};
 

	
 
--[[
 
Ираафаанотр
 
]]
 

	
 
--[[
 
Ираафаанотр.Город
 
]]
 

	
 
iraa_near_city_west = room {
 
    nam = "iraa_near_city_west";
 
    disp = [[Ираафаанотр, у города]];
 
    dsc = [[Ровное илистое плато простирается вокруг насколько хватает взгляда. Вы находитесь на западной окраине Ираафаанотра -- небольшого навьярского поселения. Невысокие каменные здания, раскиданные в кажущемся беспорядке служат жилищем для многих из них. В центре городка возвышается каменный обелиск, с нанесенными на него изображениями. ]];
 
    view = [[Ровное илистое плато простирается вокруг насколько хватает взгляда. Вы находитесь на западной окраине Ираафаанотра -- небольшого навьярского поселения. Невысокие каменные здания, раскиданные в кажущемся беспорядке служат жилищем для многих из них. В центре городка возвышается каменный обелиск, с нанесенными на него изображениями. ]];
 
    obj = {
 
        "iraa_city_west_guard"
 
    };
 
    way = {
 
        kh_vroom("В левиафан", "leviathan_airlock");
 
        kh_vroom("На восток, к центру Ираафаанотра", "iraa_city_west");
 
    };
 
};
 

	
 
iraa_city_west = room {
 
    nam = "iraa_city_west";
 
    disp = "Ираафаанотр, улица";
 
    dsc = [[Широкая мощеная улица, пересекающая город с востока на запад. К северу вы видите обширные поля, обрабатываемые десятками рук и дающие пищу жителям селения. К востоку вы видите каменный обелиск, возвышающийся над центральной площадью Ираафаанотра. ]];
 
    way = {
 
        kh_vroom("На запад", "iraa_near_city_west");
 
        kh_vroom("На восток, к центру Ираафаанотра", "iraa_city_center");
 
    };
 
};
 

	
 
iraa_city_center = room {
 
    nam = "iraa_city_center";
 
    disp = "Ираафаанотр, центральная площадь";
 
    dsc = [[Центральная площадь Ираафаанотра практически пуста. Лишь несколько зевак с интересом разглядывает вас, осторожно выглядывая из дверей библиотеки -- крупного здания, расположенного к северу от вас. Напротив библиотеки расположен дом вождя, не уступающий размерами библиотеке. ]];
 
    obj = {
 
        "iraa_obelisk";
 
    };
 
    way = {
 
        kh_vroom("На запад");
 
        kh_vroom("На восток");
 
        kh_vroom("В библиотеку");
 
        kh_vroom("В дом вождя");
 
    };
 
};
 

	
 
iraa_obelisk = obj {
 
    nam = "iraa_obelisk";
 
    dsc = [[В центре площади стоит большой каменный {обелиск}, с нанесенными на него символами. ]];
 
    act = function(s)
 
        iraaphaanotrr_temple_found = true;
 
        return [[На обелиске, традиционно для навьяров, начертано название города и вырезана карта, указывающая путь к храму. ]];
 
    end;
 
};
 

	
 
iraa_city_east = room {
 
    var {
 
        state = 0;
 
    };
 
    nam = "iraa_city_east";
 
    disp = "Ираафаанотр, улица";
 
    dsc = [[Широкая мощеная улица, пересекающая город с востока на запад. К северу вы видите обширные поля, обрабатываемые десятками рук и дающие пищу жителям селения. К западу вы видите каменный обелиск, возвышающийся над центральной площадью Ираафаанотра. ]];
 
    entered = function(s)
 
        if (state == 0 and char_learr.follow) then
 
            path("На юг, к саду"):enable();
 
            if language_known then
 
                return [[Когда вы почти доходите до дома мэра, Леарр неожиданно останавливается. Она смотрит на юг, а по ее головным плавникам бегут цветные полосы -- она говорит, что здесь, за домом вождя есть небольшой сад, а сразу за ним находится ее дом. Она просит вас пойти туда вместе с ней. ]];
 
                return [[Здесь Леарр неожиданно останавливается. Она смотрит на юг, а по ее головным плавникам бегут цветные полосы -- она говорит, что здесь, за домом вождя есть небольшой сад, а сразу за ним находится ее дом. Она просит вас пойти туда вместе с ней. ]];
 
            else
 
                return [[Когда вы почти доходите до дома мэра, Леарр неожиданно останавливается. Она смотрит на юг, а по ее головным плавникам бегут цветные полосы. Вы не понимаете, что она пытается вам сказать, но она хватает вас за руку и пытается вести за собой на юг. ]];
 
                return [[Здесь Леарр неожиданно останавливается. Она смотрит на юг, а по ее головным плавникам бегут цветные полосы. Вы не понимаете, что она пытается вам сказать, но она хватает вас за руку и пытается вести за собой на юг. ]];
 
            end;
 
        end;
 
    end;
 
    way = {
 
        kh_vroom("На восток", "iraa_near_city_east");
 
        kh_vroom("На юг, к саду", "iraa_garden"):disable();
 
        kh_vroom("На запад, к центру Ираафаанотра", "iraa_city_center");
 
    };
 
};
 

	
 
iraa_garden = room {
 
    nam = "iraa_garden";
 
    disp = "Ираафаанотр, сад";
 
    dsc = [[Небольшой сад, расположенный за домом вождя. ]];
 
    way = {
 
        kh_vroom("На север, к главной улице", "iraa_near_city_east");
 
        kh_vroom("На юг, к дому Леарр", "iraa_learr_house_near");
 
    };
 
};
 

	
 
iraa_learr_house_near = room {
 
    nam = "iraa_learr_house_near";
 
    disp = "Ираафаанотр, у дома Леарр";
 
};
 

	
 
iraa_near_city_east = room {
 
    nam = "iraa_near_city_east";
 
    disp = [[Ираафаанотр, у города]];
 
    dsc = [[Ровное илистое плато простирается вокруг насколько хватает взгляда. Вы находитесь на восточной окраине Ираафаанотра -- небольшого навьярского поселения. Невысокие каменные здания, раскиданные в кажущемся беспорядке служат жилищем для многих из них. В центре городка возвышается каменный обелиск, с нанесенными на него изображениями. ]];
 
    obj = {
 
        "iraa_city_east_guard";
 
    };
 
    way = {
 
        kh_vroom("К центру Ираафаанотра", "iraa_city_east");
 
    };
 
};
 

	
 
iraa_city_west_guard = npc {
 
    nam = "iraa_city_west_guard";
 
    dsc = [[По обе стороны дороги стоят двое навьярских {стражникиов}. ]];
 
    phr = {
 
        "Они не обращают на вас никакого внимания. "
 
    };
 
};
 

	
 
iraa_city_east_guard = npc {
 
    nam = "iraa_city_east_guard";
 
    dsc = [[По обе стороны дороги стоят двое навьярских {стражникиов}. ]];
 
    phr = {
 
        "Они не обращают на вас никакого внимания. "
 
    };
 
};
 

	
 
--[[
 
Ираафаанотр.Храм
 
]]
 
\ 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({...}));
 
	end);
 
 
	v.disable = hook(v.disable, function(f, s, ...)
 
		s._disabled_explicit = true;
 
		return f(s, unpack({...}));
 
	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({...}));
 
		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({...}));
 
		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)];
 
                local phrases = getValue(s.phrases, s);
 
				return phrases[rnd(#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");
0 comments (0 inline, 0 general)