finalizovany syrecky

This commit is contained in:
Severak 2019-08-15 23:28:44 +02:00
parent 01ec41f569
commit 8638d2a4ce
3 changed files with 200 additions and 89 deletions

1
!START.BAT Normal file
View File

@ -0,0 +1 @@
@start bin\wlua53 gui.lua

110
gui.lua
View File

@ -1,5 +1,10 @@
require "iuplua"
-- Hagen game engine
-- (c) Severák 2019
-- nedoporučuju nikomu číst, protože zárodek vzniknul během jednoho odpoledne
-- globals
paramsNo = 0
@ -16,7 +21,7 @@ menu2codes = {}
function verb(def)
def.is_verb = true
def.params = def.params or 0
def.params = def.params or {}
verb_ord[#verb_ord+1] = def
return def
end
@ -39,9 +44,17 @@ function cls()
end
function p(par)
-- TODO - nedavat CRLF poprve
text.value = text.value .. "\n" .. par
-- TODO scrool to down
if text.value=="" then
text.value = par
else
-- TODO - nedavat CRLF poprve
text.value = text.value .. "\n" .. par
end
text.scrollto = text.linecount .. ","
end
function here()
return game.me.w
end
function move(what, where)
@ -52,32 +65,50 @@ function walk(where)
assert(game[where], "room " .. where .. " does not exist")
move("me", where)
cls()
p(game[where].n)
p(game[where].d)
for i,item in ipairs(item_ord) do
if item.d and item.w==here() then
p(item.d)
end
end
show_verbs()
end
function _has_subj_of(verb)
local parCode = verb.params[#params+1]
for i,item in ipairs(item_ord) do
if item[parCode] and (verb.global_reach or item.w==here() or item.w=="me") then
return true
end
end
return false
end
function show_verbs()
paramsNo = 0
currVerb = ""
params = {}
local here = game[game.me.w]
commands[1]=nil
menu2codes={}
for i,verb in ipairs(verb_ord) do
if verb.always or here[verb._ref] then
if verb.always or here[verb._ref] or _has_subj_of(verb) then
local idx=commands.count+1
commands[idx] = verb.n
menu2codes[idx] = verb._ref
end
end
paramsNo = 0
currVerb = ""
params = {}
end
function show_items()
local here = game[game.me.w]
local verb = game[currVerb]
local parCode = verb.params[#params+1]
-- print("parCode="..parCode)
commands[1]=nil
menu2codes={}
for i,item in ipairs(item_ord) do
if item.w==game.me.w and item[currVerb] then
if item[parCode] and (verb.global_reach or item.w==here() or item.w=="me") then
local idx=commands.count+1
commands[idx] = item.n
menu2codes[idx] = item._ref
@ -88,19 +119,25 @@ end
function process_param(param)
if paramsNo == 0 then
currVerb = param
paramsNo = game[currVerb].params
paramsNo = #game[currVerb].params
else
params[#params+1]=param
end
-- print("param="..param)
-- print("params="..table.concat(params," "))
-- print("currVerb="..currVerb)
-- print("paramsNo="..paramsNo)
-- print("#params="..#params)
-- print "---"
--[[
print("param="..param)
print("params="..table.concat(params," "))
print("currVerb="..currVerb)
print("paramsNo="..paramsNo)
print("#params="..#params)
print "---"
]]
if #params==paramsNo then
game[currVerb].act(table.unpack(params))
if game.round then
game.round()
end
show_verbs()
else
show_items()
@ -118,7 +155,8 @@ game = {
intro = room{
n="void",
d="YOU ARE IN A MAZE OF TWISTY LITTLE PASSAGES, ALL ALIKE."
}
},
vars = {}
}
-- GUI
@ -136,12 +174,7 @@ function commands:action(text, i, selected)
end
end
function commands:button_cb(butt)
if butt==1 then
print "Click!"
end
end
-- TODO - ovladání pomoci klávesnice
function commands:k_any(k)
if k==iup.K_UP or k==iup.K_DOWN then
-- print "<>"
@ -153,19 +186,32 @@ end
vbox= iup.hbox{text, commands; expand=1}
window = iup.dialog{vbox, title = "Hagen", gap = "10", size="QUARTERxQUARTER"}
window = iup.dialog{vbox, title = "Hagen", gap = "10", rastersize="640x480"}
window:show()
-- commands[commands.count+1] = "čekej"
-- commands[commands.count+1] = "prozkoumej"
-- commands[commands.count+1] = "o hře"
iup.SetFocus(commands)
-- iup.SetFocus(commands)
local gamefile
if arg[1] then
gamefile = arg[1]
else
local hry = {"syrecky.lua"}
local hra = iup.Alarm("Hagen engine", "vyberte hru:", "Syrečky")
if hry[hra] then
gamefile = hry[hra]
else
os.exit(1)
end
end
-- loads game
load_game = loadfile("syrecky.lua", "t", setmetatable(game, {__index=_G}))
load_game, err = loadfile(gamefile, "t", setmetatable(game, {__index=_G}))
if err then
print(err)
os.exit(1)
end
load_game()
@ -179,8 +225,6 @@ end
window.title = game.title
walk("intro")
if (iup.MainLoopLevel()==0) then
iup.MainLoop()
end

View File

@ -1,15 +1,24 @@
-- Syrečky pro Hagen engine
-- (c) Severák 2019
-- / port z ALAN verze
title = "Syrečky (demo)"
title = "Syrečky (technologické demo)"
-- utils
local function randomp(texty)
return function()
p(texty[math.random(1, #texty)])
end
end
-- slovesa
cont=verb{
n="pokračovat",
act = function()
walk("obyvak")
walk(game[here()].cont)
end
}
@ -25,7 +34,7 @@ jih = verb{
desc = verb{
n ="prozkoumej",
params = 1,
params = {"desc"},
act = function(what)
--print("zkoumam " .. what)
local description = game[what].desc
@ -36,108 +45,165 @@ desc = verb{
if type(description)=='function' then
description()
end
end,
always = true
end
}
help=verb{
n="nápověda",
open = verb{
n ="otevři",
params = {"open"},
act = function(what)
local description = game[what].open
if type(description)=='string' then
p(description)
end
if type(description)=='function' then
description()
end
end
}
give = verb{
n = "dej",
params = {"syrecky"},
act = function()
cls()
p "Hra se hraje pomoci menu na leve straně. Az najdete syrecky zadejte:dej otci syrecky."
end,
-- always = true
-- tohle je trošku hack
if here()=="obyvak" then
p "Dokázal jsi to! Dal jsi otci syrečky."
p "Game over!"
else
p "Není tu nikdo, komu bys syrečky dal."
end
end
}
-- předměty
-- předměty a lokace
-- OBÝVÁK
obyvak = room{
n="Obyvak",
d="Normalni panelakovy obyvak. Na sever od nej je kuchyne.",
n="Obývák",
d="Normalní panelakový obývak. Na sever od něj je kuchyně.",
sever="kuchyn"
}
maska = item{
n="masku",
d="Plynova maska z dob ruske okupace.",
desc="Stara protiplynova maska, patrne ruske vyroby. Nechapu co delala v pohovce.",
desc="Stará protiplynová maska, patrně ruské výroby. Nechápu co dělala v pohovce.",
w="pohovka"
}
otec = item{
n="otce",
d="Na pohovce se vali otec a kouka se na bednu.",
desc="Tvuj fotr. Fesak.",
w="obyvak",
-- todo - koukání na bednu
--[[
SCRIPT bedna.
STEP
"Otec se napil piva."
STEP
"$nGOOOOOOOOOOOOOOOL!!!!$n"
"Otec se raduje, Sparta vede 1:0 ."
STEP
""
STEP
"Otec zacina byt nervozni.$n
Otec: Tak kde jsou sakra ty syrecky?!$n"
STEP
"$nOtec: Mladej kde se flakas s tema syreckama?!$n"
]]
}
pohovka = item{
n="pohovku",
d="Stara prasiva pohovka sotva drzi. Pamatuje snad i druhou svetovou.",
d="Stará prašivá pohovka sotva drží. Pamatuje snad i druhou světovou.",
desc = function()
if maska.w=='pohovka' then
p "Z pohovky couha neco divneho, zkusim to vytahnout."
p "Wow! Je to plynova maska!"
p "Mam masku!"
move("maska", "inv")
p "Z pohovky čouhá něco divného, zkusím to vytáhnout."
p "Wow! Je to plynová maska!"
move("maska", "me")
else
p "V pohovce je uz jen prach."
p "V pohovce je už jenom prach."
end
end,
w="obyvak"
}
otec = item{
n="otce",
d="Na pohovce se valí otec a kouka se na bednu.",
desc="Tvůj fotr. Fešák.",
w="obyvak"
}
televize = item{
n = "televizi",
desc = randomp{"V telce běží zápas pražských S.", "Fanoušci v televizi hážou dělobuchy.", "Právě běží reklama.", "V televizi je Horst Fuchs: A když zavoláte do deseti minut, dostanete ke každému noži koťátko zdarma."},
w = "obyvak"
}
-- KUCHYNĚ
kuchyn = room{
n="Kuchyň",
d="Kuchyn z doby komunismu. Na jih je obyvak.",
d="Umakartová kuchyň z doby vrcholného komunismu. Na jih od ní je obyvák.",
jih="obyvak"
}
syrecky = item{
n = "syrečky",
desc = "Strašně smradlavé syrečky.",
w = "lednice"
w = "lednice",
syrecky = true
}
lednice = item{
n="lednici",
desc = "Obstarozni lednicka znacky CALEX. Hotova hrozba pro zivotni prostredi.",
d="Spořádaně tu vrní obstarožní lednice",
desc = "Obstarožní lednička značky CALEX. Hotová hrozba pro životní prostředí.",
open = function()
p "Oteviras lednicku. Dvere vrzou."
p "Otevíráš ledničku. Dveře vržou."
if syrecky.w=="lednice" then
if maska.w=="inv" then
p "Syrecky strasne smrdi, beres si na pomoc plynovou masku."
if maska.w=="me" then
p "Syrečky strašne smrdí, bereš si na pomoc plynovou masku."
move("syrecky", "me")
p "Vypadáš přitom jak stalker ze stejnojmené počitačové hry, ale podařilo se ti vzít syrečky."
else
p "Straslivy smrad syrecku te donutil lednicku zase zavrit!"
p "Strašlivý smrad syrečků tě donutil ledničku zase zavřít!"
end
else
p "V lednici je uz jen prisera ktera zila v lednici vedle majonezy a za zelnym salatem... To me nezajima."
p "V lednici však už je jen \"Příšera, která žila v lednici vedle majonézy a za zelným salátem\". A to tě nezajímá."
end
end,
w="kuchyn"
}
vyhled = item{
n = "výhled",
d = "A je tu krásný výhled na Jihozápadní město",
w="kuchyn",
desc = randomp{
"Paneláky dnes vypadají patřičně depresivně.",
"Před barákem zrovna někomu kradou auto.",
"Před barákem zrovna policajti rozdávají pokuty.",
"Děti si hrajou na hřišti.",
"Důchodkyně pomlouvají tu dnešní mládež.",
},
open="Okno raději otvírat nebudu, mohl by se sem dostat smog."
}
-- META
local sledovani = randomp{
"Otec se napil piva.",
"GOOOOOOOOOOOOOOOL!!!!\n",
"Otec se raduje, Sparta vede 1:0 .",
"Otec začína být nervózní.\nOtec: Tak kde jsou sakra ty syrečky?!"
}
local zrani = randomp{
"Otec spokojeně mlaská při žraní syrečků.",
"Otec: To je dobrota, to je dobrota.",
"Otec: Mňam, mňam..."
}
function round()
if here()=="obyvak" then
if syrecky.w=="otec" then
zrani()
else
sledovani()
end
end
end
intro = room{
d=[[DEMO HRA SYRECKY
----------------
Tvym cilem je donest otci syrecky z kuchyne.]],
d=[[SYREČKY - technologické demo
Tvým cílem je donést otci syrečky z kuchyně.
Hru navrhnul Petr Kain v roce 2010, potom sloužila jako česká obdoba Cloak of Darkness.]],
cont="obyvak"
}