A billion changes. Pushing for release.

master
kts 2015-03-21 05:06:55 -07:00
parent eaa57c7dba
commit e6b55028e4
48 changed files with 646 additions and 907 deletions

View File

@ -1,34 +0,0 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Things That This Being Must Do
````````````````````````````````
For my own benefit, I've put my TODO in this most public of places.
,,,,,,,,,,,,,,,,,,,,,,,,
Things I have to do anyway
````````````````````````
* Finish Dr. Cole's site, along with mobile styling
,,,,,,,,,,,,,,,,,,,,,,,,
Polymathic Things
````````````````````````
* Hustle to get Vashram stand-alone going
* Resume Celestial Carnage - see its TODO
* Implement timesynk's Virtual Machine compiler
,,,,,,,,,,,,,,,,,,,,,,,,
Fun Things of Precedence
````````````````````````
* Create timelapse videos for Newsboy and VAD
* Finish up SDL renderer for VAD 0.2 and release it.
* Create a narrative of Carmack's idTech engines for the YouTubes
* Finish LootKeeper and Get It Out There
* Implement last aspects of MediaServe (JavaScript linkage)
* Implement networking of ktk_walker and test it out
,,,,,,,,,,,,,,,,,,,,,,,,
Extraneous Things of Learning
````````````````````````
* Learn to read Braille
* Resume learning Japanese
* Begin learning Chinese
* Learn ASL or some equivalent
* Learn Russian

View File

@ -0,0 +1 @@
Approach others first as a friend, then as a teacher -- in all ways possible, speak to promote learning and experimentation.

View File

@ -64,3 +64,5 @@ do
cp $f live/plans/$base
#../kettext/kettext.pl $f --version.none > live/plans/$base
done
echo "Copying pubkey..."
cp pubkey.gpg live/pubkey.gpg

Binary file not shown.

Binary file not shown.

View File

@ -32,8 +32,8 @@ img {
text-align: center;
}
.thumbnail {
max-width: 280px;
max-height: 157px;
max-width: 300px;
max-height: 300px;
float: right;
}
/* general helper classes */
@ -187,10 +187,11 @@ img {
#content pre {
width: auto;
padding: 0.5em;
margin: 2em;
margin: 1em 1em 2em 2em;
background-color: #D0D0D1;
color: #121;
font-family: "ProggyTinySZ";
font-size: 12pt;
line-height: 70%;
width: 500px; /* specify width */
white-space: pre-wrap; /* CSS3 browsers */
@ -199,22 +200,26 @@ img {
white-space: -o-pre-wrap; /* Opera 7 and up */
word-wrap: break-word; /* IE 5.5+ and up */
}
#content pre code:after {
#content pre {
border: 0.1em solid #B0B0B1;
padding: 0.25em;
}
/*#content pre code:after {
content: 'code';
width: 100%;
display: block; text-align: right;
color: #B0B0B1;
padding: 0;
margin: 0;
}
}*/
#content code {
font-family: "ProggyTinySZ";
}
#content h1:hover, h2:hover, h3:hover, h4:hover, h5:hover, h6:hover {
/*#content h1:hover, h2:hover, h3:hover, h4:hover, h5:hover, h6:hover {
color: #CaCf90;
cursor: pointer;
}
}*/
#content img {
}
#content iframe {

View File

@ -119,3 +119,25 @@
-moz-box-shadow:0 0px 1px rgba(0, 0, 0, 0.8);
box-shadow:0 0px 1px rgba(0, 0, 0, 0.8);
}
#popup {
display:block;
position:fixed;
left: 50%;
top: 50%;
-webkit-box-shadow:0 0px 8px rgba(0, 0, 0, 0.8);
-moz-box-shadow:0 0px 8px rgba(0, 0, 0, 0.8);
box-shadow:0 0px 8px rgba(0, 0, 0, 0.8);
-webkit-border-radius:3px 3px 3px 3px;
-moz-border-radius:3px 3px 3px 3px;
border-radius:3px 3px 3px 3px;
}
.thumbnail {
-webkit-box-shadow:0 0px 5px rgba(0, 0, 0, 0.5);
-moz-box-shadow:0 0px 5px rgba(0, 0, 0, 0.5);
box-shadow:0 0px 5px rgba(0, 0, 0, 0.5);
-webkit-border-radius:2px 2px 2px 2px;
-moz-border-radius:2px 2px 2px 2px;
border-radius:2px 2px 2px 2px;
}

View File

@ -1,4 +0,0 @@
.imply(version.hide)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Documents and Articles
````````````````````````````````

View File

@ -0,0 +1,89 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Desktop Feng Shui
''''''''''''''''''''''''''''''''
Every desktop and its surroundings possesses particular senses of balance and
harmony that may influence the feelings of the user.
For software developers, and in particular programmers, desktop feng shui is
of particular importance, as visual distractions and imbalances can be
detrimental to one's capability to work.
Although each developer's sense and needs of harmony will differ - and some
may not even care or be affected much by such things - in general a sense of
good order is of importance. Order is at the foundation of good program design
and commenting quality, and as such, this should be emphasized by the
environment as well.
Although not required, tiling window managers are excellent methods of
enforcing balance and efficiency within the desktop. Even further, the
organization of tiling itself, when combined with display sizes and aspect
ratios, can enhance harmony and order greatly.
For non-tiling window managers, it is best to keep your desktop in good order,
with minimal clutter and strong organization. Failing to do so introduces
visual clutter that can easily distract the mind from concentration.
Colors, especially of IDEs and terminals, can play important roles in enhancing
concentration and decreasing distractions. In general, muted colors can provide
a peaceful sense to the environment, although sometimes can be detrimental when
strong notifications are wanted.
The guiding principles for colors should general be to draw focus to the areas
one cares about the most. For programming, this generally means that comment
areas and folded sections of code should not draw as much attention and should
hold to colors that do not call as much attention to themselves. Types,
variables, and values should generally call more attention and should be of
brighter and more complex coloring. General text should be of a neutral tone
at a sufficient brightness so as to not be drowned out by the emphasized
texts.
In general, color schemes fall into light and dark schemes, usually of
complementary or partially complementary inverted schemes. Although varying
from individual to individual, darker schemes can promote a strong sense of
focus, especially if bordered by much brighter color schemes. In this way, a
dark scheme in the primary programming editor window, if surrounded by
brighter schemes containing more information or debugging information, acts as
the center point, drawing focus to itself whilst also keeping contained and
isolated from the others - i.e., a bastion of focus.
Additionally, the background also plays an important role. Whether it is the
precise shade of the color scheme or a graphical background image seen through
transparency, the background can promote a sense to the experience and promote
particular thoughts in greater earnest. In this sense, it is usually wisest to
choose backgrounds that motivate you or promote senses of peace. These
backgrounds, if graphical, should likely change to match what you are
developing, so as to promote subconscious thought and provide positive
reinforcement.
Such principles do not need to be isolated to just the virtual desktop, but
can also be expanded to include multiple monitors, the physical desktop, and
most everything that can fall within the visual field.
In multi-monitor setups, the distance between monitors, orientations, and size
discrepancies can play crucial roles in what feelings are emphasized in the
user. Physical distances between monitors can play a similar role to the
previously mentioned dark-amidst-light focus scheming. Orientation can promote
certain patterns of usage, such as portrait for reading manual pages, or
landscape for programming - these things differ, of course, by font size and
how many rows and columns one can fit comfortably within the height and width.
With size discrepancies and orientation differences, the virtual desktops'
placement should be adjusted so the movement of the mouse from one screen to
the other does not contain too much difference - i.e., if moving to the right
from Screen 1 to Screen 2, the vertical distance changed between the two
should be minimal, and if preferred, centered.
Going further than this, what is beyond the physical monitors matter as well.
Having an open view, such as a window, can be positive by enhancing moments of
meditation and clarity, especially if a peaceful view is to be seen. However,
if the view does not promote a sense of peace and is too distracting, the
physical location should be adjusted. In a sense, what is behind the physical
monitors plays the same role as desktop backgrounds and what sense you wish to
have while developing.
In conclusion, one should develop a strong sense for the entirity of their
environment, both virtual and physical, and adjust both to promote the
sensibilities they most require. If you wish to focus more on one particular
aspect, then mute other portions by chosing softer color schemes, smaller
fonts, or increasing the distance between them. Acquiring the proper feng shui
of your desktop will require your own experimentation and analysis, but it
should be approached if you wish to optimize your own productivity.

