simple game framework for scripting languages
Taking a bit of a leap of faith here, hope this is the right thread for this.
technosaurus, I program in an archaic language (BASIC is dead, long live BASIC) taught to me originally by my first computer -- a 386 running Win3.1 (this was in the mid- to late-'90s). LOL.
I wrote a pretty nifty text adventure, but its primary characteristic is that I wrote it and made it work without knowing how to make a parser. The way it works is that the entire input string from the player, is compared against a bunch of possible input strings (which can do stuff) using a bunch of IF-THEN statements.
I think it's fair to say that I'm rather aware of just how bad that actually is, coding-wise.
Would you be able to either provide me or locate for me, simple instructions for a text parser in this language? I've looked high and low and can't find anything on my own. I guess my Google-Fu is weak (old man).
I'm most familiar with QBASIC/QuickBASIC (QuickBASIC compiles, is about the only difference) but I can learn QB64 and *maybe* BaCon if need be... I just want to be able to implement a simple parser. Then I can re-code the game and it will work better. (...and I might even be able to make it bigger -- current version is a mere eight rooms, and that was quite a stretch with all that clumsy code!)
technosaurus, I program in an archaic language (BASIC is dead, long live BASIC) taught to me originally by my first computer -- a 386 running Win3.1 (this was in the mid- to late-'90s). LOL.
I wrote a pretty nifty text adventure, but its primary characteristic is that I wrote it and made it work without knowing how to make a parser. The way it works is that the entire input string from the player, is compared against a bunch of possible input strings (which can do stuff) using a bunch of IF-THEN statements.
I think it's fair to say that I'm rather aware of just how bad that actually is, coding-wise.
Would you be able to either provide me or locate for me, simple instructions for a text parser in this language? I've looked high and low and can't find anything on my own. I guess my Google-Fu is weak (old man).
I'm most familiar with QBASIC/QuickBASIC (QuickBASIC compiles, is about the only difference) but I can learn QB64 and *maybe* BaCon if need be... I just want to be able to implement a simple parser. Then I can re-code the game and it will work better. (...and I might even be able to make it bigger -- current version is a mere eight rooms, and that was quite a stretch with all that clumsy code!)
starhawk,starhawk wrote:
Would you be able to either provide me or locate for me, simple instructions for a text parser in this language? I've looked high and low and can't find anything on my own. I guess my Google-Fu is weak (old man).
How about this-
http://ascii-world.wikidot.com/how-to-p ... ext-parser
Cheers,
s
This is something I should have said as well -- the effort is appreciated for sure, even if the code produced is incomprehensible to me -- after all, it's not your fault, Seaside, that I can't read newfangled code!linuph wrote:Seaside, thanks!
So THANK YOU for showing me that parser, even though it's something I couldn't use.
Also, THANK YOU jamesbond, for sending me another one which may be of use (I haven't looked at it yet, TBH -- it's a ZIP file and I only just downloaded it.)
Icon programming.
I've been digging lately to find a graphics programming language without bloating dependencies. I think I found one: Icon. You may never have heard of it.
See here: http://www.cs.arizona.edu/icon/index.htm
It's ancient in software/computer terms (1998). The earliest mention of it that I found dates back to 1979.
I downloaded the packages from the above website, compiled it with X11 headers and dropped the resulting directory with files into ~/bin and made a symlink.
Guess what: it works flawlessly. And it is rather easy to understand, even for me
Below some examples I made with the help of the excellent documentation in an hour or so. But there's lot more to Icon than this, like high level string handling and Turtle Graphics, so I'm venturing on with it.
I would have liked to attach the Icon compilation as well, but it's 1.7Mb zipped (9Mb unzipped).
BTW there's Unicon (http://unicon.sourceforge.net/faq.htm) which is a 'modernized dialect that descends from Icon", but I have not yet looked into it.
I thought you might be interested....
I've been digging lately to find a graphics programming language without bloating dependencies. I think I found one: Icon. You may never have heard of it.
See here: http://www.cs.arizona.edu/icon/index.htm
It's ancient in software/computer terms (1998). The earliest mention of it that I found dates back to 1979.
I downloaded the packages from the above website, compiled it with X11 headers and dropped the resulting directory with files into ~/bin and made a symlink.
Guess what: it works flawlessly. And it is rather easy to understand, even for me
Below some examples I made with the help of the excellent documentation in an hour or so. But there's lot more to Icon than this, like high level string handling and Turtle Graphics, so I'm venturing on with it.
I would have liked to attach the Icon compilation as well, but it's 1.7Mb zipped (9Mb unzipped).
BTW there's Unicon (http://unicon.sourceforge.net/faq.htm) which is a 'modernized dialect that descends from Icon", but I have not yet looked into it.
I thought you might be interested....
Code: Select all
#!/bin/icon
# fonts
link graphics
procedure main()
WOpen("size=600,200") | stop("Can't open window")
WAttrib("pos=50,150")
WAttrib("label=Icon Programming - Fonts Demonstration")
GotoXY(10,50)
ransom("The quick brown fox jumps over the lazy dog.")
WDone()
end
procedure ransom(s)
local c
static famlist, attlist, sizelist
initial
{
famlist:=["URW Chancery L","DejaVu Sans"]
attlist:=["","","bold","italic"]
sizelist:=[18,22,24,32,34]
}
every c:=!s do
{
Font(?famlist || "," || ?sizelist || "," || ?attlist)
WWrites(c)
}
return
end
Code: Select all
#!/bin/icon
#clipping
link graphics
procedure main()
local x,y
WOpen("size=600,400", "bg=yellow")
WAttrib("pos=300,100")
WAttrib("label=Icon Programming - Clipping")
Fg("red")
FillRectangle(50,50,400,300)
Fg("green")
FillRectangle(70,70,360,260)
Clip(71,71,359,259)
every 1 to 50 do
{
x:=?400+50
y:=?300+50
WAttrib("fg=black","linewidth=5")
DrawCircle(x,y,30)
WAttrib("fg=white","linewidth=3")
DrawCircle(x,y,30)
}
WDone()
end
Code: Select all
#!/bin/icon
# Sierpinsky
$define Width 400
$define Height 400
$define X1 0
$define Y1 Height
$define X2 (Width/2)
$define Y2 0
$define X3 Width
$define Y3 Height
link graphics
procedure main()
local x,y
WOpen("size=400,400", "bg=light green")
WAttrib("label=Icon Programming - Sierpinski Diagram")
Fg("red")
WWrite("Press 'q' to quit")
Fg("black")
x:=Width/2
y:=Height/2
until WQuit() do
{
case ?3 of
{
1: {
x:=(x+X1)/2
y:=(y+Y1)/2
}
2: {
x:=(x+X2)/2
y:=(y+Y2)/2
}
3: {
x:=(x+X3)/2
y:=(y+Y3)/2
}
}
DrawPoint(x,y)
}
end
- Attachments
-
- Sierpinsky.png
- (17.13 KiB) Downloaded 344 times
-
- clipping.png
- (19.35 KiB) Downloaded 357 times
-
- fonts.png
- (8.25 KiB) Downloaded 356 times
width and height variable in svg
Hi Everyone, i very2 new in programming with svg. I want to make a background that can be full screen. but i can't change the variable WIDTH and HEIGHT in my script. this is my script:
The variable USER can reference to $HOSTNAME, but why WIDTH and HEIGHT can't?
How to solve my problem?
Thank you.
Code: Select all
#!/bin/sh
if [ -f startku.jpg ]; then
rm startku.jpg
fi
USER=$HOSTNAME
RES=$(xrandr | grep "current" | cut -d 'c' -f1,3 | tr -cd 'x [:digit:]' | cut -d 'x' -f1,2)
WIDTH=$(echo $RES | cut -d 'x' -f1,1)
HEIGHT=$(echo $RES | cut -d 'x' -f2,3)
echo '
<svg version="1.1">
<rect width="1366" height="768"
style="fill:rgb(0,0,255)"/>
<text >
<tspan x="550" y="500" font-family="Open Sans" font-weight="bolder" font-size="100"
fill="white" letter-spacing="-5">
limuks
</tspan>
<tspan x="550" y="530" font-family="Open Sans" font-weight="lighter" font-size="30"
fill="white">
'"$USER"''"'"'s puppy linux
</tspan>
</text>
<path stroke-dasharray="20,10,5,5,5,10" d="M5 60 215 0" />
<circle cx="370" cy="100" r="12" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="350" cy="140" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="400" cy="110" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="410" cy="130" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="430" cy="120" r="2" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="300" cy="110" r="40" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="300" cy="110" r="33" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="300" cy="110" r="21" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="700" cy="100" r="80" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="700" cy="100" r="60" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="700" cy="100" r="40" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="700" cy="100" r="20" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="1000" cy="150" r="100" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="1000" cy="150" r="80" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="1000" cy="150" r="60" fill="#6BADF6" style="fill-opacity:0.2"/>
<circle cx="1000" cy="150" r="45" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="150" r="30" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="150" r="15" fill="#6BADF6" style="fill-opacity:0.5"/>
<circle cx="300" cy="700" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="300" cy="700" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="300" cy="700" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="400" cy="710" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="400" cy="710" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="400" cy="710" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="500" cy="730" r="30" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="500" cy="730" r="23" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="500" cy="730" r="16" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="640" cy="700" r="30" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="640" cy="700" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="640" cy="700" r="7" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="700" cy="680" r="30" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="700" cy="680" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="700" cy="680" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="900" cy="720" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="900" cy="720" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="900" cy="720" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="935" cy="700" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="935" cy="700" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="935" cy="700" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="680" r="30" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="680" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="680" r="15" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1000" cy="680" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1050" cy="710" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1050" cy="710" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1050" cy="710" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1100" cy="735" r="20" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1100" cy="735" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1100" cy="735" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1200" cy="730" r="20" fill="#6BADF6" style="fill-opacity:0.5"/>
<circle cx="1200" cy="730" r="10" fill="#6BADF6" style="fill-opacity:0.3"/>
<circle cx="1200" cy="730" r="5" fill="#6BADF6" style="fill-opacity:0.3"/>
</svg>' > startku.jpg
if [ -f /usr/share/backgrounds/startku.jpg ]; then
rm /usr/share/backgrounds/startku.jpg
fi
cp startku.jpg /usr/share/backgrounds/startku.jpg&
wallpaper /usr/share/backgrounds/startku.jpg&
defaultimageviewer startku.jpg
How to solve my problem?
Thank you.
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
you need to set width and height in the svg tag as in this post:
http://murga-linux.com/puppy/viewtopic. ... 581#674581
edit: and its not a jpg
edit2:and you arent using the HEIGHT and WIDTH variables anywhere
http://murga-linux.com/puppy/viewtopic. ... 581#674581
edit: and its not a jpg
edit2:and you arent using the HEIGHT and WIDTH variables anywhere
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].
thank you technosaurus,
i mean the width and height is at rectangle
if i change
with
i don't see any rectangle. just black screen with text and circle.
i looked at this thread:
http://murga-linux.com/puppy/viewtopic. ... 253#647253
and you can use $BACKGROUND variable in the svg's script. but why in my script don't work?
thank you
i mean the width and height is at rectangle
if i change
Code: Select all
<rect width="1366" height="768"
style="fill:rgb(0,0,255)"/>
Code: Select all
<rect width="'$WIDTH'" height="'$HEIGHT'"
style="fill:rgb(0,0,255)"/>
i looked at this thread:
http://murga-linux.com/puppy/viewtopic. ... 253#647253
and you can use $BACKGROUND variable in the svg's script. but why in my script don't work?
thank you
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
probably because it is the size of your screen. you can make it any size and it will stretch to fill the window if you have the right aspect ratio. removing the title bar is different though, depends on wm settings or modifying the source code
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].
[SOLVED]
I got it. I'm sorry, i know what is the problem. My mistake is the delimiter. the code before is:
and it should be
i realized this after i copy the echo code to a plain text and i got 'space' in $WIDTH. so the $WIDTH="1366 " and $HEIGHT=" 768". That's why rectangle didn't appear. [/code]
Code: Select all
WIDTH=$(echo $RES | cut -d 'x' -f1,1)
HEIGHT=$(echo $RES | cut -d 'x' -f2,3)
Code: Select all
WIDTH=$(echo $RES | cut -d ' ' -f1,1)
HEIGHT=$(echo $RES | cut -d ' ' -f3,3)
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
oK, Too many people have needed this info to have to keep having to hack together an ugly set of sed/grep/tr/cut pipes, so I wrote a helper app in C
time on the static version is ~.002s while the shared version is ~.004s
so to use it in a script just
eval `displayinfo`
echo $XHEIGHT
The attached tarball contains a both a shared and static binary as well as the source code - consider it public domain.
P.S. I may add this to pupngo's xwin/startx via setenv so that the variables are always available.
Edit: if you want something faster without having to install anything
its time is ~0.008s vs xrandr's 1.100s, so much better than xrandr and not _too_ much worse than my little helper
Code: Select all
# displayinfo
XWIDTH=1280
XHEIGHT=800
XDEPTH=24
#
so to use it in a script just
eval `displayinfo`
echo $XHEIGHT
The attached tarball contains a both a shared and static binary as well as the source code - consider it public domain.
P.S. I may add this to pupngo's xwin/startx via setenv so that the variables are always available.
Edit: if you want something faster without having to install anything
Code: Select all
xwininfo -root 2>&1|awk 'BEGIN{FS=" |x"}/geometry/{split($5,height,"+");print "width=" $4 "\nheight=" height[1]}'
- Attachments
-
- displayinfo.tar.gz
- shared version is 3kb, static version is 57kb & source is included
- (34.83 KiB) Downloaded 316 times
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].
technosaurus,
Have you abandoned bash?
0m0.008s and the Width, Height variables are set.
Regards,
s
Have you abandoned bash?
Code: Select all
eval `xwininfo -root|while read LINE ; do
case $LINE in
Width*) echo ${LINE/: /=};;
Height*) echo ${LINE/: /=};;
esac;
done`
Regards,
s
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
nope, I just missed those lines due to the size of my terminal
Edit: here is a shell version
#read can read multiple variables and separates them at $IFS
Edit: here is a shell version
Code: Select all
displayinfo(){
xwininfo -root|while read VAR VALUE; do
case $VAR in
Height:)echo XHEIGHT=$VALUE;;
Width:)echo XWIDTH=$VALUE;;
Depth:)echo XDEPTH=$VALUE;;
esac
done
}
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].
Nice and good programming exercise!
Seaside, no output, but without eval it works:
real user sys
0.037s 0.010s 0.007s
technosaurus's awk :
real user sys
0.036s 0.007s 0.007s
xrandr doesn't seem THAT slow if done like this:
real user sys
0.109s 0.010s 0.007s
technosaurus' Displayinfo:
real user sys
0.025s 0.000s 0.013s
techosaurus' Displayinfo-static:
real user sys
0.004s 0.000 0.000
technosaurus' C routines are, of course, the clear winner, timing wise. But is's not quite fair, because the C-routines also print the color depth.
So, lastly, a very short awk routine that also prints the color depth:
real user sys
0.023s 0.007s 0.003s
Timing varies a bit depending on what the system is doing at that point.
Seaside, no output, but without eval it works:
Code: Select all
#!/bin/sh
xwininfo -root | while read LINE; do
case $LINE in
Width*) echo ${LINE/: /=};;
Height*) echo ${LINE/: /=};;
esac;
done
0.037s 0.010s 0.007s
technosaurus's awk :
real user sys
0.036s 0.007s 0.007s
xrandr doesn't seem THAT slow if done like this:
Code: Select all
#!/bin/sh
xrandr | awk '/*/{split($1,res,"x");print "width="res[1]"\nheight="res[2]}'
0.109s 0.010s 0.007s
technosaurus' Displayinfo:
real user sys
0.025s 0.000s 0.013s
techosaurus' Displayinfo-static:
real user sys
0.004s 0.000 0.000
technosaurus' C routines are, of course, the clear winner, timing wise. But is's not quite fair, because the C-routines also print the color depth.
So, lastly, a very short awk routine that also prints the color depth:
Code: Select all
#/bin/sh
xwinfo -root | awk '{ if( NR>7 && NR<11) print $1$2; next }'
0.023s 0.007s 0.003s
Timing varies a bit depending on what the system is doing at that point.
I'm sorry to ask again.linuph wrote:Code: Select all
#!/bin/sh xwininfo -root | while read LINE; do case $LINE in Width*) echo ${LINE/: /=};; Height*) echo ${LINE/: /=};; esac; done
Code: Select all
#!/bin/sh xrandr | awk '/*/{split($1,res,"x");print "width="res[1]"\nheight="res[2]}'
Code: Select all
#/bin/sh xwininfo -root | awk '{ if( NR>7 && NR<11) print $1$2; next }'
All of that code can showing an output about WIDTH, HEIGHT, and DEPTH. but then when i write echo $HEIGHT or echo $XWIDTH, it doesn't appear anything. I'm still very2 new in programming. How to save to a variable?
Thanks in advance.
- L18L
- Posts: 3479
- Joined: Sat 19 Jun 2010, 18:56
- Location: www.eussenheim.de/
tryrecobayu wrote:...All of that code can showing an output about WIDTH, HEIGHT, and DEPTH. but then when i write echo $HEIGHT or echo $XWIDTH, it doesn't appear anything. I'm still very2 new in programming. How to save to a variable?
Thanks in advance.
Code: Select all
WIDTH=`xwininfo -root | awk '{ if( NR==8) print $2; next }' `
Code: Select all
WIDTH=`xrandr 2>/dev/null | awk '/*/{split($1,res,"x");print res[1]}'`
- technosaurus
- Posts: 4853
- Joined: Mon 19 May 2008, 01:24
- Location: Blue Springs, MO
- Contact:
I explained this in the same post that has the displayinfo tarball but I reiterate
when the output is in VAR=VALUE format all you have to do is:
eval `the_function...` #those are back ticks
or
eval $(the_function ...)
or
you may even be able to leave off the eval
when the output is in VAR=VALUE format all you have to do is:
eval `the_function...` #those are back ticks
or
eval $(the_function ...)
or
you may even be able to leave off the eval
Check out my [url=https://github.com/technosaurus]github repositories[/url]. I may eventually get around to updating my [url=http://bashismal.blogspot.com]blogspot[/url].