Changeset - 5c21237a618f
[Not reviewed]
default
0 3 0
Silverwing - 8 years ago 2017-01-21 10:33:40

savegame fixes
3 files changed with 45 insertions and 30 deletions:
0 comments (0 inline, 0 general)
items.lua
Show inline comments
 
@@ -34,100 +34,104 @@ item_spear = obj {
 
    inv = [[Копье, добытое Фаэтларром в честном бою. ]];
 
    use = function(s, o)
 
        local canhit = false;
 
        if (type(o.canhit) == "function") then
 
            canhit = o.canhit(o);
 
        else
 
            canhit = o.canhit;
 
        end;
 
        
 
        if (canhit) then
 
            if (o.onhit) then
 
                return(o.onhit(o));
 
            else
 
                return "";
 
            end;
 
        elseif (o.nohitmsg) then
 
            return o.nohitmsg;
 
        else
 
            return "Я не буду этого делать!";
 
        end;
 
    end;
 
};
 
 
item_colt = obj {
 
    var {
 
        bullets = 6;
 
    };
 
	nam = "colt";
 
	bullets = 6;
 
	disp = function(s)
 
		return "Кольт (" .. tostring(s.bullets) .. " зарядов)";
 
	end;
 
	dsc = [[Ваш револьвер. Надежное оружие в хорошем состоянии. Оно еще не раз спасет вашу жизнь. У вас также есть небольшой запас патронов к нему. ]];
 
	use = function(s, o)
 
        if (here().underwater) then
 
            return "Под водой это вам не поможет. ";
 
        end;
 
    
 
		if (s.bullets == 0) then
 
			return "Нужно перезарядиться, патроны кончились";
 
		end;
 
		
 
		local canshoot = false;
 
		if (type(o.canshoot) == "function") then
 
			canshoot = o.canshoot(o);
 
		else
 
			canshoot = o.canshoot;
 
		end;
 
		
 
		if (canshoot) then
 
			s.bullets = s.bullets - 1;
 
			p("Вы стреляете в "..o.disp2 .. ". ");
 
			if (o.onshoot) then
 
				return(o.onshoot(o));
 
			else
 
				return "";
 
			end;
 
		elseif (o.noshootmsg) then
 
			return o.noshootmsg;
 
		else
 
			return "Я не буду этого делать!";
 
		end;
 
	end;
 
	inv = function(s)
 
		if (s.bullets > 0) then
 
			return [[Ваш револьвер. Надежное оружие в хорошем состоянии. Оно еще не раз спасет вашу жизнь. У вас также есть небольшой запас патронов к нему. ]];
 
		else
 
			s.bullets = 6;
 
			p [[Вы перезаряжаете ваш револьвер и оружие снова готово к бою. ]];
 
            if (type(here().onreload) == 'function') then
 
                here().onreload();
 
            end;
 
		end;
 
	end;
 
};
 
 
item_harpoon = obj {
 
    var {
 
        charge = 1;
 
    };
 
    nam = "item_harpoon";
 
    charge = 1;
 
    disp = function(s)
 
        if (s.charge == 0) then
 
            return "Гарпунное ружье (разряжено)";
 
        else
 
            return "Гарпунное ружье (заряжено)";
 
        end;
 
    end;
 
    dsc = [[
 
        
 
    ]];
 
    use = function(s, o)
 
        if (s.charge == 0) then
 
            return "Ружье не заряжено. ";
 
        end;
 
        
 
        local canshoot = false;
 
        if (type(o.canshoot) == "function") then
 
            canshoot = o:canshoot();
 
        else
 
            canshoot = o.canshoot;
 
        end;
 
        
 
        local canthrust = false;
 
        if (type(o.canthrust) == "function") then
main.lua
Show inline comments
 
@@ -60,60 +60,64 @@ global {
 
	leviathan_discovered = false;
 
	atlantis_found = false;
 
	temple_found = false;
 
	nearest_cities_found = false;
 
	iraaphaanotrr_temple_found = false;
 
	dypatreanotrr_temple_found = false;
 
    venaedanotrr_temple_found = false;
 
    zayslanotrr_temple_found = false;
 
    deep_temple_found = false;
 
    lseryanotrr_found = false;
 
	
 
	rel_phaetlarr = 0;
 
	rel_walter = 0;
 
	rel_learr = 0;
 
	rel_anna = 0;
 
	rel_jack = 0;
 
    
 
    dt_code = {};
 
    dt_buttons = {};
 
};
 
 
 
 
player_drake = player {
 
    var {
 
        hp = 10;
 
        has_light = false;
 
        party = {--[["learr", "radcliffe", "phaetlarr", "wright"]]};
 
        companion = nil;
 
        money = 200;
 
    };
 
	nam = "player";
 
	disp = "Дэвид Дрейк";
 
    disp2 = "Дрейка";
 
    disp3 = "Дрейку";
 
	where = 'port';
 
	hp = 10;
 
	
 
	obj = {'item_umbrella', 'item_charts', 'item_note_1', 'item_money', 
 
	};
 
	-- party array. Should be empty on start
 
	party = {--[["learr", "radcliffe", "phaetlarr", "wright"]]};
 
	companion = nil;
 
	money = 200;
 
	
 
	pay = function(s, c)
 
		if (s.money >= c) then
 
			s.money = s.money - c;
 
			return true;
 
		else
 
			return false;
 
		end;
 
	end;
 
};
 
 
intro = room {
 
	nam = "intro";
 
	hideinv = true;
 
	disp = "Вступление";
 
	dsc = [[
 
		ВНИМАНИЕ: Это специальная предварительная версия игры. Ни один фрагмент игры не является финальным. ^^
 
		ВНИМАНИЕ: Данная версия игры не предназначена для какого-либо распространения, исключая прямую передачу файлов автором. ^^
 
		Действие игры происходит в конце 19-го века. Вы играете за Дэвида Дрейка - единственного сына богатого и уважаемого владельца транспортной компании "Вестхейвен Трансоушен". ^
 
		Несколько лет назад, когда Дэвиду было 10 лет, Уильям таинственным образом бесследно пропал. Полицейское расследование вскоре зашло в тупик и было прекращено. Через несколько месяцев компания, оставшаяся без своего владельца, обанкротилась, ее имущество распродается. ^
 
		После исчезновения отца Дэвид жил в Вашингтоне с бабушкой. Он пошел по стопам отца и выучился на инженера-кораблестроителя. Несколько дней назад в доме, где он жил, был обнаружен тайник, хранящий секретные документы отца - карты, указывающие по-видимому на какие-то тайники Уильяма и записка с адресом и именем.^
 
		Одержимый идеей узнать больше, Дэвид отправляется в Лондон...
 
	]];
 
	obj = {
 
		vway("Начать игру", "{Начать игру}", 'aurora_borealis');
warehouse32.lua
Show inline comments
 
--[[
 
Игрок может попасть сюда только после диалога с Майклом.
 
Эта локация имеет владельца, которому не понравится, что здесь шляются посторонние.
 
Здесь игрок найдет карту.
 
]]
 
 
warehouse_32_guard = npc {
 
    var {
 
        dlg = 'warehouse_32_guard_dlg';
 
    };
 
	nam = "warehouse_32_guard";
 
	dsc = "Рядом со входом, опершись на стену, стоит {охранник}. Он не обращает на вас никакого внимания. ";
 
	dlg = 'warehouse_32_guard_dlg';
 
	phrases = {
 
		'Мне больше не о чем с ним говорить. ';
 
		'Он меня не пропустит. ';
 
	};
 
};
 
 
warehouse_32_guard_dlg = dlg {
 
	nam = "warehouse_32_guard_dlg";
 
	entered = function(s)
 
		warehouse_32_guard.dlg = nil;
 
		warehouse32_visited = true;
 
		return [[
 
			Вы подходите к охраннику, но он не обращает на вас никакого внимания. 
 
		]];
 
	end;
 
	phr = {
 
		{"Могу я пройти внутрь?", [[
 
			Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Нет".
 
		]]};
 
		{"Мне нужно поговорить с управляющим. ", [[
 
			Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Управляющий велел никого не пускать".
 
		]]};
 
		{"У меня есть дело к управляющему. ", [[
 
			Охранник медленно поворачивает голову в вашу сторону и отрывисто произносит: "Значит у вас есть пропуск. Покажите мне его".
 
@@ -150,115 +152,119 @@ wright_travel_dlg = dlg {
 
		]]};
 
	};
 
};
 
 
w32_backdoor = room {
 
	nam = "w32_backdoor";
 
	disp = "Склад 32, задняя дверь";
 
	entered = function(s)
 
		warehouse_32.pos = "01";
 
	end;
 
	way = {
 
		kh_vroom("Войти", function(s)
 
			if (pl.has_light) then
 
				pn("Мне стоит погасить лампу, прежде чем заходить внутрь. ");
 
				return false;
 
			else
 
				return "warehouse_32";
 
			end;
 
		end);
 
		kh_vroom("Перелезть через забор", "warehouse_32_behind_night");
 
	};
 
};
 
 
w32_mgr = darkroom {
 
    var {
 
        key_inplace = true;
 
        book_inplace = true;
 
    };
 
	nam = "w32_mgr";
 
	disp = "Склад 32, кабинет управляющего";
 
	dsc_dark = [[
 
		Вы находитесь в кабинете управляющего. В темноте вы можете лишь смутно различить очертания предметов.
 
	]];
 
	dsc_halflit = [[
 
		Вы находитесь в кабинете управляющего. 
 
	]];
 
	entered = function(s)
 
		warehouse_32.pos = "54";
 
	end;
 
	key_inplace = true;
 
	book_inplace = true;
 
	way = {
 
		kh_vroom("Выйти", function(s)
 
			print(w32_mgr.key_inplace);
 
			print(w32_mgr.book_inplace);
 
			if (not w32_mgr.key_inplace or not w32_mgr.book_inplace) then
 
				pr("Стоит вернуть все как было. ");
 
				return false;
 
			elseif (pl.has_light) then
 
				pr("Если я не погашу лампу, меня заметят. ");
 
				return false;
 
			else
 
				return "warehouse_32"
 
			end;
 
		end, 2);
 
	};
 
	obj = {
 
		'w32_mgr_table',
 
		'w32_mgr_bookcase'
 
	};
 
};
 
 
w32_journal = obj {
 
	nam = 'w32_journal';
 
	dsc = [[
 
		В ящике стола лежит {учетная книга}, в которую занесено все содержимое склада. 
 
	]];
 
	act = function(s)
 
		local list = [[
 
			среди сотен записей вы натыкаетесь на несколько, отмеченных как "WestHaven":
 
		]];
 
		for i = 1, #w32_shelf_input.items do
 
			list = list .. "^".. stead.ref(w32_shelf_input.items[i].n).disp .. " " .. w32_shelf_input.items[i].shelf .. "-" .. w32_shelf_input.items[i].position;
 
		end;
 
		
 
		return list;
 
	end;
 
};
 
 
w32_mgr_table = obj {
 
    var {
 
        open = false;
 
        locked = true;
 
    };
 
	seen_level = 1;
 
	nam = 'w32_mgr_table';
 
	dsc = function(s)
 
		if (s.open) then
 
			return [[
 
				В центре комнаты расположен большой письменный стол. {Ящик} стола выдвинут.
 
			]];
 
		else
 
			return [[
 
				В центре комнаты расположен большой письменный стол. В столе имеется {ящик}.
 
			]];
 
		end;
 
	end;
 
	open = false;
 
	locked = true;
 
	act = function(s)
 
		if (not s.locked) then 
 
			if (s.open) then
 
				s.open = false;
 
				w32_journal:disable();
 
				return [[
 
					Вы задвигаете ящик. 
 
				]];
 
			else
 
				s.open = true;
 
				w32_journal:enable();
 
				return [[
 
					Вы выдвигаете ящик. 
 
				]];
 
			end;
 
		else 
 
			return [[
 
				Ящик заперт. Вам придется найти ключ. 
 
			]];
 
		end;
 
	end;
 
	used = function(s, o)
 
		if (o == item_w32_key) then
 
			if (s.locked) then
 
@@ -400,67 +406,69 @@ warehouse_32_definitions = {
 
	["52"] = { name="у входа", dsc=[[
 
		К северу от вас расположен главный вход склада, но он заперт. 
 
	]], e3 = "42"};
 
	["53"] = { name="тупик", dsc=[[
 
		
 
	]], e3 = "43", corner = true};
 
	["54"] = { name="у входа в кабинет управляющего", dsc=[[
 
		К северу от вас расположена дверь, ведущая, судя по табличке на ней, в кабинет управляющего. 
 
	]], e3 = "44", ex1="w32_mgr"};
 
};
 
 
function getDirName(dir)
 
	if (dir == 1) then
 
		return "север";
 
	elseif (dir == 2) then
 
		return "восток";
 
	elseif (dir == 3) then
 
		return "юг";
 
	elseif (dir == 4) then
 
		return "запад";
 
	end;
 
end;
 
 
warehouse_32 = room {
 
    var{
 
        pos = "01";
 
        hidden = false;
 
        guards = {
 
            { pos = "21", dir=1, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
            { pos = "31", dir=4, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
            { pos = "24", dir=2, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
            { pos = "34", dir=3, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
        };
 
    };
 
	nam = "warehouse_32";
 
	nolamp = true;
 
	disp = function(s)
 
		return "Склад 32, " .. s.definitions[s.pos].name;
 
	end;
 
	dsc = function(s)
 
		--return s.definitions[s.pos].dsc .. "^ Вы смотрите на " .. getDirName(s.dir);
 
		
 
		return 'Вы стоите где-то между стеллажами склада 32. В помещении темно, за исключением фонарей охранников. ' .. s.definitions[s.pos].dsc;
 
	end;
 
	definitions = warehouse_32_definitions;
 
	pos = "01";
 
	hidden = false;
 
	guards = {
 
		{ pos = "21", dir=1, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
		{ pos = "31", dir=4, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
		{ pos = "24", dir=2, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
		{ pos = "34", dir=3, s = 1 }; --s=1 - должен повернуть направо, s=2 - должен пройти прямо
 
	};
 
	checkGuardSight = function(s)
 
		--Проверить область зрения каждого стражника, если игрок находится в области зрения - FAIL
 
		for i = 1, #s.guards do
 
			if (s.guards[i].pos == s.pos) then
 
				--detected
 
				walk("game_over_caught");
 
				return false;
 
			end;
 
			if (s.guards[i].dir == 1) then
 
				if (s.definitions[s.guards[i].pos].e1 and s.pos == s.definitions[s.guards[i].pos].e1) then
 
					--detected
 
					walk("game_over_caught");
 
					return false;
 
				end;
 
			elseif (s.guards[i].dir == 2) then
 
				if (s.definitions[s.guards[i].pos].e2 and s.pos == s.definitions[s.guards[i].pos].e2) then
 
					--detected
 
					walk("game_over_caught");
 
					return false;
 
				end;
 
			elseif (s.guards[i].dir == 3) then
 
				if (s.definitions[s.guards[i].pos].e3 and s.pos == s.definitions[s.guards[i].pos].e3) then
 
					--detected
 
					walk("game_over_caught");
 
@@ -532,53 +540,48 @@ warehouse_32 = room {
 
				--east-west line
 
				if (g_x - pl_x == 2) then
 
					pr("На востоке вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". ");
 
				elseif (g_x - pl_x == 1) then
 
					pr("На востоке, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". ");
 
				elseif (pl_x - g_x == 1) then
 
					pr("На западе, совсем рядом, вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". ");
 
				elseif (pl_x - g_x == 2) then
 
					pr("На западе вы видите охранника. Он смотрит на " .. getDirName(s.guards[i].dir) .. ". ");
 
				end;
 
			else
 
				if (g_x - pl_x == 1 and g_y - pl_y == 1) then
 
					pr("К северовостоку от вас вы слышите шаги охранника. ");
 
				elseif (g_x - pl_x == 1 and pl_y - g_y == 1) then
 
					pr("К юговостоку от вас вы слышите шаги охранника. ");
 
				elseif (pl_x - g_x == 1 and g_y - pl_y == 1) then
 
					pr("К северозападу от вас вы слышите шаги охранника. ");
 
				elseif (pl_x - g_x == 1 and pl_y - g_y == 1) then
 
					pr("К югозападу от вас вы слышите шаги охранника. ");
 
				end;
 
			end;
 
		end;
 
	end;
 
	makeTurn = function(s)
 
		--print("turn");
 
		--print(s.guards[1].pos, s.guards[1].dir);
 
		--print(s.guards[2].pos, s.guards[2].dir);
 
		--print(s.guards[3].pos, s.guards[3].dir);
 
		--print(s.guards[4].pos, s.guards[4].dir);
 
		-- TODO debug
 
		if (s:checkGuardSight()) then
 
			s:guardTurn();
 
			if (s:checkGuardSight()) then				
 
				if (warehouse_32_definitions[warehouse_32.pos].e1 or warehouse_32_definitions[warehouse_32.pos].ex1) then
 
					path("На север"):enable();
 
				else
 
					path("На север"):disable();
 
				end;
 
				
 
				if (warehouse_32_definitions[warehouse_32.pos].e2 or warehouse_32_definitions[warehouse_32.pos].ex2) then
 
					path("На восток"):enable();
 
				else
 
					path("На восток"):disable();
 
				end;
 
			
 
				if (warehouse_32_definitions[warehouse_32.pos].e3 or warehouse_32_definitions[warehouse_32.pos].ex3) then
 
					path("На юг"):enable();
 
				else
 
					path("На юг"):disable();
 
				end;
 
			
 
				if (warehouse_32_definitions[warehouse_32.pos].e4 or warehouse_32_definitions[warehouse_32.pos].ex4) then
 
					path("На запад"):enable();
 
@@ -657,79 +660,83 @@ warehouse_32 = room {
 
		end);
 
		
 
		kh_vroom("Ждать", function(s)
 
			return "warehouse_32";
 
		end);
 
		
 
		kh_vroom("Спрятаться", function(s)
 
			warehouse_32.hidden = true;
 
			
 
			return "warehouse_32";
 
		end);
 
		
 
		kh_vroom("Выбраться из укрытия", function(s)
 
			warehouse_32.hidden = false;
 
			
 
			return "warehouse_32";
 
		end);
 
	};
 
	obj = {
 
		'warehouse_32_shelves'
 
	};
 
};
 
 
warehouse_32_shelves = obj {
 
    var {
 
        current = "E1";
 
    };
 
	nam = "warehouse_32_shelves";
 
	current = "E1";
 
	dsc = function (s)
 
		return "Стеллажи, расположенные в этой секции отмечены табличкой {" .. s.current .. "}";
 
	end;
 
	act = function(s)
 
		w32_shelf_input.sector = s.current;
 
		walkin("w32_shelf_input");
 
	end;
 
};
 
 
w32_shelf_input = input_number {
 
    var {
 
        items = {
 
            { n = "item_electrodes"; };
 
            { n = "item_pump_details"; };
 
        };
 
    };
 
	nam = "w32_shelf_input";
 
	disp = function(s) 
 
		return "Стеллаж с отметкой " .. s.sector;
 
	end;
 
	check = function(s, input)
 
		for i = 1, #s.items do
 
			if (s.items[i].shelf == s.sector and w32_shelf_input.items[i].position == input and not w32_shelf_input.items[i].taken) then
 
				w32_shelf_input.items[i].taken = true;
 
				pn(stead.ref(s.items[i].n).disp);
 
				put(s.items[i].n, pl);
 
			end;
 
		end;
 
		back();
 
	end;
 
	label = "Укажите номер позиции:";
 
	items = {
 
		{ n = "item_electrodes"; };
 
		{ n = "item_pump_details"; };
 
	};
 
};
 
 
function warehouse32_init()
 
	print("init w32");
 
	for i = 1, #w32_shelf_input.items do
 
		local ok = false;
 
		while not ok do
 
			local index1 = rnd(4);
 
			local index2 = rnd(4);
 
			local shelf_name;
 
			if (index1 == 1) then
 
				shelf_name = 'A';
 
			elseif (index1 == 2) then
 
				shelf_name = 'B';
 
			elseif (index1 == 3) then
 
				shelf_name = 'C';
 
			elseif (index1 == 4) then
 
				shelf_name = 'D';
 
			end;
 
			shelf_name = shelf_name .. tostring(index2);
 
			w32_shelf_input.items[i].shelf = shelf_name;
 
			w32_shelf_input.items[i].position = tostring(rnd(100));
 
			ok = true;
 
			for j = 1, i - 1 do
0 comments (0 inline, 0 general)