View File

@ -0,0 +1,74 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
MAngband Hacking
````````````````````````````````
This document describes some technical notes/aspects of MAngband/Angband that I learned while writing an SDL2 interface (so I could play MAngband "unencumbered" on various platforms).
,,,,,,,,,,,,,,,,,,,,,,,,
z-terms
````````````````````````
MAngband, being a derivative of Angband, uses the concept of "virtual terminals" or "z-term"s. A z-term is a matrix of rows*columns of cells that correspond to a basic terminal device. Each cell in a z-term may have an "attribute", such as a color, as well as a "character". Characters may be drawn at arbitrary locations within the matrix and the z-term does various intelligent checks to ensure that the minimal amount of updates are triggered to signify an update to whatever the front-end may be.
Getting into the topic of front-ends, z-terms provide a set of a function pointers that act as hooks and are expected to handle certain types of data/information. These hooks are intended to be used to create, draw, and destroy a "z-term" and its interface. These hooks are:
* **void (*init_hook)(term *t);**
* Function that should create the "z-term" interface
* **void (*nuke_hook)(term *t);**
* Function that should destroy the "z-term" interface
* **errr (*user_hook)(int n);**
* User-defined hook, not sure
* **errr (*xtra_hook)(int n, int v);**
* Extremely important function that handles "xtra" events, such as polling for events, playing a sound, delaying, etc.
* **errr (*curs_hook)(int x, int y);**
* Function for drawing the cursor at the given location
* **errr (*wipe_hook)(int x, int y, int n);**
* Function for wiping "n" characters from the given location
* **errr (*pict_hook)(int x, byte a, char c);**
* Function for drawing a special "pict" character -- a graphic image. Byte attribute "a" and char "c" correspond to the row and column of the desired sprite. This function is called when attr "a" and char "c" have their high bits set, thus signifying an image. Proper "row" and "column" coordinates must be acquired by toggling the high bit, e.g., "attr &= ~(1 << 7);" and "ch &= ~(1 << 7);".
* **errr (*text_hook)(int x, int y, int n, byte a, cptr s);**
* Function for drawing a string with attributes from the given location
In the case of MAngband, there are console(cap,ibm,gcu), SDL, X11, Xaw, and Windows "z-term" implementations. Each one of these implementations handles the interfacing of at least 1 "z-term" to the user interface of the implementation.
The base-line requirements for a "z-term" interface is to:
* 1. For each z-term, create a visual window
* 2. Add in a hook to write characters and clear cells
* 3. Handle events and sent to the appropriate z-term
* 4. Handle closing/freeing the window
,,,,,,,,,,,,,,,,,,,,,,,,
MAngband z-term usage
````````````````````````
MAngband can use a total of 8 z-terms, the first of which is the only required one. These terms and their function descriptions are:
* 0 / Main "screen" window
* 1 / ???
* 2 / ???
* 3 / ???
* 4 / Chat
* 5 / ???
* 6 / ???
* 7 / ???
,,,,,,,,,,,,,,,,,,,,,,,,
Basic MAngband logic
````````````````````````
The main "connected" loop for MAngband is:
* **keymap_init();**
* **show_motd();**
* **Net_start()**
* **Input_loop();**
* 1. Sleep, then read socket
* 2. Send commands
* 3. Read commands via **process_command()**, then **request_command()**
* 4. flush input via **Term_fresh()**
* 5. **window_stuff()** ???
* 6. Keep alive
* **Net_cleanup();**
* **quit(NULL);**
,,,,,,,,,,,,,,,,,,,,,,,,
MAngband commands and keymaps
````````````````````````
One of the more difficult aspects of interfacing with the "z-term" is understanding the proper way to pass keyboard input.

View File

@ -0,0 +1,119 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Linux/X11 minimalistic browser review
````````````````````````````````
This document covers my personal experiences and opinions of various minimalistic browsers. Sections of this document are likely to update and will be marked as such.
The current list of browsers and their last review times are:
* Midori 0.5.9 - //2014-01-10//
* NetSurf 3.0 - //2014-01-10//
* xombrero 1.6.3 - //2014-01-10//
* dwb 2013.03.30 - //2014-01-10//
As of 2014-01-10, I recommend **dwb** followed by xombrero.
----
My opinion(s) are influenced by the following:
* Slackware, i3wm, and vim
* minimalism for aesthetics __and__ resource usage
* A liking of tabs
* Good keyboard control
,,,,,,,,,,,,,,,,,,,,,,,,
Midori 0.5.9
````````````````````````
[[img:pix/dox/shot_midori.png]](pix/dox/shot_midori.png).class(thumbnail)
**website:** [[midori-browser.org]](http://midori-browser.org)
**requires:** GTK, webkitgtk, libunique, vala
Tab management is on the top, but a plugin allows for vertical tab management. Tab width is rather large, which is not nice.
Overall, very chunky, but pretty fast.
,,,,,,,,,,,,,,,,,,,,,,,,
NetSurf 3.0
````````````````````````
[[img:pix/dox/shot_netsurf.png]](pix/dox/shot_netsurf.png).class(thumbnail)
**website:** [[netsurf-browser.org]](http://netsurf-browser.org)
**requires:** GTK
As advertised, NetSurf is a very fast graphical web browser. This speed is accomplished by using a custom layout and rendering engine. While this does indeed provide a fast browsing experience, it can also bring about strong visual differences when compared to other browsers.
Although JavaScript can be enabled from the preferences, I could not get JavaScript to actually work on any of the sites I frequently travel. From the main website, initial JavaScript support was stated as being worked on, but it seems to not be fully implemented. As such, the browsing experience will be limited on any sites using JavaScript enhancements.
Plugins do not seem to work, at least in my experience. Just as with JavaScript, there is an enable Plugins checkbox in the preferences, but it didn't seem to change anything.
Tab management is fairly simple, but is nice enough to allow you to position the tab listing on the top, bottom, left, or right positions of the browser. Given that I prefer side tab listings, this is a very nice feature. Sadly, no tab tree branching/parenting is supported.
Do Not Track options are there, so that is nice.
My final opinion is that is it a nice, extremely fast browser that, sadly, does not provide a modern browsing experience.
,,,,,,,,,,,,,,,,,,,,,,,,
Xombrero 1.6.3
````````````````````````
[[img:pix/dox/shot_xombrero.png]](pix/dox/shot_xombrero.png).class(thumbnail)
**website:** [[opensource.conformal.com/wiki/xombrero]](https://opensource.conformal.com/wiki/xombrero)
**requires:** GTK, libbsd, webkitgtk3
Xombrero is a minimalistic browser that prioritizes personal security, saves screenspace, and maintains support for both mouse and keyboard browsing.
Per default, xombrero functions by maintaining a website/domain whitelist for cookies, javascript, and plugins. This mode can be toggled.
Keyboard browsing is accomplished via keystrokes and commands. Commands are handled by opening the prompt with ":" and typing the wanted command.
JavaScript enhanced websites tended to be very problematic, as xombrero did not pass keystrokes to underlying JavaScript.
Sessions can be saved and recalled, however sessions are lost if the browser is closed unexpectedly. There may be a way to guard from this by using session autosaving, however I did not explore this.
Tabs can be visually shown at the top, although this can be disabled. Otherwise, tabs are managed via listing commands in the command prompt.
I experienced crashing on occasion after closing complex websites such as Twitter or YouTube.
Overall, I found it to be quite nice, and the optional mouse-friendly user interface is useful. If security tied to the browser is your thing, xombrero is definitely nice.
,,,,,,,,,,,,,,,,,,,,,,,,
dwb 2013.03.30
````````````````````````
[[img:pix/dox/shot_dwb.png]](pix/dox/shot_dwb.png).class(thumbnail)
**website:** [[portix.bitbucket.org/dwb/]](http://portix.bitbucket.org/dwb/)
**requires:** GTK, webkitgtk, json-c
dwb actually succeeds at being a truly keyboard-centric browser. Styled after vi/vim, dwb manages to achieve proper keyboard shortcuts by using an **insert** mode that allows keyboard input to pass to the browser unimpeded. Most other browsers I've used tend to choke on page-specific keyboard input and shortcut key conflicts, so kudos here. It must be noted that it took me a few days to get accustomed to switching to insert mode after tab-focus (clicking on text boxes autoswitches, btw), so expect accidental shortcut activation.
Following links using dwb is a breeze, as it uses an extremely nice **hints** system. Via separate keystrokes, one can create "follow" popups for "hints", links, and images, and even choose to open in the same tab, a new tab, or a new window. One __excellent__ feature is that standard link following triggers JavaScript onClick events, so JavaScript enhanced websites work amazingly.
Using the above hinting, links can by copied to the clipboard **or** the current primary selection. This is very nice, as I often use both.
Configuration is managed in-browser which is very nice.
Sessions can be saved and are automatically recovered if the browser is closed unexpectedly.
Click to enable flash that works with keyboard hinting!
A lot more stuff - very feature rich while being very slim.
Fav'd, quite heavily because I like vim.
Major problem. After running for 50 hours, consisting of heavy usage (youtube, twitter, etc.), it was using around 2 gigs of memory with only one blank tab open. There appears to be some meory leaks. CPU usage was nice and low, though.
,,,,,,,,,,,,,,,,,,,,,,,,
vimprobable2
```````````````````````
In short, I wish it was more like dwb.
Mode does not auto-switch to insert when tabbing to a text field - it seems to require a mouseclick.
tabs are opened as separate windows which I don't like.
Follow hinting/link is far less sleek - it's like xombrero's "number every link into the hundreds" method. Mouseclicks are emitted, so nice there.
Flash is played per default.
,,,,,,,,,,,,,,,,,,,,,,,,
Conclusion
````````````````````````
**dwb** because it actually works as a minimalistic and modern keyboard-centric browser.
Second to that is **xombrero** because it works well enough.

View File

@ -1,13 +0,0 @@
,,,,,,,,,,,,,,,,
Welcome .alt(I am here to serve).class(drop-shadow)
````````````````
I am [[kts]].alt(Ketchetwahmeegwun Southall) and welcome to **kettek**.
This website is the central hub for my:
* **open source games**
* **open source projects**
* **technical documentation**
* **testing lab**
* **.plan files**
Embrace FOSS.

View File

@ -84,6 +84,9 @@ if ($current_page == "plans") {
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/style_pretty.css">
<!--<script type="text/javascript" src="javascript/folder.js"></script>-->
<script type="text/javascript" src="javascript/img2popup.js"></script>
<script type="text/javascript" src="javascript/history.js"></script>
<script type="text/javascript">window.onload = function() { img2popup.Go(); hist.Go(); };</script>
</head>
<body>
<div id="header">

View File

@ -0,0 +1,43 @@
/* This script implements HTML5 History states for clients that support it. It parses all links for those beginning in "?"(local), replaces with History-browsing functionality, and onclick updates the "content" div (and reparses accordingly). */
var hist = {
content: null,
Go: function() {
if (window.history.replaceState === undefined) return;
this.content = document.getElementById("content");
window.history.replaceState({content: this.content.innerHTML, url: window.location.href, title: document.title}, document.title, window.location.href);
this.doParse();
window.onpopstate = this.popState;
},
doParse: function(ele) {
var l = (typeof ele === 'undefined' ? document.getElementsByTagName('A') : ele.getElementsByTagName('A'));
for (var i = 0; i < l.length; i++) {
if (!l[i].href) continue;
if ((l[i].getAttribute("href")).charAt(0) != '?') continue;
l[i].onclick = function() {
hist.loadContent(this.getAttribute("href"));
return false;
};
}
img2popup.doParse(hist.content);
},
loadContent: function(target) {
var r = new XMLHttpRequest();
r.open("GET", "page.php"+target, true);
r.onreadystatechange = (function(r, target) { return function() {
switch (r.readyState) {
case 4:
hist.content.innerHTML = r.responseText;
window.history.pushState({content: r.responseText, url: target, title: document.title}, target, target);
hist.doParse(hist.content);
break;
}
}})(r, target);
r.send();
},
popState: function(e) {
if (e.state == null) return;
hist.content.innerHTML = e.state.content;
document.title = e.state.title;
hist.doParse(hist.content);
}
};

View File

@ -0,0 +1,59 @@
/* This script acquires all image tags encased in anchor tags that link to an image file then adds onclick events to popup + zoom the image rather than visiting the given link. */
var img2popup = {
popup: null,
focused: false,
Go: function(ele) {
if (this.popup == null) this.doSetup();
this.doParse();
},
doParse: function(ele) {
var context = (typeof ele === 'undefined' ? document.getElementsByTagName("img") : ele.getElementsByTagName("img"));
for (var i = 0; i < context.length; i++) {
var p = context[i].parentNode;
if (p.nodeName == "A") {
if (p.href.match(/\.(png|jpg|jpeg)$/)) {
p.onclick = (function(p) { return function(e) {
if (!e) var e = window.event;
e.cancelBubble = true; if (e.stopPropagation) e.stopPropagation();
img2popup.popup.src = p.href;
return false;
}})(p);
}
}
}
},
doSetup: function() {
this.popup = document.createElement("img");
this.popup.style.visibility = "hidden";
this.popup.id = "popup";
this.popup.onload = function() {
img2popup.doResize();
this.style.visibility = "visible";
img2popup.focused = true;
};
document.body.appendChild(this.popup);
document.onclick = function() {
if (img2popup.focused) img2popup.doHide();
};
window.onresize = img2popup.doResize;
},
doHide: function() {
this.popup.style.visibility = "hidden";
this.popup.src = "";
this.focused = false;
},
doResize: function() {
this.popup.style.width = this.popup.style.height = '';
var w = this.popup.width;
var h = this.popup.height;
var r = Math.min(((window.innerWidth || document.documentElement.clientWidth)-32) / w, ((window.innerHeight || document.documentElement.clientHeight)-32) / h);
if (r < 1.0) {
w *= r;
h *= r;
}
this.popup.style.marginLeft = -(w/2)+"px";
this.popup.style.marginTop = -(h/2)+"px";
this.popup.style.width = w+"px";
this.popup.style.height = h+"px";
}
};

View File

@ -2,8 +2,7 @@
==== [[kettek]]
((written things))
* [[About kts]](?about).title(The Self)
* [[Articles & Documents]](?dox).title(Substantial writings)
* [[Technical Notes]](?notes).title(technical notes and how-tos)
* [[Articles & Documents]](?dox).title(Insubstantial writings)
* [[.plans]](?plans).title(Of Action)
==== [[Games]]
((open source gamus))
@ -19,10 +18,8 @@
* [[Utilities]](?utilities).title(older utilities)
==== [[Lab]].title(less-than-complete things)
((experiments that could level up))
* [[procsicle]](?procsicle).title(PHP process linkage and terminal client)
* [[noirchat]](?noirchat).title(decentralized chatting at its finest)
* [[netwine]](?netwine).title(browser-based UDP/TCP/etc bridge)
* [[mediaServe]](?mediaServe).title(PHP Multimedia Serving)
<a class="twitter-timeline" height="300" href="https://twitter.com/kts_kettek" data-chrome="transparent noborders" data-widget-id="538319352290746369">Tweets by @kts_kettek</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+"://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>

View File

@ -3,7 +3,7 @@
````````````````````````
After slogging through Ludum Dare 31, [[Petite Juliet]].href(?petite_juliet) has been created! Developed from scratch using C++, SDL2, OpenGL, and GLSL, it's kind of a cool little game.
[[img:pix/petite_juliet.png]]
[[img:pix/petite_juliet.png]].style(width:50%).href(pix/petite_juliet.png)
((27 out of 48 hours were blasted away in the creation of this game.))
I plan to expand it in the future, implementing some of the features that were (sadly) missed due to rushing about. See the TODO [[here]].rhef(?petite_juliet).

View File

@ -1,4 +0,0 @@
,,,,,,,,,,,,,,,,,,,,,,,,
//2014-12-16// - Website Draft
````````````````````````
This here is a draft post.

View File

@ -0,0 +1,4 @@
,,,,,,,,,,,,,,,,,,,,,,,,
//2014-12-28// - ARK 1.0
````````````````````````
[[ARK/Alternative Registry Keeper]](?ARK) has been released!

View File

@ -0,0 +1,9 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
//2015-02-02// - MAngband 1.1.2 SDL2 interface
````````````````````````````````
I spent some time this last week hacking together an SDL2 interface for MAngband. I will be uploading the binaries for Windows 7, OS X, and Linux, along with the modified MAngband 1.1.2 source, once it is complete.
You can read some of my notes on hacking MAngband [[here]](?dox=mangband_hacking.html) - this should also provide enough information to make your own interface if you felt so inclined.
[[img:pix/shot_mangband.png]].style(width:75%).href(pix/shot_mangband.png)

View File

@ -0,0 +1,8 @@
,,,,,,,,,,,,,,,,,,,,,,,,
//2015-03-21// - Website now live
````````````````````````
After some dilly-dallying, the new redesigned kettek is live.
All content is generated from kettext formatted files. If you are truly curious, see the git repo [[here]].href(http://kettek.net/gitphp/?p=kettek.git).
Some of the old content is not yet available, but will be moved/copied in over the coming weeks.

75
page.php 100644
View File

@ -0,0 +1,75 @@
<?php
$pages = [
"proclib",
"TODO",
"kettext",
"front",
"plans",
"news",
"netwine",
"dox",
"cirquit",
"petite_juliet",
"VAD",
"newsboy",
"about",
"utilities",
"ARK",
"noirchat"
];
$current_page = "news";
foreach ($pages as $page) {
foreach ($_GET as $get=>$value) {
if ($get == $page) {
$current_page = $page;
}
}
}
if ($current_page == "plans") {
if ($_GET["plans"] == '') {
$plans = scandir('plans/');
for ($i = 2; $i < count($plans); $i++) {
$post .= "<a href=?plans=".$plans[$i].">".$plans[$i]."</a><br />\n";
}
} else {
$plans = scandir('plans/');
for ($i = 2; $i < count($plans); $i++) {
if ($plans[$i] == $_GET['plans']) break;
}
$post .= "<h3>".$_GET['plans']."</h3>";
$post .= "<center>";
if ($i-1 >= 2) {
$post .= '<a href="?plans='.$plans[$i-1].'" class="surf">&lt;&lt; '.$plans[$i-1].'</a>';
}
$post .= ' <a href="?plans" class="surf">index</a> ';
if ($i+1 < count($plans)) {
$post .= '<a href="?plans='.$plans[$i+1].'" class="surf">'.$plans[$i+1].' &gt;&gt;</a>';
}
$post .= "</center>";
$post .= "<pre>".htmlentities(file_get_contents("plans/".$_GET['plans']))."</pre>";
}
} else if ($current_page == "dox") {
if ($_GET["dox"] == '') {
$dox = scandir('dox/');
for ($i = 2; $i < count($dox); $i++) {
$post .= "<a href=?dox=".$dox[$i].">".$dox[$i]."</a><br />\n";
}
} else {
$post .= '<a href="?dox" class="surf">Back to index</a><br />';
$post .= (file_get_contents("dox/".$_GET['dox']));
}
} else if ($current_page == "news") {
$news = scandir('news/');
array_shift($news);
array_shift($news);
rsort($news);
for ($i = 0; $i < count($news); $i++) {
$post .= (file_get_contents("news/".$news[$i]));
}
}
(file_exists('pages/'.$current_page.'.html') ? include 'pages/'.$current_page.'.html' : '');
echo ($post ? $post : '');
?>

View File

@ -1,7 +1,9 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ARK - Alternative Registry Keeper
````````````````````````````````
//Latest Version:// **1.0** (((2014-12-22))) / [[archive]].href(archive/ark) / [[git]].href(http://kettek.exoss.net/git/ARK)
[[image:pix/shot_ARK.png]].class(thumbnail).href(pix/shot_ARK.png)
//Latest Version:// **1.0** (((2014-12-22))) / [[archive]].href(archive/ARK) / [[git]].href(http://kettek.net/gitphp/?p=ARK.git)
ARK is a fancy [[HTML5 & JavaScript enhanced]].title(The cool kids call it modern) directory index written in PHP. It is intended to be a sleek replacement for the standard Apache Directory Listings.

View File

@ -3,12 +3,10 @@ VAD
````````````````````````````````
[[img:pix/icon_vad.gif]].width(64px).style(float:right;)
//Latest Version:// **0.2** (((2014-12-16))) / [[archive]].href(archives/VAD) / [[git]].href(http://kettek.exoss.net/git/VAD)
//Latest Version:// **0.1** (((2014-12-16))) / [[archive]].href(archive/VAD)
* [[Linux 32-bit and 64-bit]].href(archives/VAD/latest_linux)
* [[Mac OS X Universal (ppc/intel)]].href(archives/VAD/latest_macosx)
* [[Windows 7 32-bit]].href(archives/VAD/latest_windows)
* [[GPLv3 Source]].href(archives/VAD/latest_source)
* [[Linux/Mac/Windows binary]].href(archive/VAD/latest_all)
* [[GPLv3 Source]].href(archive/VAD/latest_source)
Deep in the underdark, the ancient beast awaited the arrival of some forlorn adventurer seeking the treasures of the forgotten gods. This traveler would need more than mere strength to defeat such a guardian -- wit and cunning would be the true deciders of fate...
@ -16,4 +14,6 @@ But with what means could such a feat become possible?
**Why, with VAD, of course!**
VAD is an engine for text-based, prose-centric adventures. It holds a modular design that allows for multiple front-ends, such as **curses** and **SDL**, along with back-ends that allow for different adventure formats, such as **VAD** and **ADV**.
VAD is an engine for text-based, prose-centric adventures.
//COMING SOON//: version 0.2, with a modular design that allows for multiple front-ends, such as **curses** and **SDL**, along with back-ends that allow for different adventure formats, such as **VAD** and **ADV**.

View File

@ -4,17 +4,18 @@ About
This website -- and all content unless otherwise noted -- was created by **kts / Ketchetwahmeegwun T. Southall**.
Feel free to contact me through any of these mediums:
* **E-mail:** kettek1[[img:pix/at.gif]].style(float:none;).alt(@)exoss.net
* **E-mail:** kettek1[[img:pix/at.gif]].style(float:none;).alt(@)kettek.net
* **XMPP:** kts[[img:pix/at.gif]].style(float:none;).alt(@)wechat.exoss.net
* **Twitter:** [[@kts_kettek]](https://twitter.com/kts_kettek/)
My GPG/PGP pubkey is available [[here]](pubkey.gpg)
----
This page is here so as to provide a more complete description of my person.
**I...**
* am a Free software advocate
* graduated in philosophy
* care about learning, making cool stuff, having fun, and teaching others to do the same.
**I have...**
@ -35,7 +36,6 @@ This page is here so as to provide a more complete description of my person.
**I have played with...**
* [[Redundant ZFS clustering]](?dox=redundant_zfs_clustering)
* IRC server management
* IMAP email services
* programming virtual machines and languages
* 3d modeling and animating with Blender

View File

@ -3,14 +3,13 @@ CirQuit
````````````````````````````````
[[yt:https://www.youtube.com/watch?v=shlxBj0F02M]]
//Latest Version:// **1.0** (((2014-07-07))) / [[archive]].href(archives/cirquit) / [[git]].href(http://kettek.exoss.net/git/cirquit)
* [[Stand-alone]].href(archives/VAD/latest)
* [[GPLv3 Source]].href(archives/VAD/latest_source)
**DOWNLOADS FORTHCOMING**
//Latest Version:// **1.0** (((2014-07-07))) / [[archive]].href(archive/CirQuit)
CirQuit is a puzzle game that adheres to some NES limitations, such as sprite sizes, screen size, and controls. It was created for the NES-themed gamejam, #NESJAM and is written in JavaScript using [[CBDL]].href(?CBDL).
<div style="width:100%;margin:auto;text-align:center;">
Start: **Enter** | A: **X** | B: **Z** | DPad: **Arrow Keys**
<iframe src="http://kettek.exoss.net/CirQuit/" style="float:none;width:320px;height:240px;"></iframe>
<iframe src="http://kettek.net/CirQuit/" style="float:none;width:320px;height:240px;"></iframe>
</div>
,,,,,,,,,,,,,,,,,,,,,,,,
The Plot

12
pages/kettext.ktx 100644
View File

@ -0,0 +1,12 @@
.imply(header.ids)
//Latest Version:// **alpha source** (((2015-02-03))) / [[archive]].href(archive/kettext) / [[git]].href(http://kettek.net/gitphp/?p=kettext.git)
.include(../../kettext/documentation/kettext_define.ktx)
.include(../../kettext/documentation/kettext_history.ktx)
.include(../../kettext/documentation/kettext_formatting.ktx)
.include(../../kettext/documentation/kettext_rules.ktx)

3
pages/ktx 100644
View File

@ -0,0 +1,3 @@
[?25l[?12l[?25h[?1049h[?1h=[?12;25h[?12l[?25h[?25l"VAD" [New File]~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ [?12l[?25h[?25l-- VISUAL --[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25l[?12l[?25h[?25lType :quit<Enter> to exit Vim[?12l[?25h[?1l>[?1049lVim: Caught deadly signal HUP
Vim: Finished.


View File

@ -1,3 +1,4 @@
DOWNLOAD FORTHCOMING.
,,,,,,,,,,,,,,,,
DESCRIPTION
````````````````

View File

@ -2,7 +2,7 @@
Noirchat
````````````````````````````````
[[image:pix/shot_noirchat.png]].style(width:35%;float:right;).href(pix/shot_noirchat.png)
//Latest Version:// [[git]].href(http://kettek.exoss.net/git/noirchat)
//Latest Version:// [[git]].href(http://kettek.net/gitphp/?p=noirchat.git)
This program is an incomplete project that is intended to provide fully decentralized encrypted instant messaging. The intended network is either local networks or VPNs.

View File

@ -3,11 +3,11 @@ Petite Juliet
````````````````````````````````
[[image:pix/petite_juliet.png]].style(width:50%;float:right;).href(pix/petite_juliet.png)
//Latest Version:// **1.0** (((2014-12-11))) / [[archive]].href(archives/petite_juliet) / [[git]].href(http://kettek.exoss.net/git/juliet)
* [[Linux 32-bit and 64-bit]].href(archives/petite_juliet/latest_linux)
* [[Mac OS X Universal (powerpc/intel)]].href(archives/petite_juliet/latest_macosx)
* [[Windows 7 32-bit]].href(archives/petite_juliet/latest_windows)
* [[GPLv3 Source]].href(archives/petite_juliet/latest_source)
//Latest Version:// **1.0** (((2014-12-11))) / [[archive]].href(archive/Petite_Juliet) / [[git]].href(http://kettek.net/gitphp/?p=juliet.git)
* [[Linux 32-bit and 64-bit]].href(archive/Petite_Juliet/latest_linux)
* [[Mac OS X Universal (powerpc/intel)]].href(archive/Petite_Juliet/latest_macosx)
* [[Windows 7 32-bit]].href(archive/Petite_Juliet/latest_windows)
* [[GPLv3 Source]].href(archive/Petite_Juliet/latest_source)
Petite Juliet is a single-screen brawling game featuring stylized pixel art. It was originally written for the 48-hour Ludum Dare 31 Compo.
@ -21,3 +21,18 @@ Petite Juliet is a single-screen brawling game featuring stylized pixel art. It
----
The source code is available under the GPLv3. Feel free to modify, inspect, critizice, or burn it.
,,,,,,,,,,,,,,,,,,,,,,,,
TODO
````````````````````````
* 1. Framebuffer coloring layer - additive layer that is placed over terrain, "staining" the terrain layer with special fx(blood, etc.)
* 2. Throwing of entities
* 3. Multiplayer
* 4. Stage and wave system.
* Each stage is a separate color, and is shown as a separate FBO in the background. When the current stage ends, it zooms into the new stage.
* 5. Fun special effects for hittin' stuff
* 6. More enemy types!
* Bosses as well
* 7. Blocking and countering
* 8. Items (parasol)
* 9. More and better sound effects. Music too.

View File

@ -3,11 +3,9 @@ Proclib
````````````````````````
[[yt:aMp9nZ57gqI]]
//Latest Version:// **1.0** (((2014-12-11))) / [[archive]].href(archives/proclib) / [[git]].href(http://kettek.exoss.net/git/proclib)
* [[Linux 32-bit and 64-bit]].href(archives/proclib/latest_linux)
* [[Mac OS X Universal (powerpc/intel)]].href(archives/proclib/latest_macosx)
* [[Windows 7 32-bit]].href(archives/proclib/latest_windows)
* [[GPLv3 Source]].href(archives/proclib/latest_source)
//Latest Version:// **0.1** (((2014-12-11))) / [[archive]].href(archive/proclib) / [[git]].href(http://kettek.net/gitphp/?p=proclib.git)
* [[Linux/Mac/Windows binary]].href(archive/proclib/proclib_0.1_all.zip)
* [[GPLv3 Source]].href(archive/proclib/proclib_0.1.tgz)
What is proclib? Simply, a library and syntax language for cell-based map generation.

View File

@ -3,5 +3,7 @@ Utilities
````````````````````````````````
This page contains various smaller utilities I've written over the years. These are much smaller in scope than other projects and many of them suffer from less-than-perfect coding practices.
All downloads are currently unorganized and available [[here]].href(archive/utilities).
.include(utilities/OSX.ktx)

View File

@ -1,7 +1,7 @@
,,,,,,,,,,,,,,,,
EBIC - Excellent Batch Image Converter
````````````````
[[img:pix/utilities/shot_ebic.png]].class(thumbnail)
[[img:pix/utilities/shot_ebic.png]].class(thumbnail).href(pix/utilities/shot_ebic.png)
EBIC, or Excellent Batch Image Converter, is an AppleScript frontend to the sips program for converting/resizing large batches of images. It has been released under the GPLv3, although the code is certainly less than ideal.
EBIC was created for fulfilling a need that seemed to be lacking in most available solutions for a minimalistic batch image converter for OS X, at least at the time I created it (2011/02/15). The UI is a bit more obtruse than I would like it to be, however it should be fairly forthcoming as to what does what.

View File

@ -1,7 +1,7 @@
,,,,,,,,,,,,,,,,
EPPPD
````````````````
[[img:pix/utilities/shot_epppd.png]].class(thumbnail)
[[img:pix/utilities/shot_epppd.png]].class(thumbnail).href(pix/utilities/shot_epppd.png)
EPPPD is a fairly simple GPLv3'd AppleScript frontend to the pppd program. Given the background of the author (me!), common *nix methods are used to acquire the most-likely subnet, tty device, and DNS (aka, ls /dev/tty*, parsing those values, etc.). At the moment, it is fairly limited in its capabilities, but should be more than enough for the purpose of running a pppd server to a mobile/palm client, as was its original purpose. Additionally, the code is pretty nasty, but for the sake of FS/OSS I have made it available.
**Features**

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
pix/shot_ARK.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View File

@ -1,5 +0,0 @@
.imply(version.none)
,,,,,,,,,,,,,,,,,,,,,,,,
[[plans]].href(?plans)
````````````````````````
These plan files general contain information pertaining to what I'm working on at some given moment. Expect obtuse jargon without reference.

View File

@ -1,637 +0,0 @@
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Preface
````````````````````````
What is proclib? Simply, a library and syntax language for cell-based map generation.
However, it is much more than that -- it is a C library that allows for the creation of randomized and complex maps filled with a plethora of user-defined structures.
Structures can be thought of as complex collections of entities/cells. From this, structures can be made up of other structures to increase the variation and complexity needed for a structure. Examples of structures are: castles, moats, ravines, towns, rooms, and much more.
An example of structure definition syntax is:
#circle {
# flags CIRCLE
# x 1~3
# y 1~3
# size_x 4~8
# size_y 4~8
# id_1 1
#}
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Syntax
````````````````````````
proclib structure definitions are written in plain text files with **very** simple formatting rules. A structures file can contain an ultimately unlimited amount of structures within it, and each structure can have various configurations applied that alter its generation behaviors.
,,,,,,,,,,,,,,,,
Basic Syntax
````````````````
Each structure is contained with a structure definition block such as:
#my_structure {
# x 1
# y 1
#}
Within a structure definition block, the following variables can be set:
* **flags** -- defines the generation behavior using bitflags. Multiple flags can be set by piping them together (ex. "flags CIRCLE|BORDER|ORIGIN")
* Shape Generation
* //CIRCLE// - Bresenham-like ellipse generation
* //RECT// - basic "box" generation
* Shape Modification
* //BORDER// - creates an interior border using the current shape
* //IGNORE_EMPTY// - ignores cells that are empty (i.e., have no id_s written to them)
* Structure Placement
* //ORIGIN// - places the structure from its center
* //OVERLAP// - overlaps the structure on top of other potential structures
* **size_x, size_y** -- defines the size of the structure. Values may be:
* single numbers (e.g., "4")
* percentages (e.g., "50%" of parent's size)
* ranges of either (e.g., "25%~50%").
* If omitted, defaults to 0, 0
* **x, y** -- defines the position of the structure. Values may be:
* single numbers (e.g., "-4", "4")
* percentages (e.g., "-50%", "50%")
* ranges of either (e.g., "-50%~50%").
* If omitted, defaults to 0, 0
* **id_1** -- first id of the structure. Values may be:
* single numbers (e.g., "2")
* ranges (e.g., "1~4")
* comma-delimited sets of either (e.g., "2, 1~4")
* **id_2** -- second id of the structure. Follows same rules as id_1
Before delving into more complicated aspects of structure definitions, let us use some of the above information to create a simple structure.
,,,,,,,,,,,,
A Simple Circle
````````````
A rudimentary example that creates a variable-sized tower in the middle of the screen would be:
tower {
flags CIRCLE
size_x 12~16
size_y 9~14
id_1 0
}
This would generate structures similar to the following:
........................................
....................0...................
.................0000000................
................000000000...............
...............00000000000..............
...............00000000000..............
..............0000000000000.............
...............00000000000..............
...............00000000000..............
................000000000...............
.................0000000................
....................0...................
........................................
,,,,,,,,,,,,,,,,
Complex Syntax: Relations
````````````````
Every structure can have 3 additional sets of information. The first I will cover is **relations**. A relation is, as the name implies, a relationship to another structure. In general, relations are used to create sub-structures within a structure.
**Relations** are contained with a relations block, and each relation is defined in a similar method as a regular structure. Acceptable settings are:
* **flags** -- same as structure flags, but override and/or stack on top of the given structure's flags
* **x, y** -- override position settings
* **count** -- defines how many times to generate this relation. Values may be:
* single numbers (e.g., "2")
* ranges (e.g., "2~6").
* If omitted, defaults to 1.
Using this new information, let us expand upon the earlier tower.
,,,,,,,,,,,,
A Simple Tower
````````````
An ellipse by itself is rather boring, but we can spice things up by using relations to create walls:
tower {
flags CIRCLE
size_x 12~16
size_y 9~14
id_1 0
relations {
tower_walls {
flags CIRCLE|OVERLAP
}
}
}
tower_walls {
flags BORDER
size_x 100%
size_y 100%
id_1 1
}
This would generate a structure similar to the following:
........................................
...................1....................
................1111111.................
..............11100000111...............
..............10000000001...............
.............1100000000011..............
..............10000000001...............
..............11100000111...............
................1111111.................
...................1....................
........................................
,,,,,,,,,,,,,,,,
Complex Syntax: Replace
````````````````
With the concept of relations out of the way, we can move into the **replace** functionality.
**Replace** rules are contained in a replace block and define what type of **id_1** and **id_2** tiles may be replaced. The possible values in a replace block are:
* **id_1** -- list of primary IDs that may be replaced. Values may be:
* single positive numbers (e.g., "4")
* positive ranges (e.g., "1~4")
* comma-delimited sets of either (e.g., "1, 3~8, 12)
* **id_2** -- list of secondary IDs that may be replaced. Values may be the same as id_1.
For this example, we're going to use another structure to remove a section of walls from the tower.
,,,,,,,,,,,,
Holy Tower
````````````
tower {
flags CIRCLE
size_x 12~16
size_y 9~14
id_1 0
relations {
tower_walls {
flags CIRCLE|BORDER|OVERLAP
}
hole {
x 50%
y 50%
}
}
}
tower_walls {
flags BORDER
size_x 100%
size_y 100%
id_1 1
}
hole {
flags RECT|IGNORE_EMPTY
size_x 100%
id_1 0
replace {
id_1 1
}
}
What we've done here is create a new "hole" structure that replaces any overlapping cell with an id_1 of "1" with "0". We've added this structure as a relation to the tower so that it is applied appropriately. The IGNORE_EMPTY flag is only used to prevent the replacement of empty (unset) tiles.
The resulting replacement would generate something similar to:
........................................
...................1....................
................1111111.................
..............11100000111...............
..............10000000001...............
.............1100000000000..............
..............10000000000...............
..............11100000000...............
................1111000.................
...................1....................
........................................
,,,,,,,,,,,,,,,,
Complex Syntax: Paths
````````````````
The (currently!) final important structure generating concept is that of **paths**. The first key concept is to realize that paths are generated in a separate pass from initial structures. During structure generation, structures are built and then recorded as "live structures". After this, these live structures are checked for any pathing configuration, and if found, a pathing pass is made. The pathing pass itself generates new live structures for every path "step" made (kept separately from the previous!) and handles the building as per normal operations.
A **path** is a configuration within a structure that defines some form of pathing behavior. This includes from/to destination structures, position offsets, structure to use for pathing, pathing algorithm, and others. Acceptable settings for a path are:
* **flags** -- these define the behaviors of the pathing
* Algorithms/Movement
* //DUMB// -- doggedly move towards "to" by incrementing or decrementing x and y position. Is stopped by cells that cannot be replaced and are not empty.
* //A*// -- uses A* to intelligently move towards position (NOT IMPLEMENTED (YET!))
* //WALK// -- only move one cell in one direction at a time (e.g., x+1 OR y+1, not both)
* //WANDER// -- some odd chance to randomly move x or y in a direction. Requires an Algorithm.
* Looping
* //ALL// -- attempt to path find to all targets that match the to pathing syntax
* Etc.
* //FORCE// -- if pathing movement fails too many times(>32), force movement anyway
* //UNIQUE// -- only look for from/to targets that have not been pathed to/from by this structure
* **to** -- pathing syntax for the structure to path to - REQUIRED
* **to_flags** -- flags that define a specific "to" behavior
* //ORIGIN// -- you guessed it, to_x/to_y values are relative to the center of the target
* **to_x, to_y** -- position to path to. Values may be:
* single numbers (e.g., "1", "-1")
* percentages (e.g., "25%")
* ranges (e.g., "-25%~25%", "-5~5")
* sets of any (e.g., "1, 25%, -5~5")
* **from** -- pathing syntax for the structure to path from. If omitted, defaults to the structure making this path.
* **from_flags** -- same as to_flags
* **from_x, from_y** -- same as to_x, to_y
* **x, y** -- positional data that is applied to each pathing step. Values may be:
* single numbers (e.g., "-1")
* ranges (e.g., "-1~1")
* sets of either (e.g., "-1, -1~1")
,,,,,,,,,,,,
Pathing Syntax
````````````
Pathing syntax, used for **to** and **from** in pathing, refers to live structures and uses a straight-forward syntax contained in a single string. An example pathing syntax string could be: ":tower:hole" The following are the single-character "commands" used to acquire a live structure.
* **:** -- if the first character of the string, get the global "root" live structure
* **:** -- otherwise it is used a position delimiter to specify parent->child
* **^** -- get parent of this context's live structure
These can be combined to acquire live structures in complex structures. Examples:
* "tower" -- look for a structure named "tower" in the current context.
* ":tower" -- look for a structure named "tower" in the root context.
* "^tower" -- look for a structure named "tower" in the parent of the current context.
* "^^towers:tower:room" -- look for a structure named "room" in "tower" in "towers" in the parent of the parent of the current context.
Context is assumed to be the live structure containing the path definitions.
Let us use this new-found knowledge to create a road between the towers of two rival wizards.
,,,,,,,,,,,,
The Two Towers
````````````
This example expands on the preceding example by creating a wall-removing path between two towers.
tower {
flags CIRCLE
size_x 8~12
size_y 7~10
id_1 0
relations {
tower_walls {
flags CIRCLE|OVERLAP
}
}
}
tower_walls {
flags BORDER
size_x 100%
size_y 100%
id_1 1
}
dirt_path {
flags RECT
size_x 1
size_y 1
id_1 0
replace {
id_1 1
}
}
towers {
size_x 100%
size_y 100%
relations {
tower {
count 2
x 10~75%
y 10~75%
}
}
paths {
dirt_path {
flags DUMB|WALK
to tower
to_flags ORIGIN
from tower
from_flags ORIGIN
}
}
}
This would create a scene similar to:
...............1........................
............1111111.....................
...........110000011....................
..........11000000011...................
...........110000011.......1............
............1111100.....1111111.........
...............1..00...110000011........
...................00..100000001........
....................0011000000011.......
.....................00000000001........
.......................110000011........
........................1111111.........
...........................1............
This should give a fairly concise overview of proclib, although there are likely to be massive enhancements and changes in the future. :)
,,,,,,,,,,,,,,,,
Other Examples
````````````````
,,,,,,,,,,,,
Little House by the Lake
````````````
................................................................
.........8.......8.........8.8.........88......8.8..............
......11111111111.........8....8........................8.......
......10000000001.........8....8................................
.....8100000000018.8........................8....8..............
......11111111111.............8.8...........8...............8...
.......................8........................................
......8.......8...........................8.....8...........8..8
............................................8...................
..8........................8......8.........................8...
...8..8....8.......8....8........8..............................
........................................8..............8........
.......8.....................8....8......................8......
..........8..8.........88........................8...8...8..8...
......8...............8..8.......8.................8.....0....8.
......88...............8.................8..........000000000000
...8.............8...............................000000000000000
..8....8...............88.......................0000000000000000
............................8.................000000000000000000
....8..................8......8.........8....0000000000000000000
........8..............8....................00000000000000000000
...................................8.......000000000000000000000
.....8..........8...8.........8............000000000000000000000
--------
tree {
flags RECT
size_x 1
id_1 8
}
lake {
flags CIRCLE|OVERLAP
size_x 50~75%
id_1 0
}
house {
flags RECT
size_x 9~14
size_y 4~7
id_1 0
relations {
house_walls {
flags RECT
}
}
}
house_walls {
flags BORDER|OVERLAP
size_x 100%
size_y 100%
id_1 1
}
start {
size_x 64
size_y 32
relations {
lake {
count 4~6
x 50~80%
y 70~80%
}
tree {
count 64~128
x 0~100%
y 0~100%
}
house {
flags OVERLAP
count 1
x 10~50%
y 10~50%
}
}
}
,,,,,,,,,,,,
Lumpy Castle
````````````
The structure definition for this one is exceptionally bad and could be refactored.
.................................................................
............................................................9....
...9.......1.........................9........1..................
........1111111............................1111111...............
.......110000011..........................1100000119.............
.......100000001..........................100000001..............
.......100000001.....................9....100000001......9.......
......1100000001111111111111111111111111111000000011.............
.......100000000000000000000000000000000000000000001.............
.......100000000000000000000000000000000000000000001.............
.......110000001111111111111111111111111111100000011....9........
........11000011...........9...............11000011..............
.........100001.............................100001...............
.........100001..............1......9.......100001...............
.........100001...........1111111...........100001...............
.........100001...9......110000011..........100001...............
.........100001..........100000001..........100001...............
.........100001........9.100000001..........100001..............9
.........100001.........11000000011.........100001...............
.........100001..........100000001..........100001...............
.........100001..........100000001..........100001...............
.9.......100001..........110000011..........100001...............
.........100001...........1111111...........100001...............
.........100001.....9........1..............100001...............
........1100001............................1100001...............
.......110000011..........................110000011..............
.......100000001..........................100000001..............
.......100000001..........................100000001....8.........
......1100000001111111111111111111111111111000000011.88888.......
.......10000000000000000000000000000000000000000001..88888.......
.9.....10000000000000000000000000000000000000000001.8888888......
.......11000001111111111111111111111111111110000011..88888.......
........1111111............................1111111...88888.......
...........1.................................81........8.........
...........................................88888.................
.............................9.............88888.............9...
..........................................8888888................
...........................................88888.................
...........................................88888.................
.............................................8...................
.................9........9.......9..............................
--------
lake {
flags CIRCLE|ORIGIN
size_x 6~9
id_1 8
}
tree {
flags RECT|ORIGIN
size_x 1
id_1 9
replace {
id_1 9
}
}
tower_1 {
flags CIRCLE|ORIGIN
size_x 20%
id_1 0
relations {
tower_walls {
flags OVERLAP
}
}
}
tower_2 {
flags CIRCLE|ORIGIN
size_x 20%
id_1 0
relations {
tower_walls {
flags OVERLAP
}
}
}
tower_3 {
flags CIRCLE|ORIGIN
size_x 20%
id_1 0
relations {
tower_walls {
flags OVERLAP
}
}
}
tower_4 {
flags CIRCLE|ORIGIN
size_x 20%
id_1 0
relations {
tower_walls {
flags OVERLAP
}
}
}
tower_5 {
flags CIRCLE|ORIGIN
size_x 20%
id_1 0
relations {
tower_walls {
flags OVERLAP
}
}
}
tower_walls {
flags CIRCLE|BORDER
size_x 100%
size_y 100%
id_1 1
}
long_walls {
size_x 10%
size_y 10%
flags RECT|ORIGIN
id_1 0
replace {
id_1 1
}
relations {
long_walls_walls {
}
}
}
long_walls_walls {
flags RECT|BORDER|ORIGIN|OVERLAP
size_x 100%
size_y 100%
id_1 1
replace {
id_1 0
}
}
castle {
size_x 90%
size_y 90%
relations {
tower_1 {
x 20%
y 20%
}
tower_2 {
x 20%
y 80%
}
tower_3 {
x 80%
y 20%
}
tower_4 {
x 80%
y 80%
}
tower_5 {
flags ORIGIN
x 50%
y 50%
}
}
paths {
long_walls {
flags DUMB|WALK|FORCE
from tower_1
from_flags ORIGIN
to tower_2
to_flags ORIGIN
to_x -25%
}
long_walls {
flags DUMB|WALK|FORCE
from_flags ORIGIN
from_x 0%
from_y 0%
to_flags ORIGIN
to_x 0%
to_y 0%
from tower_1
to tower_3
}
long_walls {
flags DUMB|WALK|FORCE
from_flags ORIGIN
from_x 0%
from_y 0%
to_flags ORIGIN
to_x -25%
to_y 0%
from tower_3
to tower_4
}
long_walls {
flags DUMB|WALK|FORCE
from_flags ORIGIN
from_x 0%
from_y 0%
to_flags ORIGIN
to_x 0%
to_y 0%
from tower_4
to tower_2
}
}
}
start {
size_x 64~80
size_y 32~48
relations {
castle {
}
tree {
count 16~32
x 0~100%
y 0~100%
}
lake {
count 1~2
x 70~100%
y 70~100%
}
}
}
.imply(header.ids)

65
pubkey.gpg 100644
View File

@ -0,0 +1,65 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
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
sxB82jaIVmZB1wZrTG1w704c4xyaNJQ=
=JHLx
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -1,66 +0,0 @@
/* */
body {
background-color: #000;
}
/* general helper classes */
.min {
margin: 0 auto;
float: right;
width: 1000px;
}
.padder {
padding: 1em;
margin: 0;
}
/* header styling */
#header {
float: left;
min-width: 100%;
height: 200px;
background-color: #FFF;
text-align: center;
color: #DFDFDF;
font-size: 24pt;
line-height: 100%;
}
/* content styling */
#container {
padding: 15px 0;
clear: both;
text-align: left;
}
/* */
#menu {
position: relative;
width: 30%;
min-height: 70%;
float: right;
background-color: #000;
color: #DFDFDF;
text-align: right;
font-size: 16pt;
line-height: 150%;
}
/* */
#content {
position: relative;
float: left;
width: 70%;
min-height: 70%;
background-color: #FFF;
color: #DFDFDF;
font-size: 12pt;
line-height: 125%;
}
#content h1 {
width: 100%;
padding: 0.5em;
border-bottom: 2px solid #555;
color: #000;
background-color: #555;
}
#content p, ul {
padding-left: 1em;
}

View File

@ -1,23 +0,0 @@
.shadow_inset {
-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.8), 0 0 40px rgba(0, 0, 0, 0.4) inset;
-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.8), 0 0 40px rgba(0, 0, 0, 0.4) inset;
box-shadow:0 1px 4px rgba(0, 0, 0, 0.8), 0 0 40px rgba(0, 0, 0, 0.4) inset;
}
.shadow_inset:before,
.shadow_inset:after {
content: "";
position: absolute;
z-index: -2;
bottom:15px;
left:10px;
width:50%;
height:20%;
-webkit-box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);
-moz-box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);
box-shadow:0 15px 10px rgba(0, 0, 0, 0.7);
-webkit-transform:rotate(-3deg);
-moz-transform:rotate(-3deg);
-ms-transform:rotate(-3deg);
-o-transform:rotate(-3deg);
transform:rotate(-3deg);
}

View File

@ -1,80 +0,0 @@
/* This file resets EVERYTHING */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-weight: inherit;
font-style: inherit;
font-size: 100%;
vertical-align: baseline;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
body {
line-height: 1;
color: black;
background: white;
}
ol, ul {
list-style: none;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: separate;
border-spacing: 0;
}
caption, th, td {
text-align: left;
font-weight: normal;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: "";
}
blockquote, q {
quotes: "" "";
}
strong {
font-weight:bold;color:#0289ce;
}
em {
font-style:oblique;
}
p {
margin:15px 0;
}
.aligncenter, div.aligncenter {
display: block;
margin-left: auto;
margin-right: auto;
}
.alignleft {
float: left;
}
.alignright {
float: right;
}
h1 {font-size:180%;}
h2 {font-size:150%;}
h3 {font-size:125%;}
h4 {font-size:100%;}
h5 {font-size:90%;}
h6 {font-size:80%;}
a:link {color:#0289ce;}
a:hover {color:#f64274;}

View File

@ -1,2 +0,0 @@
/* this file stacks on top of style.css and add additional prettiness */