Welcome to TiddlyWiki created by Jeremy Ruston, Copyright © 2007 UnaMesa Association
Your training pays off, and one of your Abilities increases.
''Prerequisite:'' Ability Training in the same ability.
''Benefit:'' Choose one Ability. You gain a permanent +2 bonus to that ability. This bonus does nto stack with the benefit from Ability Training.
''Special:'' You can gain this feat multiple times, its effects do not stack. Each time you take this feat it applies to another ability.
You spend time honing one of your Abilities: Strength, Dexterity, Constitution, Intelligence, Wisdom, or Charisma.
''Benefit:'' Choose one Ability; treat that Ability as having a +2 bonus to that Ability Score whenever you are making an Ability Check. This bonus does not count when making a skill check or for any other use of that ability.
''Special:'' You can gain this feat multiple times, its effects do not stack. Each time you take this feat it applies to another ability.
A relatively peaceful city-state, independent of [[Dassura]] and [[Elarnuz]], Amateth lays claim to the southern islands and mainland near them, about 87,550 square miles. Known as producing the most skilled sailors of the the [[Nesherim]], Amateth has become a rich country by helping Dassura to control the flow of trade between the world-sea and the [[Sea of Imneru]].
!Environment
!Provinces
!Relations
!Economy
!History
!Culture
The language of the [[Pavanno]]s of [[Azume]], this language bears a resemblence to [[Pavani]]. A speaker of Anuyi can make an Intelligence check at a DC of 28 to understand a sentence of Pavani, and at DC 30 to undertand [[Biyami]].
[[Feats|Feat]]
[[Subraces|Subrace]]
[[Regions]]
[[Nations|Nation]]
[[Index]]
Asua, located on the west peninsula of the [[Ilua Mainland]], is a free nation that has to date maintained independence from [[Iluana]]. There is some tension between the two nations, though no overt hostilities have ever occurred. Asua, unlike Iluana, divides itself into a group of allied city-states, each of which maintain a territory, and are allied together. Each city-state maintains armies and, if necessary, navies for the protection of the alliance as a whole. Asua has territory covering 138,818 square miles.
!Environment
!City-states
!Relations
!Economy
!History
!Culture
The native language of the [[Nesherim]] of [[Amateth]]. Speakers of Atlathtu can make an Intelligence check at a DC of 28 to understand a sentence of [[Nethrinu]], and at a DC of 26 to understand a sentence of [[Tekhranu]].
Azume is unique among the [[Pavanno]]s in that the rulers are not exclusively trained as Psions. Many members of the ruling nobles have no psionic talent whatsoever. This does not change the overwhelming acceptance of psionics typical of Pavannos, but it does change the priorities a bit. Covering the hills and plains of the southern tip of the [[Pavana Coast]], Azume controls 253,065 square miles of land.
!Environment
!Organization
!Relations
!Economy
!History
!Culture
All characters must choose a background feat before first level. This background feat is in addition to the feats normally acquired at first level. A character must satisfy all requirements of the background feat they choose (subrace/class).
!List of Background Feats
<<list byTag "BackgroundFeat">>
Barbarians hail either from the [[Zulavya Highlands]] or from the deep deserts of the [[Nethrini Peninsula]]. Often the most dedicated and spiritual warriors of their tribe, they are rarely encountered in civilized areas. The exception is when one is on a quest, their tribe has been destroyed, or one has been exiled from their tribe.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Barbarian">>
/***
|Name|BetterSyncPlugin|
|Created by|JeffSheets|
|Version|0.1|
|Requires|~TW2.2.4|
!Description:
Modifies the backstage synchronization system to give feedback when a tiddler has no update from the server.
!History
*07-11-07: version 0.1: First Update of the Sync system.
!Code
***/
//{{{
config.macros.sync.syncStatusList.unchangedServer = {text: "Unchanged on Server", color: '#808080'};
config.macros.sync.createSyncTask = function(syncItem)
{
var st = {};
st.serverType = syncItem.serverType;
st.serverHost = syncItem.serverHost;
st.serverWorkspace = syncItem.serverWorkspace;
st.syncItems = [syncItem];
st.syncMachine = new SyncMachine(st.serverType,{
start: function() {
return this.openHost(st.serverHost,"openWorkspace");
},
openWorkspace: function() {
return this.openWorkspace(st.serverWorkspace,"getTiddlerList");
},
getTiddlerList: function() {
return this.getTiddlerList("gotTiddlerList");
},
gotTiddlerList: function(tiddlers) {
for(var t=0; t<st.syncItems.length; t++) {
var si = st.syncItems[t];
var f = tiddlers.findByField("title",si.title);
if(f !== null) {
if(tiddlers[f].fields['server.page.revision'] > si.tiddler.fields['server.page.revision']) {
si.syncStatus = config.macros.sync.syncStatusList[si.isTouched ? 'changedBoth' : 'changedServer'];
} else {
si.syncStatus = config.macros.sync.syncStatusList.unchangedServer;
}
} else {
si.syncStatus = config.macros.sync.syncStatusList.notFound;
}
config.macros.sync.updateSyncStatus(si);
}
},
getTiddler: function(title) {
return this.getTiddler(title,"onGetTiddler");
},
onGetTiddler: function(tiddler) {
var syncItem = st.syncItems.findByField("title",tiddler.title);
if(syncItem !== null) {
syncItem = st.syncItems[syncItem];
store.saveTiddler(tiddler.title, tiddler.title, tiddler.text, tiddler.modifier, tiddler.modified, tiddler.tags, tiddler.fields, true, tiddler.created);
syncItem.syncStatus = config.macros.sync.syncStatusList.gotFromServer;
config.macros.sync.updateSyncStatus(syncItem);
}
},
putTiddler: function(tiddler) {
return this.putTiddler(tiddler,"onPutTiddler");
},
onPutTiddler: function(tiddler) {
var syncItem = st.syncItems.findByField("title",tiddler.title);
if(syncItem !== null) {
syncItem = st.syncItems[syncItem];
store.resetTiddler(tiddler.title);
syncItem.syncStatus = config.macros.sync.syncStatusList.putToServer;
config.macros.sync.updateSyncStatus(syncItem);
}
}
});
st.syncMachine.go();
return st;
};
//}}}
/***
|Name|BetterTimelineMacro|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#BetterTimelineMacro|
|Version|0.5 beta|
|Requires|~TW2.x|
!!!Description:
A replacement for the core timeline macro that offers more features:
*list tiddlers with only specfic tag
*exclude tiddlers with a particular tag
*limit entries to any number of days, for example one week
*specify a start date for the timeline, only tiddlers after that date will be listed.
!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
Edit the ViewTemplate to add the fullscreen command to the toolbar.
!!!Syntax:
{{{<<timeline better:true>>}}}
''the param better:true enables the advanced features, without it you will get the old timeline behaviour.''
additonal params:
(use only the ones you want)
{{{<<timeline better:true onlyTag:Tag1 excludeTag:Tag2 sortBy:modified/created firstDay:YYYYMMDD maxDays:7 maxEntries:30>>}}}
''explanation of syntax:''
onlyTag: only tiddlers with this tag will be listed. Default is to list all tiddlers.
excludeTag: tiddlers with this tag will not be listed.
sortBy: sort tiddlers by date modified or date created. Possible values are modified or created.
firstDay: useful for starting timeline from a specific date. Example: 20060701 for 1st of July, 2006
maxDays: limits timeline to include only tiddlers from the specified number of days. If you use a value of 7 for example, only tiddlers from the last 7 days will be listed.
maxEntries: limit the total number of entries in the timeline.
!!!History:
*28-07-06: ver 0.5 beta, first release
!!!Code
***/
//{{{
// Return the tiddlers as a sorted array
TiddlyWiki.prototype.getTiddlers = function(field,excludeTag,includeTag)
{
var results = [];
this.forEachTiddler(function(title,tiddler)
{
if(excludeTag == undefined || tiddler.tags.find(excludeTag) == null)
if(includeTag == undefined || tiddler.tags.find(includeTag)!=null)
results.push(tiddler);
});
if(field)
results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
return results;
}
//this function by Udo
function getParam(params, name, defaultValue)
{
if (!params)
return defaultValue;
var p = params[0][name];
return p ? p[0] : defaultValue;
}
window.old_timeline_handler= config.macros.timeline.handler;
config.macros.timeline.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var args = paramString.parseParams("list",null,true);
var betterMode = getParam(args, "better", "false");
if (betterMode == 'true')
{
var sortBy = getParam(args,"sortBy","modified");
var excludeTag = getParam(args,"excludeTag",undefined);
var includeTag = getParam(args,"onlyTag",undefined);
var tiddlers = store.getTiddlers(sortBy,excludeTag,includeTag);
var firstDayParam = getParam(args,"firstDay",undefined);
var firstDay = (firstDayParam!=undefined)? firstDayParam: "00010101";
var lastDay = "";
var field= sortBy;
var maxDaysParam = getParam(args,"maxDays",undefined);
var maxDays = (maxDaysParam!=undefined)? maxDaysParam*24*60*60*1000: (new Date()).getTime() ;
var maxEntries = getParam(args,"maxEntries",undefined);
var last = (maxEntries!=undefined) ? tiddlers.length-Math.min(tiddlers.length,parseInt(maxEntries)) : 0;
for(var t=tiddlers.length-1; t>=last; t--)
{
var tiddler = tiddlers[t];
var theDay = tiddler[field].convertToLocalYYYYMMDDHHMM().substr(0,8);
if ((theDay>=firstDay)&& (tiddler[field].getTime()> (new Date()).getTime() - maxDays))
{
if(theDay != lastDay)
{
var theDateList = document.createElement("ul");
place.appendChild(theDateList);
createTiddlyElement(theDateList,"li",null,"listTitle",tiddler[field].formatString(this.dateFormat));
lastDay = theDay;
}
var theDateListItem = createTiddlyElement(theDateList,"li",null,"listLink",null);
theDateListItem.appendChild(createTiddlyLink(place,tiddler.title,true));
}
}
}
else
{
window.old_timeline_handler.apply(this,arguments);
}
}
//}}}
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://tiddlywiki.bidix.info/|
|''Description:''|Repository for BidiX's TiddlyWiki Extensions|
|''Author:''|BidiX|
|''Workspace:''|(default)|
Spoken by the [[Zulavic]]s of northeast [[Zulavya]]. Speakers of Bishoy can make an Intelligence check at a DC of 28 to understand a sentence of [[Zulavic]], [[Zdomishtiy]] or [[Protsadiy]].
Spoken in the [[Pavanno]] nation of [[Delune]], and somewhat related to [[Pavani]]. A speaker of Biyami can make an Intelligence check at a DC of 28 to understand a sentence of Pavani, and at DC 30 to understand a sentence of [[Anuyi]].
The year, through extensive calculations among the Psions of [[Iluana]] and [[Nethra Naddi]] has been determined to be an amazingly unique 360 days long. The seasons are approximately 120 days long. The [[moon|Lia - The Moon]] runs through its phases in just under 27 days.
[[Zulavic]] calculations of the year split the year into about 13^^1^^/~~2~~ months, with the occasional necessary corrections. Each other year finishes the previous year's extra month. The remainder of the world uses, instead, a simpler calendar, splitting the year into twelve months of 30 days long, and simply predicting the phases of the moon each year. The "week" in non Zulavic lands is almost exclusively 6 days long.
/***
|Name|CalendarPlugin|
|Source|http://www.TiddlyTools.com/#CalendarPlugin|
|Version|0.0.0|
|Author|SteveRumsby|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|monthly and yearly calendars|
// // updated by Jeremy Sheeley to add cacheing for reminders
// // see http://www.geocities.com/allredfaq/reminderMacros.html
// // ''Changes by ELS 2006.08.23:''
// // added handling for weeknumbers (code supplied by Martin Budden. see "wn**" comment marks)
// // ''Changes by ELS 2005.10.30:''
// // config.macros.calendar.handler()
// // ^^use "tbody" element for IE compatibility^^
// // ^^IE returns 2005 for current year, FF returns 105... fix year adjustment accordingly^^
// // createCalendarDays()
// // ^^use showDate() function (if defined) to render autostyled date with linked popup^^
// // calendar stylesheet definition
// // ^^use .calendar class-specific selectors, add text centering and margin settings^^
!!!!!Configuration:
<<option chkDisplayWeekNumbers>> Display week numbers //(note: Monday will be used as the start of the week)//
|''First day of week:''|<<option txtCalFirstDay>>|(Monday = 0, Sunday = 6)|
|''First day of weekend:''|<<option txtCalStartOfWeekend>>|(Monday = 0, Sunday = 6)|
!!!!!Syntax:
|{{{<<calendar>>}}}|Produce a full-year calendar for the current year|
|{{{<<calendar year>>}}}|Produce a full-year calendar for the given year|
|{{{<<calendar year month>>}}}|Produce a one-month calendar for the given month and year|
|{{{<<calendar thismonth>>}}}|Produce a one-month calendar for the current month|
|{{{<<calendar lastmonth>>}}}|Produce a one-month calendar for last month|
|{{{<<calendar nextmonth>>}}}|Produce a one-month calendar for next month|
***/
// //Modify this section to change the text displayed for the month and day names, to a different language for example. You can also change the format of the tiddler names linked to from each date, and the colours used.
//{{{
config.macros.calendar = {};
config.macros.calendar.monthnames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
config.macros.calendar.daynames = ["M", "T", "W", "T", "F", "S", "S"];
config.macros.calendar.weekendbg = "#c0c0c0";
config.macros.calendar.monthbg = "#e0e0e0";
config.macros.calendar.holidaybg = "#ffc0c0";
//}}}
// //''Code section:''
// (you should not need to alter anything below here)//
//{{{
if(config.options.txtCalFirstDay == undefined)
config.options.txtCalFirstDay = 0;
if(config.options.txtCalStartOfWeekend == undefined)
config.options.txtCalStartOfWeekend = 5;
if(config.options.chkDisplayWeekNumbers == undefined)//wn**
config.options.chkDisplayWeekNumbers = false;
if(config.options.chkDisplayWeekNumbers)
config.options.txtCalFirstDay = 0;
config.macros.calendar.tiddlerformat = "0DD/0MM/YYYY"; // This used to be changeable - for now, it isn't// <<smiley :-(>>
version.extensions.calendar = { major: 0, minor: 6, revision: 0, date: new Date(2006, 1, 22)};
config.macros.calendar.monthdays = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
config.macros.calendar.holidays = [ ]; // Not sure this is required anymore - use reminders instead
//}}}
// //Is the given date a holiday?
//{{{
function calendarIsHoliday(date)
{
var longHoliday = date.formatString("0DD/0MM/YYYY");
var shortHoliday = date.formatString("0DD/0MM");
for(var i = 0; i < config.macros.calendar.holidays.length; i++) {
if(config.macros.calendar.holidays[i] == longHoliday || config.macros.calendar.holidays[i] == shortHoliday) {
return true;
}
}
return false;
}
//}}}
// //The main entry point - the macro handler.
// //Decide what sort of calendar we are creating (month or year, and which month or year)
// // Create the main calendar container and pass that to sub-ordinate functions to create the structure.
// ELS 2005.10.30: added creation and use of "tbody" for IE compatibility and fixup for year >1900//
// ELS 2005.10.30: fix year calculation for IE's getYear() function (which returns '2005' instead of '105')//
// ELS 2006.05.29: add journalDateFmt handling//
//{{{
config.macros.calendar.handler = function(place,macroName,params)
{
var calendar = createTiddlyElement(place, "table", null, "calendar", null);
var tbody = createTiddlyElement(calendar, "tbody", null, null, null);
var today = new Date();
var year = today.getYear();
if (year<1900) year+=1900;
// get format for journal link by reading from SideBarOptions (ELS 5/29/06 - based on suggestion by Martin Budden)
var text = store.getTiddlerText("SideBarOptions");
this.journalDateFmt = "DD-MMM-YYYY";
var re = new RegExp("<<(?:newJournal)([^>]*)>>","mg"); var fm = re.exec(text);
if (fm && fm[1]!=null) { var pa=fm[1].readMacroParams(); if (pa[0]) this.journalDateFmt = pa[0]; }
if (params[0] == "thismonth")
{
cacheReminders(new Date(year, today.getMonth(), 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, today.getMonth());
}
else if (params[0] == "lastmonth") {
var month = today.getMonth()-1; if (month==-1) { month=11; year--; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else if (params[0] == "nextmonth") {
var month = today.getMonth()+1; if (month>11) { month=0; year++; }
cacheReminders(new Date(year, month, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, month);
}
else {
if (params[0]) year = params[0];
if(params[1])
{
cacheReminders(new Date(year, params[1]-1, 1, 0, 0), 31);
createCalendarOneMonth(tbody, year, params[1]-1);
}
else
{
cacheReminders(new Date(year, 0, 1, 0, 0), 366);
createCalendarYear(tbody, year);
}
}
window.reminderCacheForCalendar = null;
}
//}}}
//{{{
//This global variable is used to store reminders that have been cached
//while the calendar is being rendered. It will be renulled after the calendar is fully rendered.
window.reminderCacheForCalendar = null;
//}}}
//{{{
function cacheReminders(date, leadtime)
{
if (window.findTiddlersWithReminders == null)
return;
window.reminderCacheForCalendar = {};
var leadtimeHash = [];
leadtimeHash [0] = 0;
leadtimeHash [1] = leadtime;
var t = findTiddlersWithReminders(date, leadtimeHash, null, 1);
for(var i = 0; i < t.length; i++) {
//just tag it in the cache, so that when we're drawing days, we can bold this one.
window.reminderCacheForCalendar[t[i]["matchedDate"]] = "reminder:" + t[i]["params"]["title"];
}
}
//}}}
//{{{
function createCalendarOneMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, true, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarMonth(calendar, year, mon)
{
var row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarMonthHeader(calendar, row, config.macros.calendar.monthnames[mon] + " " + year, false, year, mon);
row = createTiddlyElement(calendar, "tr", null, null, null);
createCalendarDayHeader(row, 1);
createCalendarDayRowsSingle(calendar, year, mon);
}
//}}}
//{{{
function createCalendarYear(calendar, year)
{
var row;
row = createTiddlyElement(calendar, "tr", null, null, null);
var back = createTiddlyElement(row, "td", null, null, null);
var backHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, year-1);
};
createTiddlyButton(back, "<", "Previous year", backHandler);
back.align = "center";
var yearHeader = createTiddlyElement(row, "td", null, "calendarYear", year);
yearHeader.align = "center";
//yearHeader.setAttribute("colSpan", 19);
yearHeader.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?22:19);//wn**
var fwd = createTiddlyElement(row, "td", null, null, null);
var fwdHandler = function() {
removeChildren(calendar);
createCalendarYear(calendar, year+1);
};
createTiddlyButton(fwd, ">", "Next year", fwdHandler);
fwd.align = "center";
createCalendarMonthRow(calendar, year, 0);
createCalendarMonthRow(calendar, year, 3);
createCalendarMonthRow(calendar, year, 6);
createCalendarMonthRow(calendar, year, 9);
}
//}}}
//{{{
function createCalendarMonthRow(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+1], false, year, mon);
createCalendarMonthHeader(cal, row, config.macros.calendar.monthnames[mon+2], false, year, mon);
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDayHeader(row, 3);
createCalendarDayRows(cal, year, mon);
}
//}}}
//{{{
function createCalendarMonthHeader(cal, row, name, nav, year, mon)
{
var month;
if(nav) {
var back = createTiddlyElement(row, "td", null, null, null);
back.align = "center";
back.style.background = config.macros.calendar.monthbg;
/*
back.setAttribute("colSpan", 2);
var backYearHandler = function() {
var newyear = year-1;
removeChildren(cal);
cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, mon);
};
createTiddlyButton(back, "<<", "Previous year", backYearHandler);
*/
var backMonHandler = function() {
var newyear = year;
var newmon = mon-1;
if(newmon == -1) { newmon = 11; newyear = newyear-1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
};
createTiddlyButton(back, "<", "Previous month", backMonHandler);
month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
// month.setAttribute("colSpan", 3);
// month.setAttribute("colSpan", 5);
month.setAttribute("colSpan", config.options.chkDisplayWeekNumbers?6:5);//wn**
var fwd = createTiddlyElement(row, "td", null, null, null);
fwd.align = "center";
fwd.style.background = config.macros.calendar.monthbg;
// fwd.setAttribute("colSpan", 2);
var fwdMonHandler = function() {
var newyear = year;
var newmon = mon+1;
if(newmon == 12) { newmon = 0; newyear = newyear+1;}
removeChildren(cal);
cacheReminders(new Date(newyear, newmon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, newmon);
};
createTiddlyButton(fwd, ">", "Next month", fwdMonHandler);
/*
var fwdYear = createTiddlyElement(row, "td", null, null, null);
var fwdYearHandler = function() {
var newyear = year+1;
removeChildren(cal);
cacheReminders(new Date(newyear, mon , 1, 0, 0), 31);
createCalendarOneMonth(cal, newyear, mon);
};
createTiddlyButton(fwd, ">>", "Next year", fwdYearHandler);
*/
} else {
month = createTiddlyElement(row, "td", null, "calendarMonthname", name)
//month.setAttribute("colSpan", 7);
month.setAttribute("colSpan",config.options.chkDisplayWeekNumbers?8:7);//wn**
}
month.align = "center";
month.style.background = config.macros.calendar.monthbg;
}
//}}}
//{{{
function createCalendarDayHeader(row, num)
{
var cell;
for(var i = 0; i < num; i++) {
if (config.options.chkDisplayWeekNumbers) createTiddlyElement(row, "td");//wn**
for(var j = 0; j < 7; j++) {
var d = j + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
cell = createTiddlyElement(row, "td", null, null, config.macros.calendar.daynames[d]);
if(d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))
cell.style.background = config.macros.calendar.weekendbg;
}
}
}
//}}}
//{{{
function createCalendarDays(row, col, first, max, year, mon)
{
var i;
if (config.options.chkDisplayWeekNumbers){
if (first<=max) {
var ww = new Date(year,mon,first);
createTiddlyElement(row, "td", null, null, "w"+ww.getWeek());//wn**
}
else createTiddlyElement(row, "td", null, null, null);//wn**
}
for(i = 0; i < col; i++) {
createTiddlyElement(row, "td", null, null, null);
}
var day = first;
for(i = col; i < 7; i++) {
var d = i + (config.options.txtCalFirstDay - 0);
if(d > 6) d = d - 7;
var daycell = createTiddlyElement(row, "td", null, null, null);
var isaWeekend = ((d == (config.options.txtCalStartOfWeekend-0) || d == (config.options.txtCalStartOfWeekend-0+1))? true:false);
if(day > 0 && day <= max) {
var celldate = new Date(year, mon, day);
// ELS 2005.10.30: use <<date>> macro's showDate() function to create popup
if (window.showDate) {
showDate(daycell,celldate,"popup","DD",config.macros.calendar.journalDateFmt,true, isaWeekend); // ELS 5/29/06 - use journalDateFmt
} else {
if(isaWeekend) daycell.style.background = config.macros.calendar.weekendbg;
var title = celldate.formatString(config.macros.calendar.tiddlerformat);
if(calendarIsHoliday(celldate)) {
daycell.style.background = config.macros.calendar.holidaybg;
}
if(window.findTiddlersWithReminders == null) {
var link = createTiddlyLink(daycell, title, false);
link.appendChild(document.createTextNode(day));
} else {
var button = createTiddlyButton(daycell, day, title, onClickCalendarDate);
}
}
}
day++;
}
}
//}}}
// //We've clicked on a day in a calendar - create a suitable pop-up of options.
// //The pop-up should contain:
// // * a link to create a new entry for that date
// // * a link to create a new reminder for that date
// // * an <hr>
// // * the list of reminders for that date
//{{{
function onClickCalendarDate(e)
{
var button = this;
var date = button.getAttribute("title");
var dat = new Date(date.substr(6,4), date.substr(3,2)-1, date.substr(0, 2));
date = dat.formatString(config.macros.calendar.tiddlerformat);
var popup = createTiddlerPopup(this);
popup.appendChild(document.createTextNode(date));
var newReminder = function() {
var t = store.getTiddlers(date);
displayTiddler(null, date, 2, null, null, false, false);
if(t) {
document.getElementById("editorBody" + date).value += "\n<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +
" year:" + (dat.getYear()+1900) + " title: >>";
} else {
document.getElementById("editorBody" + date).value = "<<reminder day:" + dat.getDate() +
" month:" + (dat.getMonth()+1) +
" year:" + (dat.getYear()+1900) + " title: >>";
}
};
var link = createTiddlyButton(popup, "New reminder", null, newReminder);
popup.appendChild(document.createElement("hr"));
var t = findTiddlersWithReminders(dat, [0,14], null, 1);
for(var i = 0; i < t.length; i++) {
link = createTiddlyLink(popup, t[i].tiddler, false);
link.appendChild(document.createTextNode(t[i].tiddler));
}
}
//}}}
//{{{
function calendarMaxDays(year, mon)
{
var max = config.macros.calendar.monthdays[mon];
if(mon == 1 && (year % 4) == 0 && ((year % 100) != 0 || (year % 400) == 0)) {
max++;
}
return max;
}
//}}}
//{{{
function createCalendarDayRows(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1 + 7;
var day1 = -first1 + 1;
var first2 = (new Date(year, mon+1, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first2 < 0) first2 = first2 + 7;
var day2 = -first2 + 1;
var first3 = (new Date(year, mon+2, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first3 < 0) first3 = first3 + 7;
var day3 = -first3 + 1;
var max1 = calendarMaxDays(year, mon);
var max2 = calendarMaxDays(year, mon+1);
var max3 = calendarMaxDays(year, mon+2);
while(day1 <= max1 || day2 <= max2 || day3 <= max3) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
createCalendarDays(row, 0, day2, max2, year, mon+1); day2 += 7;
createCalendarDays(row, 0, day3, max3, year, mon+2); day3 += 7;
}
}
//}}}
//{{{
function createCalendarDayRowsSingle(cal, year, mon)
{
var row = createTiddlyElement(cal, "tr", null, null, null);
var first1 = (new Date(year, mon, 1)).getDay() -1 - (config.options.txtCalFirstDay-0);
if(first1 < 0) first1 = first1+ 7;
var day1 = -first1 + 1;
var max1 = calendarMaxDays(year, mon);
while(day1 <= max1) {
row = createTiddlyElement(cal, "tr", null, null, null);
createCalendarDays(row, 0, day1, max1, year, mon); day1 += 7;
}
}
//}}}
// //ELS 2005.10.30: added styles
//{{{
setStylesheet(".calendar, .calendar table, .calendar th, .calendar tr, .calendar td { text-align:center; } .calendar, .calendar a { margin:0px !important; padding:0px !important; }", "calendarStyles");
//}}}
Citizens live fairly comfortable lives in fortified cities, exposing them to many people, and requiring a bit greater skill when shopping. Few Citizens make use of riding animals, and rarely need survival skills.
''Prerequisite:'' Must choose to be a [[Fighter]], [[Psychic Warrior]], [[Rogue]]. Cannot be a [[Zulavic]].
''Bonus:'' You get a +1 bonus on all Appraise and Diplomacy checks.
''Penalty:'' You have a -1 penalty on all Survival and Ride checks.
/***
|''Name:''|CloseUnsavedOnCancel|
|''Version:''|2.0.8 (16-Apr-2006)|
|''Author:''|SimonBaird|
|''Adapted By:''|[[Jack]]|
|''Type:''|Plugin|
!Description
When you click new tiddler then click cancel I think the new tiddler should close automatically. This plugin implements that behaviour.
!Revision History
* 1.0.1 (11-Oct-2005) by SimonBaird
* 2.0.8 Made 2.0.x compatible by Jack on 16-Apr-2006
!Code
***/
//{{{
config.commands.cancelTiddler.handler = function(event,src,title) {
if(story.hasChanges(title) && !readOnly)
if(!confirm(this.warning.format([title])))
return false;
story.setDirty(title,false);
if (!store.tiddlerExists(title) || store.fetchTiddler(title).modifier==config.views.wikified.defaultModifier) {
story.closeTiddler(title,false);
store.removeTiddler(title)
} else {
story.displayTiddler(null,title);
}
return false;
}
//}}}
Coastal Villagers make their living from the seas, bringing in fish for the cities and dealing commonly with merchants. However, few are accustomed to handling domesticated animals, and the politics of the ruling class rarely affect their lives.
''Prerequisite:'' Must choose to be a [[Fighter]], [[Psychic Warrior]], or [[Rogue]]. Also cannot be a [[Zulavic]].
''Bonus:'' You get a +1 bonus on all Survival and Swim checks.
''Penalty:'' You have a -1 penalty on all Knowledge (Nobility and royalty) and Handle Animal checks.
Background: #fff
Foreground: #000
PrimaryPale: #f00
PrimaryLight: #a00
PrimaryMid: #500
PrimaryDark: #000
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
!Items
[[Glowglobe]]
!The Heavens
[[Lia - The Moon]]
!Time
[[Calendar]]
Player Characters have a pool of Conviction, which functions like Action points. All ~PCs get 6 Conviction. Conviction is replenished at the beginning of each 4-hour session. ~Play-by-Post, -Email, etc. may use a different system, but it is expected that Conviction will replenish at an appropriate pace relative to the communication rate of the game.
Conviction can be used per the table below:
|!Cost|!Result|
| 1 |Roll twice, keeping the best roll^^1^^|
| 2 |Re-roll^^2^^|
| 2 |Take an extra move-equivalent action^^3^^|
| 3 |Take an extra standard action^^3^^|
|>|^^1^^ Declare before any roll|
|>|^^2^^ Declare after any roll, can be used multiple times for multiple re-rolls,|
|>|^^3^^ On your turn only|
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Quickly create a copy of any existing tiddler|
!!!!!Usage
<<<
View a tiddler and select the "copy" toolbar item. A new tiddler editor is opened with a title of "Copy of TiddlerName" containing copies of the text/tags from the original tiddler. Note: If select the "copy" toolbar item while //editing// a tiddler, the current values of the text/tags that are displayed in the existing tiddler editor are used (including any unsaved changes you may have made to those values).
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''CopyTiddlerPlugin'' (tagged with <<tag systemConfig>>)
* When using the default (shadow) EditTemplate, the plugin automatically updates the template to include the ''copyTiddler'' toolbar command.
* If you have created a custom EditTemplate tiddler, you will need to manually add the ''copyTiddler'' toolbar command to your existing template toolbar definition.
* If you add ''copyTiddler'' to the ViewTemplate toolbar definition, the ''copy'' toolbar command will also appear when viewing a tiddler.
{{{
<!-- add 'copyTiddler' command to existing toolbar definition -->
<div class='toolbar' macro='toolbar ... copyTiddler ... '>
}}}
<<<
!!!!!Revisions
<<<
''2007.06.28 [3.0.0]'' complete re-write to handle custom fields and alternative view/edit templates
''2007.05.17 [2.1.2]'' use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode
''2007.04.01 [2.1.1]'' in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=="text" attribute
''2007.02.05 [2.1.0]'' in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields. Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)
''2006.12.12 [2.0.0]'' completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.
''2005.xx.xx [1.0.0]'' original version by Tim Morgan
<<<
!!!!!Credits
>This feature was originally developed by Tim Morgan. Current version developed by EricShulman from [[ELS Design Studios|http://www.elsdesign.com]]
!!!!!Code
***/
//{{{
version.extensions.copyTiddler= {major: 3, minor: 0, revision: 0, date: new Date(2007,6,28)};
// automatically tweak shadow EditTemplate to add "copyTiddler" toolbar command (following "cancelTiddler")
config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/cancelTiddler/,"cancelTiddler copyTiddler");
config.commands.copyTiddler = {
text: 'copy',
hideReadOnly: true,
tooltip: 'Make a copy of this tiddler',
prefix: "Copy of ",
handler: function(event,src,title) {
var tiddlerElem=document.getElementById(story.idPrefix+title); // current tiddler element
var template=tiddlerElem.getAttribute("template") // current tiddler template
var newTitle = this.prefix+title; // add "copy of" to create new tiddler title
if (!story.isDirty(title)) { // if existing tiddler is being VIEWED (not EDITED)
// duplicate existing stored tiddler (and clear "changecount")
var tid=store.getTiddler(title);
store.saveTiddler(newTitle,newTitle,tid.text,config.options.txtUserName,new Date(),tid.tags, tid.fields, true);
// display new tiddler using same view template as current tiddler
story.displayTiddler(story.findContainingTiddler(src),newTitle,template);
} else {
// display new tiddler editor using same editor template as current tiddler
story.displayTiddler(story.findContainingTiddler(src),newTitle,template);
// get fields from current tiddler editor
var fields=config.commands.copyTiddler.gatherFields(tiddlerElem);
// set fields in new editor
var newTiddlerElem = document.getElementById(story.idPrefix+newTitle);
for (var f=0; f<fields.length; f++) {
if (fields[f].name=="title") fields[f].value=newTitle; // rename title in new tiddler
var fieldElem=config.commands.copyTiddler.findField(newTiddlerElem,fields[f].name);
if (fieldElem) {
if (fieldElem.getAttribute("type")=="checkbox")
fieldElem.checked=fields[f].value;
else
fieldElem.value=fields[f].value;
}
}
}
story.focusTiddler(newTitle,"title");
return false;
},
findField: function(tiddlerElem,field) {
var inputs=tiddlerElem.getElementsByTagName("input");
for (var i=0; i<inputs.length; i++) {
if (inputs[i].getAttribute("type")=="checkbox" && inputs[i].field == field) return inputs[i];
if (inputs[i].getAttribute("type")=="text" && inputs[i].getAttribute("edit") == field) return inputs[i];
}
var tas=tiddlerElem.getElementsByTagName("textarea");
for (var i=0; i<tas.length; i++) if (tas[i].getAttribute("edit") == field) return tas[i];
var sels=tiddlerElem.getElementsByTagName("select");
for (var i=0; i<sels.length; i++) if (sels[i].getAttribute("edit") == field) return sels[i];
return null;
},
gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
var fields=[];
// get checkboxes and edit fields
var inputs=tiddlerElem.getElementsByTagName("input");
for (var i=0; i<inputs.length; i++) {
if (inputs[i].getAttribute("type")=="checkbox")
if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
if (inputs[i].getAttribute("type")=="text")
if (inputs[i].getAttribute("edit")) fields.push({name:inputs[i].getAttribute("edit"),value:inputs[i].value});
}
// get textareas (multi-line edit fields)
var tas=tiddlerElem.getElementsByTagName("textarea");
for (var i=0; i<tas.length; i++)
if (tas[i].getAttribute("edit")) fields.push({name:tas[i].getAttribute("edit"),value:tas[i].value});
// get selection lists (droplist or listbox)
var sels=tiddlerElem.getElementsByTagName("select");
for (var i=0; i<sels.length; i++)
if (sels[i].getAttribute("edit")) fields.push({name:sels[i].getAttribute("edit"),value:sels[i].value});
return fields;
}
};
//}}}
Dassura's territory is the most fertile land of [[Dassura Isle]], covering 353,390 square miles. Dassura, along with [[Elarnuz]] controls the passage of ships between the world-sea and the [[Sea of Imneru]]. Dassuran merchant ships also travel far and wide to bring [[Elarnuz]] glass to the farthest reaches of the world.
!Environment
!Provinces
!Relations
!Economy
!History
!Culture
{{mapfloat{
[img[http://img255.imageshack.us/img255/5246/dassuraislelj7.jpg]]
}}}
The smallest region of the known world, Dassura Isle is located east of the [[Nethrini Peninsula]] and southwest of the south reaches of the [[Pavana Coast]]. 630,100 square miles.
!!Nations
[[Amateth]]
[[Dassura]]
[[Elarnuz]]
!!Subrace
[[Nesherim]]
/***
|Name|DatePlugin|
|Source|http://www.TiddlyTools.com/#DatePlugin|
|Version|2.3.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|formatted dates plus popup menu with 'journal' link, changes and (optional) reminders|
There are quite a few calendar generators, reminders, to-do lists, 'dated tiddlers' journals, blog-makers and GTD-like schedule managers that have been built around TW. While they all have different purposes, and vary in format, interaction, and style, in one way or another each of these plugins displays and/or uses date-based information to make finding, accessing and managing relevant tiddlers easier. This plugin provides a general approach to embedding dates and date-based links/menus within tiddler content.
This plugin display formatted dates, for the specified year, month, day using number values or mathematical expressions such as (Y+1) or (D+30). Optionally, you can create a link from the formatted output to a 'dated tiddler' for quick blogging or create a popup menu that includes the dated tiddler link plus links to changes made on that date as well as links to any pending reminders for the coming 31 days (if the RemindersPlugin is installed). This plugin also provides a public API for easily incorporating formatted date output (with or without the links/popups) into other plugins, such as calendar generators, etc.
!!!!!Usage
<<<
When installed, this plugin defines a macro: {{{<<date [mode] [date] [format] [linkformat]>>}}}. All of the macro parameters are optional and, in it's simplest form, {{{<<date>>}}}, it is equivalent to the ~TiddlyWiki core macro, {{{<<today>>}}}.
However, where {{{<<today>>}}} simply inserts the current date/time in a predefined format (or custom format, using {{{<<today [format]>>}}}), the {{{<<date>>}}} macro's parameters take it much further than that:
* [mode] is either ''display'', ''link'' or ''popup''. If omitted, it defaults to ''display''. This param let's you select between simply displaying a formatted date, or creating a link to a specific 'date titled' tiddler or a popup menu containing a dated tiddler link, plus links to changes and reminders.
* [date] lets you enter ANY date (not just today) as ''year, month, and day values or simple mathematical expressions'' using pre-defined variables, Y, M, and D for the current year, month and day, repectively. You can display the modification date of the current tiddler by using the keyword: ''tiddler'' in place of the year, month and day parameters. Use ''tiddler://name-of-tiddler//'' to display the modification date of a specific tiddler. You can also use keywords ''today'' or ''filedate'' to refer to these //dynamically changing// date/time values.
* [format] and [linkformat] uses standard ~TiddlyWiki date formatting syntax. The default is "YYYY.0MM.0DD"
>^^''DDD'' - day of week in full (eg, "Monday"), ''DD'' - day of month, ''0DD'' - adds leading zero^^
>^^''MMM'' - month in full (eg, "July"), ''MM'' - month number, ''0MM'' - adds leading zero^^
>^^''YYYY'' - full year, ''YY'' - two digit year, ''hh'' - hours, ''mm'' - minutes, ''ss'' - seconds^^
>^^//note: use of hh, mm or ss format codes is only supported with ''tiddler'', ''today'' or ''filedate'' values//^^
* [linkformat] - specify an alternative date format so that the title of a 'dated tiddler' link can have a format that differs from the date's displayed format
In addition to the macro syntax, DatePlugin also provides a public javascript API so that other plugins that work with dates (such as calendar generators, etc.) can quickly incorporate date formatted links or popups into their output:
''{{{showDate(place, date, mode, format, linkformat, autostyle, weekend)}}}''
Note that in addition to the parameters provided by the macro interface, the javascript API also supports two optional true/false parameters:
* [autostyle] - when true, the font/background styles of formatted dates are automatically adjusted to show the date's status: 'today' is boxed, 'changes' are bold, 'reminders' are underlined, while weekends and holidays (as well as changes and reminders) can each have a different background color to make them more visibly distinct from each other.
* [weekend] - true indicates a weekend, false indicates a weekday. When this parameter is omitted, the plugin uses internal defaults to automatically determine when a given date falls on a weekend.
<<<
!!!!!Examples
<<<
The current date: <<date>>
The current time: <<date today "0hh:0mm:0ss">>
Today's blog: <<date link today "DDD, MMM DDth, YYYY">>
Recent blogs/changes/reminders: <<date popup Y M D-1 "yesterday">> <<date popup today "today">> <<date popup Y M D+1 "tomorrow">>
The first day of next month will be a <<date Y M+1 1 "DDD">>
This tiddler (DatePlugin) was last updated on: <<date tiddler "DDD, MMM DDth, YYYY">>
The SiteUrl was last updated on: <<date tiddler:SiteUrl "DDD, MMM DDth, YYYY">>
This document was last saved on <<date filedate "DDD, MMM DDth, YYYY at 0hh:0mm:0ss">>
<<date 2006 07 24 "MMM DDth, YYYY">> will be a <<date 2006 07 24 "DDD">>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''DatePlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.06.20 [2.3.1]'' in onClickDatePopup(), use Popup.show() instead of deprecated ScrollToTiddlerPopup(). Fixes fatal error that prevents popups from being properly displayed
''2007.05.31 [2.3.0]'' list "created" tiddlers in date popup. Also, force re-cache of created/modified indices when displaying current date and store.isDirty(), so that popup is kept in sync with tiddler changes.
''2006.05.09 [2.2.1]'' added "todaybg" handling to set background color of current date. Also, honor excludeLists tag when getting lists of tiddlers. Based on suggestions by Mark Hulme.
''2006.05.05 [2.2.0]'' added "linkedbg" handling to set background color when a 'dated tiddler' exists. Based on a suggestion by Mark Hulme.
''2006.03.08 [2.1.2]'' add 'override leadtime' flag param in call to findTiddlersWithReminders(), and add "Enter a title" default text to new reminder handler. Thanks to Jeremy Sheeley for these additional tweaks.
''2006.03.06 [2.1.0]'' hasReminders() nows uses window.reminderCacheForCalendar[] when present. If calendar cache is not present, indexReminders() now uses findTiddlersWithReminders() with a 90-day look ahead to check for reminders. Also, switched default background colors for autostyled dates: reminders are now greenish ("c0ffee") and holidays are now reddish ("ffaace").
''2006.02.14 [2.0.5]'' when readOnly is set (by TW core), omit "new reminders..." popup menu item and, if a "dated tiddler" does not already exist, display the date as simple text instead of a link.
''2006.02.05 [2.0.4]'' added var to variables that were unintentionally global. Avoids FireFox 1.5.0.1 crash bug when referencing global variables
''2006.01.18 [2.0.3]'' In 1.2.x the tiddler editor's text area control was given an element ID=("tiddlerBody"+title), so that it was easy to locate this field and programmatically modify its content. With the addition of configuration templates in 2.x, the textarea no longer has an ID assigned. To find this control we now look through all the child nodes of the tiddler editor to locate a "textarea" control where attribute("edit") equals "text", and then append the new reminder to the contents of that control.
''2006.01.11 [2.0.2]'' correct 'weekend' override detection logic in showDate()
''2006.01.10 [2.0.1]'' allow custom-defined weekend days (default defined in config.macros.date.weekend[] array)
added flag param to showDate() API to override internal weekend[] array
''2005.12.27 [2.0.0]'' Update for TW2.0
Added parameter handling for 'linkformat'
''2005.12.21 [1.2.2]'' FF's date.getYear() function returns 105 (for the current year, 2005). When calculating a date value from Y M and D expressions, the plugin adds 1900 to the returned year value get the current year number. But IE's date.getYear() already returns 2005. As a result, plugin calculated date values on IE were incorrect (e.g., 3905 instead of 2005). Adding +1900 is now conditional so the values will be correct on both browsers.
''2005.11.07 [1.2.1]'' added support for "tiddler" dynamic date parameter
''2005.11.06 [1.2.0]'' added support for "tiddler:title" dynamic date parameter
''2005.11.03 [1.1.2]'' when a reminder doesn't have a specified title parameter, use the title of the tiddler that contains the reminder as "fallback" text in the popup menu. Based on a suggestion from BenjaminKudria.
''2005.11.03 [1.1.1]'' Temporarily bypass hasReminders() logic to avoid excessive overhead from generating the indexReminders() cache. While reminders can still appear in the popup menu, they just won't be indicated by auto-styling the date number that is displayed. This single change saves approx. 60% overhead (5 second delay reduced to under 2 seconds).
''2005.11.01 [1.1.0]'' corrected logic in hasModifieds() and hasReminders() so caching of indexed modifieds and reminders is done just once, as intended. This should hopefully speed up calendar generators and other plugins that render multiple dates...
''2005.10.31 [1.0.1]'' documentation and code cleanup
''2005.10.31 [1.0.0]'' initial public release
''2005.10.30 [0.9.0]'' pre-release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.date = {major: 2, minor: 3, revision: 1, date: new Date(2007,6,20)};
//}}}
//{{{
config.macros.date = {
format: "YYYY.0MM.0DD", // default date display format
linkformat: "YYYY.0MM.0DD", // 'dated tiddler' link format
linkedbg: "#babb1e", // "babble"
todaybg: "#ffab1e", // "fable"
weekendbg: "#c0c0c0", // "cocoa"
holidaybg: "#ffaace", // "face"
createdbg: "#bbeeff", // "beef"
modifiedsbg: "#bbeeff", // "beef"
remindersbg: "#c0ffee", // "coffee"
holidays: [ "01/01", "07/04", "07/24", "11/24" ], // NewYearsDay, IndependenceDay(US), Eric's Birthday (hooray!), Thanksgiving(US)
weekend: [ 1,0,0,0,0,0,1 ] // [ day index values: sun=0, mon=1, tue=2, wed=3, thu=4, fri=5, sat=6 ]
};
//}}}
//{{{
config.macros.date.handler = function(place,macroName,params)
{
// do we want to see a link, a popup, or just a formatted date?
var mode="display";
if (params[0]=="display") { mode=params[0]; params.shift(); }
if (params[0]=="popup") { mode=params[0]; params.shift(); }
if (params[0]=="link") { mode=params[0]; params.shift(); }
// get the date
var now = new Date();
var date = now;
if (!params[0] || params[0]=="today")
{ params.shift(); }
else if (params[0]=="filedate")
{ date=new Date(document.lastModified); params.shift(); }
else if (params[0]=="tiddler")
{ date=store.getTiddler(story.findContainingTiddler(place).id.substr(7)).modified; params.shift(); }
else if (params[0].substr(0,8)=="tiddler:")
{ var t; if ((t=store.getTiddler(params[0].substr(8)))) date=t.modified; params.shift(); }
else {
var y = eval(params.shift().replace(/Y/ig,(now.getYear()<1900)?now.getYear()+1900:now.getYear()));
var m = eval(params.shift().replace(/M/ig,now.getMonth()+1));
var d = eval(params.shift().replace(/D/ig,now.getDate()+0));
date = new Date(y,m-1,d);
}
// date format with optional custom override
var format=this.format; if (params[0]) format=params.shift();
var linkformat=this.linkformat; if (params[0]) linkformat=params.shift();
showDate(place,date,mode,format,linkformat);
}
//}}}
//{{{
window.showDate=showDate;
function showDate(place,date,mode,format,linkformat,autostyle,weekend)
{
if (!mode) mode="display";
if (!format) format=config.macros.date.format;
if (!linkformat) linkformat=config.macros.date.linkformat;
if (!autostyle) autostyle=false;
// format the date output
var title = date.formatString(format);
var linkto = date.formatString(linkformat);
// just show the formatted output
if (mode=="display") { place.appendChild(document.createTextNode(title)); return; }
// link to a 'dated tiddler'
var link = createTiddlyLink(place, linkto, false);
link.appendChild(document.createTextNode(title));
link.title = linkto;
link.date = date;
link.format = format;
link.linkformat = linkformat;
// if using a popup menu, replace click handler for dated tiddler link
// with handler for popup and make link text non-italic (i.e., an 'existing link' look)
if (mode=="popup") {
link.onclick = onClickDatePopup;
link.style.fontStyle="normal";
}
// format the popup link to show what kind of info it contains (for use with calendar generators)
if (!autostyle) return;
if (hasModifieds(date)||hasCreateds(date))
{ link.style.fontStyle="normal"; link.style.fontWeight="bold"; }
if (hasReminders(date))
{ link.style.textDecoration="underline"; }
if(isToday(date))
{ link.style.border="1px solid black"; }
if( (weekend!=undefined?weekend:isWeekend(date)) && (config.macros.date.weekendbg!="") )
{ place.style.background = config.macros.date.weekendbg; }
if(isHoliday(date)&&(config.macros.date.holidaybg!=""))
{ place.style.background = config.macros.date.holidaybg; }
if (hasCreateds(date)&&(config.macros.date.createdbg!=""))
{ place.style.background = config.macros.date.createdbg; }
if (hasModifieds(date)&&(config.macros.date.modifiedsbg!=""))
{ place.style.background = config.macros.date.modifiedsbg; }
if (store.tiddlerExists(linkto)&&(config.macros.date.linkedbg!=""))
{ place.style.background = config.macros.date.linkedbg; }
if (hasReminders(date)&&(config.macros.date.remindersbg!=""))
{ place.style.background = config.macros.date.remindersbg; }
if(isToday(date)&&(config.macros.date.todaybg!=""))
{ place.style.background = config.macros.date.todaybg; }
}
//}}}
//{{{
function isToday(date) // returns true if date is today
{ var now=new Date(); return ((now-date>=0) && (now-date<86400000)); }
function isWeekend(date) // returns true if date is a weekend
{ return (config.macros.date.weekend[date.getDay()]); }
function isHoliday(date) // returns true if date is a holiday
{
var longHoliday = date.formatString("0MM/0DD/YYYY");
var shortHoliday = date.formatString("0MM/0DD");
for(var i = 0; i < config.macros.date.holidays.length; i++) {
var holiday=config.macros.date.holidays[i];
if (holiday==longHoliday||holiday==shortHoliday) return true;
}
return false;
}
//}}}
//{{{
// Event handler for clicking on a day popup
function onClickDatePopup(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var popup = Popup.create(this);
if(popup) {
// always show dated tiddler link (or just date, if readOnly) at the top...
if (!readOnly || store.tiddlerExists(this.date.formatString(this.linkformat)))
createTiddlyLink(popup,this.date.formatString(this.linkformat),true);
else
createTiddlyText(popup,this.date.formatString(this.linkformat));
addCreatedsToPopup(popup,this.date,this.format);
addModifiedsToPopup(popup,this.date,this.format);
addRemindersToPopup(popup,this.date,this.linkformat);
}
Popup.show(popup,false);
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return(false);
}
//}}}
//{{{
function indexCreateds() // build list of tiddlers, hash indexed by creation date
{
var createds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].created.formatString("YYYY0MM0DD")
if (!createds[date])
createds[date]=new Array();
createds[date].push(tiddlers[t].title);
}
return createds;
}
function hasCreateds(date) // returns true if date has created tiddlers
{
if (!config.macros.date.createds) config.macros.date.createds=indexCreateds();
return (config.macros.date.createds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addCreatedsToPopup(popup,when,format)
{
var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.createds) config.macros.date.createds=indexCreateds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var createds = config.macros.date.createds[when.formatString("YYYY0MM0DD")];
if (createds) {
createds.sort();
var e=createTiddlyElement(popup,"div",null,null,"created:");
for(var t=0; t<createds.length; t++) {
var link=createTiddlyLink(popup,createds[t],false);
link.appendChild(document.createTextNode(indent+createds[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function indexModifieds() // build list of tiddlers, hash indexed by modification date
{
var modifieds= { };
var tiddlers = store.getTiddlers("title","excludeLists");
for (var t = 0; t < tiddlers.length; t++) {
var date = tiddlers[t].modified.formatString("YYYY0MM0DD")
if (!modifieds[date])
modifieds[date]=new Array();
modifieds[date].push(tiddlers[t].title);
}
return modifieds;
}
function hasModifieds(date) // returns true if date has modified tiddlers
{
if (!config.macros.date.modifieds) config.macros.date.modifieds = indexModifieds();
return (config.macros.date.modifieds[date.formatString("YYYY0MM0DD")]!=undefined);
}
function addModifiedsToPopup(popup,when,format)
{
var force=(store.isDirty() && when.formatString("YYYY0MM0DD")==new Date().formatString("YYYY0MM0DD"));
if (force || !config.macros.date.modifieds) config.macros.date.modifieds=indexModifieds();
var indent=String.fromCharCode(160)+String.fromCharCode(160);
var mods = config.macros.date.modifieds[when.formatString("YYYY0MM0DD")];
if (mods) {
mods.sort();
var e=createTiddlyElement(popup,"div",null,null,"changed:");
for(var t=0; t<mods.length; t++) {
var link=createTiddlyLink(popup,mods[t],false);
link.appendChild(document.createTextNode(indent+mods[t]));
createTiddlyElement(popup,"br",null,null,null);
}
}
}
//}}}
//{{{
function indexReminders(date,leadtime) // build list of tiddlers with reminders, hash indexed by reminder date
{
var reminders = { };
if(window.findTiddlersWithReminders!=undefined) { // reminder plugin is installed
// DEBUG var starttime=new Date();
var t = findTiddlersWithReminders(date, [0,leadtime], null, null, 1);
for(var i=0; i<t.length; i++) reminders[t[i].matchedDate]=true;
// DEBUG var out="Found "+t.length+" reminders in "+((new Date())-starttime+1)+"ms\n";
// DEBUG out+="startdate: "+date.toLocaleDateString()+"\n"+"leadtime: "+leadtime+" days\n\n";
// DEBUG for(var i=0; i<t.length; i++) { out+=t[i].matchedDate.toLocaleDateString()+" "+t[i].params.title+"\n"; }
// DEBUG alert(out);
}
return reminders;
}
function hasReminders(date) // returns true if date has reminders
{
if (window.reminderCacheForCalendar)
return window.reminderCacheForCalendar[date]; // use calendar cache
if (!config.macros.date.reminders)
config.macros.date.reminders = indexReminders(date,90); // create a 90-day leadtime reminder cache
return (config.macros.date.reminders[date]);
}
function addRemindersToPopup(popup,when,format)
{
if(window.findTiddlersWithReminders==undefined) return; // reminder plugin not installed
var indent = String.fromCharCode(160)+String.fromCharCode(160);
var reminders=findTiddlersWithReminders(when, [0,31],null,null,1);
var e=createTiddlyElement(popup,"div",null,null,"reminders:"+(!reminders.length?" none":""));
for(var t=0; t<reminders.length; t++) {
link = createTiddlyLink(popup,reminders[t].tiddler,false);
var diff=reminders[t].diff;
diff=(diff<1)?"Today":((diff==1)?"Tomorrow":diff+" days");
var txt=(reminders[t].params["title"])?reminders[t].params["title"]:reminders[t].tiddler;
link.appendChild(document.createTextNode(indent+diff+" - "+txt));
createTiddlyElement(popup,"br",null,null,null);
}
if (readOnly) return; // omit "new reminder..." link
var link = createTiddlyLink(popup,indent+"new reminder...",true); createTiddlyElement(popup,"br");
var title = when.formatString(format);
link.title="add a reminder to '"+title+"'";
link.onclick = function() {
// show tiddler editor
story.displayTiddler(null, title, 2, null, null, false, false);
// find body 'textarea'
var c =document.getElementById("tiddler" + title).getElementsByTagName("*");
for (var i=0; i<c.length; i++) if ((c[i].tagName.toLowerCase()=="textarea") && (c[i].getAttribute("edit")=="text")) break;
// append reminder macro to tiddler content
if (i<c.length) {
if (store.tiddlerExists(title)) c[i].value+="\n"; else c[i].value="";
c[i].value += "<<reminder";
c[i].value += " day:"+when.getDate();
c[i].value += " month:"+(when.getMonth()+1);
c[i].value += " year:"+when.getFullYear();
c[i].value += ' title:"Enter a title" >>';
}
};
}
//}}}
[[Recent Changes]]
[[Introduction]]
{{leftfloat{
|!Total<br>Char.<br>Levels|!A^^1^^|!B^^2^^|!C^^3^^|!D^^4^^|
|1st|+2|+3|+4|+6|
|2nd|+2|+3|+4|+6|
|3rd|+3|+4|+5|+7|
|4th|+3|+4|+5|+7|
|5th|+3|+4|+5|+7|
|6th|+4|+5|+6|+8|
|>|>|>|>|^^1^^ Use column A for monk or psion.|
|>|>|>|>|^^2^^ Use column B for rogue, soulknife, or wilder.|
|>|>|>|>|^^3^^ Use column C for barbarian.|
|>|>|>|>|^^4^^ Use column D for fighter or psychic warrior.|
}}}
Multiclass characters use the column of the class they have the most levels in, and use the best bonus when two (or more) of their classes are of the same level. Thus a Psion5/Fighter1 will still use the A column (a +3 Defense Bonus), but a Psion1/Rogue2/Fighter2 will use column D (a +7 Defense Bonus), and it's likely his next level will not be Rogue (for fear of dropping to a +6 Defense Bonus).
//This change to the OGC Rules Variant from Unearthed Arcana is to prevent characters from acquiring one level of fighter or psychic warrior just for the +2, +3, or +4 boost to Defense Bonus.//
//Defense Bonuses to AC do not stack with Armor bonuses, use the higher of the two that is applicable to the situation.
Unlike an armor bonus, a defense bonus does improve a character’s AC against touch attacks.//
Ruled by a caste of Clairsentients, Delune is perhaps the most structured of the [[Pavanno]] Nations. Divided into strict Domains, each led by a single family trained in the psionic discipline of clairsentience, Delune is rarely unprepared for things. Delune is located in the lands surrounding the Four Peaks of Northern Pavana, and claims some 550,860 square miles of land.
!Environment
!Domains
!Relations
!Economy
!History
!Culture
The Desert Whirlwind is epitome of the Nesherim's Desert Ascetics. Desert Whirlwinds learn a spiritual dance that emphasizes grace and footing. Living in the deep desert also provides survival skills, but leaves a somewhat naive attitude towards the city life.
''Prerequisite:'' Must be a [[Nesherim]], Must also choose to be a [[Barbarian]] or a [[Psychic Warrior]].
''Bonus:'' You get a +1 bonus on all Balance and Survival checks.
''Penalty:'' You have a -1 penalty on all Knowledge (Nobility and royalty) and Geography checks.
[[E6|http://esix.pbwiki.com/]] is an idea codified by Ryan Stoughton, and expanded/playtested by a number of other posters at [[ENWorld|http://www.enworld.org/showthread.php?t=202109&page=1&pp=40]].
!Restricted Feats
//Psionic Body// is not allowed as a feat in Omnia Psionic.
!Old and Unchanged Feats
Any feat found in the //System Reference Document// that is not modified here (namely, Open Minded), remains the same. However, it should be noted that some of these feats can never be taken because E6 characters will not be able to meet the requirements.
!New and Modified Feats
The following General feats are available when playing a game of Omnia Psionic E6.
<<list byTag "E6Feat" "General">>
The following Psionic feats are available when playing a game of Omnia Psionic E6.
<<list byTag "E6Feat" "Psionic">>
[[Conviction]]
[[The Death Flag]]
[[Raising the Stakes]]
[[Reading the Players]]
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler saveClose -cancelTiddler copyTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
The desert on the sea, Elarnuz claims the 189,160 square miles of desert on the northern edge of [[Dassura Isle]]. Elarnuz produces the worlds highest quality glass, and has for centuries. This alone is the reason the [[Nesherim]] of Elarnuz willingly suffer the difficulties of the desert.
!Environment
!Provinces
!Relations
!Economy
!History
!Culture
''Prerequisite:'' Base reflex save +3
''Benefit:'' If you make a successful Reflex saving throw against an attack that normally deals half damage on a successful save, you instead take no damage. Evasion can be used only if you are wearing light armor or no armor. A helpless character does not gain the benefit of evasion.
''Benefit:'' You learn 1 or more new powers known, with power levels totaling to half of your manifester level (round down). Thus, a sixth level Psion could gain one 3rd level power, one 1st and one 2nd level power, or three 1st level powers. This feat cannot provide powers known of a level higher than you can already manifest.
''Special:'' You may take this feat multiple times; each time you take it it provides more powers.
Type the text for 'Extra Mind Blade Enhancement'
Farmlanders hail from agricultural areas of their homeland. Farmlanders tend to be self-sufficient, and most are talented in some craft needed by their village. Unfortunately, the rural life tends to make Farmlanders a bit out of sorts in cities.
''Prerequisite:'' Must choose to be a [[Fighter]], [[Psychic Warrior]], or [[Rogue]].
''Bonus:'' You get a +1 bonus on all Survival checks. Also gains a +1 bonus to a single Craft skill check.
''Penalty:'' You have a -1 penalty on all Knowledge (Nobility and royalty) and Appraise checks.
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #090 solid; padding-left:0.2em; color:#090;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Fighters are known the world over. Soldiers, hunters, guards, bounty hunters, sheriffs, and any of a great number of other professions are well suited to Fighters. Though not always as fierce as [[Barbarians|Barbarian]], Fighters can be a powerful compliment to more subtle companions.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Fighter">>
<html><img src='http://img86.imageshack.us/img86/7830/glowglobefb1.png' style='float:left;'></html>A Glowglobe is an item, powered by psionics, used as a lamp in the most extravagant of cities. It is most commonly found in Iluan cities, but is also seen in the larger Nesherim cities. Glowglobes float in the air, and shine with light at night, automatically dimming as day breaks.
/***
|Name|HaloscanMacro|
|Created by|JimSpeth|
|Location|http://end.com/~speth/HaloscanMacro.html|
|Version|1.1.0|
|Requires|~TW2.x|
!Description
Comment and trackback support for TiddlyWiki (via Haloscan).
!History
* 16-Feb-06, version 1.1.0, drastic changes, now uses settings from haloscan account config
* 31-Jan-06, version 1.0.1, fixed display of counts for default tiddlers
* 30-Jan-06, version 1.0, initial release
!Examples
|!Source|!Output|h
|{{{<<haloscan comments>>}}}|<<haloscan comments>>|
|{{{<<haloscan trackbacks>>}}}|<<haloscan trackbacks>>|
!Installation
Register for a [[Haloscan|http://www.haloscan.com]] account. It's free and painless.
Install the HaloscanMacro in a new tiddler with a tag of systemConfig (save and reload to activate).
In the macro configuration code (below), change //YourName// to your Haloscan account name.
Use the macro somewhere in a tiddler (see ViewTemplate for an example).
!Settings
You can adjust various options for your account in the member configuration area of Haloscan's web site. The macro will use these settings when formatting the links.
!Code
***/
//{{{
/* change "YourName" to your Haloscan account name */
config.macros.haloscan = {account: "jjsheets", baseURL: "http://www.haloscan.com/load/"};
var haloscanLoaded = 0;
config.macros.haloscan.load = function ()
{
if (haloscanLoaded == 1)
return;
account = config.macros.haloscan.account;
if (!account || (account == "YourName"))
account = store.getTiddlerText("SiteTitle");
var el = document.createElement('script');
el.language = 'JavaScript';
el.type = 'text/javascript';
el.src = config.macros.haloscan.baseURL + account;
document.documentElement.childNodes[0].appendChild(el);
haloscanLoaded = 1;
}
config.macros.haloscan.load();
/* this totally clobbers document.write, i hope that's ok */
var safeWrite = function(s)
{
document.written = s;
return s;
};
document.write = safeWrite;
config.macros.haloscan.refreshDefaultTiddlers = function ()
{
var start = store.getTiddlerText("DefaultTiddlers");
if (start)
{
var titles = start.readBracketedList();
for (var t=titles.length-1; t>=0; t--)
story.refreshTiddler(titles[t], DEFAULT_VIEW_TEMPLATE, 1);
}
}
var haloscanRefreshed = 0;
config.macros.haloscan.handler = function (place, macroName, params, wikifier, paramString, tiddler)
{
if (typeof HaloScan == 'undefined')
{
if (haloscanRefreshed == 0)
{
setTimeout("config.macros.haloscan.refreshDefaultTiddlers()", 1);
haloscanRefreshed = 1;
}
return;
}
var id = story.findContainingTiddler(place).id.substr(7);
var hs_search = new RegExp('\\W','gi');
id = id.replace(hs_search,"_");
account = config.macros.haloscan.account;
if (!account || (account == "YourName"))
account = store.getTiddlerText("SiteTitle");
var haloscanError = function (msg)
{
createTiddlyError(place, config.messages.macroError.format(["HaloscanMacro"]), config.messages.macroErrorDetails.format(["HaloscanMacro", msg]));
}
if (params.length == 1)
{
if (params[0] == "comments")
{
postCount(id);
commentsLabel = document.written;
commentsPrompt = "Comments on this tiddler";
var commentsHandler = function(e) { HaloScan(id); return false; };
var commentsButton = createTiddlyButton(place, commentsLabel, commentsPrompt, commentsHandler);
}
else if (params[0] == "trackbacks")
{
postCountTB(id);
trackbacksLabel = document.written;
trackbacksPrompt = "Trackbacks for this tiddler";
var trackbacksHandler = function(e) { HaloScanTB(id); return false; };
var trackbackButton = createTiddlyButton(place, trackbacksLabel, trackbacksPrompt, trackbacksHandler);
}
else
haloscanError("unknown parameter: " + params[0]);
}
else if (params.length == 0)
haloscanError("missing parameter");
else
haloscanError("bad parameter count");
}
//}}}
Frighteningly violent in nature, the Havoc Warriors of Zulavya learn their raging natures from hunting bears and other predators singlehandedly. This teaches them to live off the land and gives them an impressive capacity for intimidation. Havoc Warriors tend to be bull-headed and ignorant of city life.
''Prerequisite:'' Must choose to be a [[Barbarian]]. Must also be a [[Zulavic]].
''Bonus:'' You get a +1 bonus on all Survival and Intimidate checks.
''Penalty:'' You have a -1 penalty on all Diplomacy and Knowledge (Nobility and royalty) checks.
''Prerequisite:'' Base Fortitude save +2
''Benefit:'' You gain 5 hit points.
''Special:'' If you have a Base Fortitude save of +4, you may take this feat a second time. If you have a Base Fortitude save of +5, you may take this feat a third time. Its effects stack.
/***
|Name|HideNoTagsBoxPlugin|
|Created by|JeffSheets|
|Version|0.1|
|Requires|~TW2.2.4+|
!Description:
Hides the tags box when there are no tags associated with the current tiddler.
The following CSS styles are automatically added as a custom stylesheet, along with the change to ''Story.prototype.refreshTiddler'', to make this work.
{{{
.tagged {display: none;}
.isTagged .tagged {display: block;}
}}}
!History
*21-07-07: version 0.1: first version.
!Code
***/
//{{{
Story.prototype.refreshTiddler = function(title,template,force,customFields,defaultText)
{
var tiddlerElem = document.getElementById(this.idPrefix + title);
if(tiddlerElem) {
if(tiddlerElem.getAttribute("dirty") == "true" && !force)
return tiddlerElem;
template = this.chooseTemplateForTiddler(title,template);
var currTemplate = tiddlerElem.getAttribute("template");
if((template != currTemplate) || force) {
var tiddler = store.getTiddler(title);
if(!tiddler) {
tiddler = new Tiddler();
if(store.isShadowTiddler(title)) {
tiddler.set(title,store.getTiddlerText(title),config.views.wikified.shadowModifier,version.date,[],version.date);
} else {
var text = template=="EditTemplate" ?
config.views.editor.defaultText.format([title]) :
config.views.wikified.defaultText.format([title]);
text = defaultText ? defaultText : text;
var fields = customFields ? customFields.decodeHashMap() : null;
tiddler.set(title,text,config.views.wikified.defaultModifier,version.date,[],version.date,fields);
}
}
tiddlerElem.setAttribute("tags",tiddler.tags.join(" "));
tiddlerElem.setAttribute("tiddler",title);
tiddlerElem.setAttribute("template",template);
var me = this;
tiddlerElem.onmouseover = this.onTiddlerMouseOver;
tiddlerElem.onmouseout = this.onTiddlerMouseOut;
tiddlerElem.ondblclick = this.onTiddlerDblClick;
tiddlerElem[window.event?"onkeydown":"onkeypress"] = this.onTiddlerKeyPress;
var html = this.getTemplateForTiddler(title,template,tiddler);
tiddlerElem.innerHTML = html;
applyHtmlMacros(tiddlerElem,tiddler);
if(store.getTaggedTiddlers(title).length > 0)
addClass(tiddlerElem,"isTag");
else
removeClass(tiddlerElem,"isTag");
if (tiddler.tags.length > 0) {
addClass(tiddlerElem,"isTagged");
} else {
removeClass(tiddlerElem,"isTagged");
}
if(!store.tiddlerExists(title)) {
if(store.isShadowTiddler(title))
addClass(tiddlerElem,"shadow");
else
addClass(tiddlerElem,"missing");
} else {
removeClass(tiddlerElem,"shadow");
removeClass(tiddlerElem,"missing");
}
if(customFields)
this.addCustomFields(tiddlerElem,customFields);
forceReflow();
}
}
return tiddlerElem;
};
setStylesheet("\n.tagged {display: none;}\n.isTagged .tagged {display: block;}\n","HideNoTagsStyleSheet",document);
//}}}
{{mapfloat{
[img[http://img72.imageshack.us/img72/6769/iluamainlandxm2.jpg]]
}}}
The Ilua Mainland is a fairly large continent off the southwest coast of the [[Tuznali Mainland]]. It is surrounded on all sides by water. The Ilua Highland is the largest of the known regions of the world. 2,337,000 square miles.
!!Nations
[[Iluana]]
[[Asua]]
[[Losccuco]]
!!Subrace
[[Iluan]]
Haughty, imperialistic, confident city builders, the Iluan people mostly live on the large subcontinent of Ilua, though there are large numbers scattered throughout the known world. The Iluans also maintain impressive navies, and Iluan sailors are feared and respected the world over.
!!Starting Languages
One of [[Iluasa]] or [[Losccodu]].
!!Bonus Languages
[[Iluasa]], [[Losccodu]], [[Tuzanal]], [[Urofal]], [[Unahal]], [[Nethrinu]], [[Atlathtu]], [[Tekhranu]], [[Pavani]], and [[Anuyi]].
!!Background Feats
<<list byTag "BackgroundFeat" "Iluan">>
!!Starting Classes
<<list byTag "Class" "Iluan">>
!!Appearance
Iluans are of average height and somewhat slender build. They tend to have suntanned skin, any color of eyes, and brown hair, straight or curly.
Iluan Academies have a reputation for their emphasis on concentration and psicraft. Unfortunately, like all academies, a greater knowledge of the more mundane nature of the world is lacking.
''Prerequisite:'' Must be an [[Iluan]], Must also choose to be a [[Psion]].
''Bonus:'' You get a +1 bonus on all Concentration and Psicraft checks.
''Penalty:'' You have a -1 penalty on all Survival and Appraise checks.
Iluana is the seat of imperial rule on the [[Ilua Mainland]]. Covering 1,706,010 square miles of territory, this nation is divided into a number of provinces. Each of these provinces is controlled by a governor, and each pays tribute to the capital city of Ilanor. The nation of [[Losccuco]] has recently agreed to a truce with Iluana.
!Environment
!Provinces
!Relations
!Economy
!History
!Culture
The imperial language of the [[Iluan]]s, Iluasa is also used as a common language in many other nations. A speaker of Iluasa can make an Intelligence check at a DC of 30 to understand a sentence of [[Losccodu]].
''Prerequisite:'' Sneak attack class ability, Hide 9 ranks, Move Silently 9 ranks
''Benefit:'' Your sneak attacks deal an additional +1d6 damage.
Only one race, humans. No magic whatsoever. Psionics prevail. No magical creatures. A silent but universal deity. No planes of existence besides the material and the astral and a few pocket realms found within the Astral. Realistic Language groups. Most non-mundane enemies are either psionically shaped, or are actually psionic; all other enemies are either controlled undead or natural.
!!Campaign Rules
Omnia Psionic uses [[E6]] (click on the link for more info), and the [[System Reference Document v3.5|http://www.systemreferencedocuments.org/35/sovelior_sage/home.html]]. It also makes use of [[Background Feats]], a [[Defense Bonus]] system (to lessen the dependence on armor), and has the unique quality that there are no natural sentient Humanoids other than humans.
//For more information on the Campaign specific rules used with Omnia Psionic, see the entries under ''Campaign Rules'' in the Menu to the left.//
!!Style Guidelines
This Guide utilizes a specific style to ensure that the information provided is as clear and obvious as possible. One method used is to color tiddler titles in different ways depending on their content.
!!Copyrights
E6 rules and many of the E6 Feats are copyrighted material, owned by either Ryan Stoughton, or the originator of the Feat. TiddlyWiki is copyrighted software, owned by [[UnaMesa|http://www.unamesa.org/]]. All other content, unless noted elsewhere, is Copyright 2007 Jeff Sheets.
!!Tiddly Wiki
For more information on the Wiki software used, see TiddlyWiki. For the definition of a tiddler, click [[here|Tiddler]].
!!Comments provided by Haloscan
Now each and every single Tiddler can have additional comments posted, just click on the Comments link to pop up the comments for that tiddler, or click on the Trackback link for the Trackback.
The plains and forests of Inzur Nat border [[Nethra Naddi]] and [[Tebir Nat]]. Inzur Nat claims 503,000 square miles of territory. Inzur Nat has an uneasy relationship with the nearest city states of Nethra Naddi, every 60 years droughts push hungry [[Nesherim]] raiders and warlords against the borders of the stable and fairly fertile Inzur Nat. Inzur Nat is divided into a number of minor kingdoms, each of which vies for power, uniting in the face of foreign adversaries.
!Environment
!Kingdoms
!Relations
!Economy
!History
!Culture
Izu Meditatives practice meditation throughout their training, especially in particularly strange stances. This leads to a graceful skill as well as impressive concentration. The emphasis on stationary meditation leaves Izu Meditatives a little lacking when it comes to mobility.
''Prerequisite:'' Must be an [[Pavanno]], Must also choose to be a [[Monk]].
''Bonus:'' You get a +1 bonus on all Balance and Concentration checks.
''Penalty:'' You have a -1 penalty on all Move Silently and Tumble checks.
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #909 solid; padding-left:0.2em; color:#909;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Human subrace determine a character's starting and bonus languages. As usual, a character can choose to learn more languages by spending skill points, and gains additional languages for each Intelligence bonus point he or she starts the game with.
!Pavani Languages
[[Pavani]]
[[Biyami]]
[[Anuyi]]
!Ilua Languages
[[Iluasa]]
[[Losccodu]]
!Tuzan Languages
[[Tuzanal]]
[[Urofal]]
[[Unahal]]
!Nethri Languages
[[Nethrinu]]
[[Atlathtu]]
[[Tekhranu]]
!Zulaviy Languages
[[Zulaviy]]
[[Bishoy]]
[[Zdomishtiy]]
[[Protsadiy]]
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://tw.lewcid.org/|
|''Description:''|a repository of my extensions for TW|
|''Author:''|SaqImtiaz|
|''Workspace:''|(default)|
Lia, the moon orbiting the world of Omnia Psionic, looks a pale white color with deep red craters, always shows the same side to the earth, and has a phase period of a bit under 27 days.
This language is spoken by the [[Iluan]]s of [[Losccuco]]. A speaker of Losccodu can make an Intelligence check at a DC of 30 to understand a sentence of [[Iluasa]].
Losccuco [Los-choo-koh] is a group of provinces that fought a war of independence against [[Iluana]]. Covering 492,172 square miles of territory on the [[Ilua Mainland]], Losccuco maintains an impressive military, and also happens to host the [[Monastery of Nastana]]. There is currently a truce between Iluana and Losccuco, though neither nation thinks favorably of the other.
!Environment
!Provinces
!Relations
!Economy
!History
!Culture
[[Introduction]]
[[Recent Changes]]
!!!Encyclopedia
[[Regions]]
[[History]]
[[Common Knowledge]]
!!!Campaign Rules
[[What is E6?]]
[[E6 Rules]]
[[E6 Feats (for OP)]]
[[No Magic]]
[[Player Races]]
[[Player Classes]]
[[Defense Bonus]]
[[Background Feats]]
[[Languages]]
[[Appendices]]
@@font-size:70%;[[TiddlyWiki]] <<version>>
© 2007 [[UnaMesa|http://www.unamesa.org/]]@@
You become a more accomplished manifester.
''Requirements:'' Character level 6, manifester level 1 or greater.
''Benefit:'' Your manifester level increases by 4, to a maximum of 6. Note this only affects Manifester Level (i.e., more dice on your damage, no new powers or power points).
''Prerequisites:'' Monk, Psychic Warrior, Rogue, or Soulknife Level 6th.
''Benefit:'' You may select feats with a requirement of up to your class level 8, and with a Base Attack Bonus requirement of up to +6.
''Prerequisites:'' Fighter Level 6th.
''Benefit:'' You may select feats with a requirement of up to fighter level 8, and with a Base Attack Bonus requirement of up to +8.
''Special:'' A fighter may select Martial Veteran as one of his bonus feats.
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://www.martinswiki.com/ |
|''Description:''|Martin Buddens's Plugins |
|''Author:''|MartinBudden |
|''Workspace:''|(default)|
/***
|Name|MenuEditPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#MenuEditPlugin|
|Version|0.2|
|Requires|~TW2.x|
!Description:
Adds 'doubleclick to edit source' to the MainMenu, SideBarOptions, and SideBarTabs
!History
*20-07-06: version 0.2: hijacked restart, no need to put a macro in the mainMenu anymore.
*28-04-06: version 0.1: working.
!Code
***/
//{{{
window.restart_lewcid_menuedit = restart;
window.restart = function () {
window.restart_lewcid_menuedit();
var menus = new Array("topMenu","sidebarOptions","sidebarTabs","contentFooter","mainMenu");
for(var t=0; t<menus.length; t++){
if (document.getElementById(menus[t]))
{var menu = document.getElementById(menus[t]);
menu.ondblclick = window.onMenuDblClick;}}
}
window.onMenuDblClick = function(e){
if (!e) var e = window.event;
story.displayTiddler(null,this.getAttribute("tiddler"),2,false,null)
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
return false;
}
//}}}
MicroContent being a fashionable word for self-contained fragments of content that are typically smaller than entire pages. Often MicroContent is presented via some kind of aggregation that reduces the perceptual shock and resource cost of context switching (eg Blogs aggregating several entries onto a page or Flickr presenting photos in an album). This TiddlyWiki aggregates MicroContent items called 'tiddlers' into pages that are loaded in one gulp and progressively displayed as the user clicks hypertext links to read them.
For thousands of years there have been orders of ascetic warriors dedicating their lives to a path of enlightenment. These monasteries exist in the [[Nethrini Peninsula]], the [[Ilua Mainland]], and the [[Pavana Coast]].
!!Available Background Feats
<<list byTag "BackgroundFeat" "Monk">>
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://mptw.tiddlyspot.com/|
|''Description:''|a tiddlywiki distribution and plugins|
|''Author:''|SimonBaird|
|''Workspace:''|(default)|
Nastana Ascetics are those men and women who choose to study as a Monk or Psion at the Monastery of Nastana. Built on a high cliff, those who learned their skills at this impressive monastery are adept climbers, and have excellent balance. Unfortunately, such a distant life leaves them lacking in certain mundane knowledge.
''Prerequisite:'' Must be an [[Iluan]], Must also choose to be a [[Monk]] or [[Psion]].
''Bonus:'' You get a +1 bonus on all Balance and Climb checks.
''Penalty:'' You have a -1 penalty on all Knowledge (History) and Knowledge (Nobility and royalty) checks.
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #00f solid; padding-left:0.2em; color:#00f;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Accustomed to life in the desert, Nesherim are a hardy people with a long history. Most Nesheri cities lie on the coastlines or on the few rivers in [[Nethra Naddi]], or on the coasts of [[Dassura Isle]]. Nesherim are often extremely good merchants, and most have at least a knack for shrewd business sense.
!!Starting Languages
One of [[Nethrinu]], [[Atlathtu]], or [[Tekhranu]].
!!Bonus Languages
[[Nethrinu]], [[Atlathtu]], [[Tekhranu]], [[Iluasa]], [[Losccodu]], [[Unahal]], [[Pavani]], or [[Anuyi]].
!!Background Feats
<<list byTag "BackgroundFeat" "Nesherim">>
!!Starting Classes
<<list byTag "Class" "Nesherim">>
!!Appearance
Nesherim tend to be somewhat short, but otherwise are normal. Most Nesherim, especially those who live in the desert, have dry, deeply tanned skin. They often seem dehydrated, with sharply defined veins and muscles. They have straight black hair almost exclusively. Their eyes tend to be green or brown, it is very rare to see a blue eyed Nesherim.
Nesherim Academies have a reputation for their emphasis on knowledge of Psionics and the Planes. Unfortunately, like all academies, a greater knowledge of the more mundane nature of the world is lacking.
''Prerequisite:'' Must be an [[Nesherim]], Must also choose to be a [[Psion]].
''Bonus:'' You get a +1 bonus on all Knowledge (Psionics) and Knowledge (The Planes) checks.
''Penalty:'' You have a -1 penalty on all Survival and Appraise checks.
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Version|2.3.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Slider.prototype.stop|
|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|
!!!!!Configuration
<<<
Enable animation for slider panels
<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing
>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:
><<option chkAnimate>> enable animations (entire document)
>For slider animation to occur, you must also allow animation in general.
Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
<<<
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content. Use {{{+++}}} and {{{===}}} to delimit the slider content. You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created. This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.
Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*transient display (clicking elsewhere closes panel)
*custom class/label/tooltip/accesskey
*alternate label/tooltip (displayed when panel is open)
*panelID (for later use with {{{<<DOM>>}}} macro. See [[DOMTweaksPlugin]])
*automatic blockquote style on panel
*deferred rendering of panel content
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively. When the extra {{{+}}} is used, the slider will be open when initially displayed.
* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.
* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style
* {{{^width^}}} (or just {{{^}}})<br>makes the slider 'float' on top of other content rather than shifting that content downward. 'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.). If omitted, the default width is "auto" (i.e., fit to content)
* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed. This is useful for creating 'pulldown menus' that automatically go away after they are used.
* {{{{{class{[label=key|tooltip][altlabel|alttooltip]}}}}}}<br>uses label/tooltip/accesskey. {{{{{class{...}}}}}}, {{{=key}}}, {{{|tooltip}}} and {{{[altlabel|alttooltip]}} are optional. 'class' is any valid CSS class name, used to style the slider label text. 'key' must be a ''single letter only''. altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.
* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content. This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.
* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content
* {{{"..."}}} //(without the quotes)//<br>defers rendering of closed sliders until the first time they are opened. //Note: deferred rendering may produce unexpected results in some cases. Use with care.//
//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
<<<
!!!!!Examples
<<<
simple in-line slider:
{{{
+++
content
===
}}}
+++
content
===
----
use a custom label and tooltip:
{{{
+++[label|tooltip]
content
===
}}}
+++[label|tooltip]
content
===
----
content automatically blockquoted:
{{{
+++>
content
===
}}}
+++>
content
===
----
all options combined //(default open, cookie, heading, sized floater, transient, class, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
content
===
}}}
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
content
===
----
complex nesting example:
{{{
+++[get info...=I|click for information or press Alt-I]
put some general information here,
plus a floating panel with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could in turn contain a transient panel,
perhaps with a +++^25em^*[glossary definition]explaining technical terms===
===
===
}}}
+++[get info...=I|click for information or press Alt-I]
put some general information here,
plus a floating panel with more specific info:
+++^10em^[view details...|click for details]
put some detail here, which could in turn contain a transient panel,
perhaps with a +++^25em^*[glossary definition]explaining technical terms===
===
===
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed. Fixes "IE click disease", whereby nearly every mouse click causes a page transition.
''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:). This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.
''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)
''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop
''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well). "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document. This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed. Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.
''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)
''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel. This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page. (thanks to Harsha for bug report)
''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)
''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function
|please see [[NestedSlidersPluginHistory]] for additional revision details|
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 2, minor: 3, revision: 1, date: new Date(2007,7,26)};
//}}}
//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;
if (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;
// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}
//{{{
config.formatters.push( {
name: "nestedSliders",
match: "\\n?\\+{3}",
terminator: "\\s*\\={3}\\n?",
lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
handler: function(w)
{
lookaheadRegExp = new RegExp(this.lookahead,"mg");
lookaheadRegExp.lastIndex = w.matchStart;
var lookaheadMatch = lookaheadRegExp.exec(w.source)
if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
{
// var defopen=lookaheadMatch[1]
// var cookiename=lookaheadMatch[2]
// var header=lookaheadMatch[3]
// var panelwidth=lookaheadMatch[4]
// var transient=lookaheadMatch[5]
// var class=lookaheadMatch[6]
// var label=lookaheadMatch[7]
// var openlabel=lookaheadMatch[8]
// var panelID=lookaheadMatch[9]
// var blockquote=lookaheadMatch[10]
// var deferred=lookaheadMatch[11]
// location for rendering button and panel
var place=w.output;
// default to closed, no cookie, no accesskey, no alternate text/tip
var show="none"; var cookie=""; var key="";
var closedtext=">"; var closedtip="";
var openedtext="<"; var openedtip="";
// extra "+", default to open
if (lookaheadMatch[1]) show="block";
// cookie, use saved open/closed state
if (lookaheadMatch[2]) {
cookie=lookaheadMatch[2].trim().slice(1,-1);
cookie="chkSlider"+cookie;
if (config.options[cookie]==undefined)
{ config.options[cookie] = (show=="block") }
show=config.options[cookie]?"block":"none";
}
// parse label/tooltip/accesskey: [label=X|tooltip]
if (lookaheadMatch[7]) {
var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");
closedtext=parts.shift();
if (closedtext.substr(closedtext.length-2,1)=="=")
{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
openedtext=closedtext;
if (parts.length) closedtip=openedtip=parts.join("|");
else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
}
// parse alternate label/tooltip: [label|tooltip]
if (lookaheadMatch[8]) {
var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");
openedtext=parts.shift();
if (parts.length) openedtip=parts.join("|");
else openedtip="hide "+openedtext;
}
var title=show=='block'?openedtext:closedtext;
var tooltip=show=='block'?openedtip:closedtip;
// create the button
if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);
btn.onclick=onClickNestedSlider;
btn.setAttribute("href","javascript:;");
btn.setAttribute("title",tooltip);
}
else
var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);
btn.innerHTML=title; // enables use of HTML entities in label
// set extra button attributes
btn.setAttribute("closedtext",closedtext);
btn.setAttribute("closedtip",closedtip);
btn.setAttribute("openedtext",openedtext);
btn.setAttribute("openedtip",openedtip);
btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
btn.keyparam=key; // save the access key letter ("" if none)
if (key.length) {
btn.setAttribute("accessKey",key); // init access key
btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
}
btn.onmouseover=function(event) // mouseover on button aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }
// create slider panel
var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
panel.button = btn; // so the slider panel know which button it belongs to
btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";
panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");
panel.style.display = show;
panel.style.width=panel.defaultPanelWidth;
panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }
// render slider (or defer until shown)
w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
if ((show=="block")||!lookaheadMatch[11]) {
// render now if panel is supposed to be shown or NOT deferred rendering
w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
// align floater position with button
if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel,panelClass);
}
else {
var src = w.source.substr(w.nextMatch);
var endpos=findMatchingDelimiter(src,"+++","===");
panel.setAttribute("raw",src.substr(0,endpos));
panel.setAttribute("blockquote",lookaheadMatch[10]?"true":"false");
panel.setAttribute("rendered","false");
w.nextMatch += endpos+3;
if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
}
}
}
}
)
// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
var startpos = 0;
var endpos = src.indexOf(endtext);
// check for nested delimiters
while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
// count number of nested 'starts'
var startcount=0;
var temp = src.substring(startpos,endpos-1);
var pos=temp.indexOf(starttext);
while (pos!=-1) { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
// set up to check for additional 'starts' after adjusting endpos
startpos=endpos+endtext.length;
// find endpos for corresponding number of matching 'ends'
while (startcount && endpos!=-1) {
endpos = src.indexOf(endtext,endpos+endtext.length);
startcount--;
}
}
return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
if (!e) var e = window.event;
var theTarget = resolveTarget(e);
var theLabel = theTarget.firstChild.data;
var theSlider = theTarget.sliderPanel
var isOpen = theSlider.style.display!="none";
// toggle label
theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
// toggle tooltip
theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));
// deferred rendering (if needed)
if (theSlider.getAttribute("rendered")=="false") {
if (config.options.chkDebugLazySliderRender)
alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
var place=theSlider;
if (theSlider.getAttribute("blockquote")=="true")
place=createTiddlyElement(place,"blockquote");
wikify(theSlider.getAttribute("raw"),place);
theSlider.setAttribute("rendered","true");
}
// show/hide the slider
if(config.options.chkAnimate && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))
anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
else
theSlider.style.display = isOpen ? "none" : "block";
// reset to default width (might have been changed via plugin code)
theSlider.style.width=theSlider.defaultPanelWidth;
// align floater panel position with target button
if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
// if showing panel, set focus to first 'focus-able' element in panel
if (theSlider.style.display!="none") {
var ctrls=theSlider.getElementsByTagName("*");
for (var c=0; c<ctrls.length; c++) {
var t=ctrls[c].tagName.toLowerCase();
if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
{ ctrls[c].focus(); break; }
}
}
var cookie=theTarget.sliderCookie;
if (cookie && cookie.length) {
config.options[cookie]=!isOpen;
if (config.options[cookie]!=theTarget.defOpen)
saveOptionCookie(cookie);
else { // remove cookie if slider is in default display state
var ex=new Date(); ex.setTime(ex.getTime()-1000);
document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
}
}
return false;
}
//}}}
//{{{
// click in document background closes transient panels
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
// call original click handler
if (document.nestedSliders_savedOnClick)
var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
// if click was inside transient panel (or something contained by a transient panel)... leave it alone
var p=target;
while (p)
if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;
else p=p.parentNode;
if (p) return retval;
// otherwise, find and close all transient panels...
var all=document.all?document.all:document.getElementsByTagName("DIV");
for (var i=0; i<all.length; i++) {
// if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
// otherwise, if the panel is currently visible, close it by clicking it's button
if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
}
return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
if (panelClass=="floatingPanel") {
var left=0;
var top=btn.offsetHeight;
if (place.style.position!="relative") {
var left=findPosX(btn);
var top=findPosY(btn)+btn.offsetHeight;
var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
if (p) { left-=findPosX(p); top-=findPosY(p); }
}
if (findPosX(btn)+panel.offsetWidth > getWindowWidth()) // adjust position to stay inside right window edge
left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'
panel.style.left=left+"px"; panel.style.top=top+"px";
}
}
function getWindowWidth() {
if(document.width!=undefined)
return document.width; // moz (FF)
if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
return document.documentElement.clientWidth; // IE6
if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
return document.body.clientWidth; // IE4
if(window.innerWidth!=undefined)
return window.innerWidth; // IE - general
return 0; // unknown
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
// TW2.2+
// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
Morpher.prototype.coreStop = Morpher.prototype.stop;
Morpher.prototype.stop = function()
{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
}
//}}}
Nethra Naddi is the most ancient home of the [[Nesherim]]. A full 1,308,775 square miles, Nethra Naddi is divided into separate, and sometimes hostile, city-states. Most often the reasons for hostilities is based on the ever changing value of the territories. At the moment, Nethra Naddi is fertile and peace reins, but every 60 years the desert retakes the land, and the fighting begins again for the meager scraps needed to survive.
!Environment
!City-states
!Relations
!Economy
!History
!Culture
{{mapfloat{
[img[http://img503.imageshack.us/img503/5241/tuznalinethrinizulavyatc1.jpg]]
}}}
The arid scrublands and deserts of the Nethrini Peninsula are southeast of the [[Tuznali Mainland]]. Far to the west lies the [[Ilua Mainland]]. To the east is [[Dassura Isle]], inhabited also by the Nesherim. 1,308,775 square miles.
!!Nation
[[Nethra Naddi]]
!!Subrace
[[Nesherim]]
Spoken throughout [[Nethra Naddi]], Nethrinu is the common language of the [[Nesherim]]. Speakers of Nethrinu can make an Intelligence check at a DC of 28 to understand a sentence of [[Atlathtu]] or [[Tekhranu]].
!Disallowed Skills
With no magic in the world, the following skills are not only useless, but nonexistent.
''Use Magic Device''
''Spellcraft''
''Craft (Alchemy)''
''Knowledge (Arcana)''
!No Magic Items
Obviously a world lacking magic will lack magic items. That, however, doesn't prevent the existence of psionics based items.
!The Term "Magic" in Rules
Anywhere the term "magic" appears in a rule, replace it with the term "psionic".
!Creature Types found in Omnia Psionic
The following types of creatures are found in Omnia Psionic: Aberrations, Animals, Constructs, Giants, Humanoids (though humans are the only Humanoids in existence), Monstrous Humanoids (all of which are thoroughly twisted versions of humanity or other creatures), Plants (though they are extremely rare), Undead, and Vermin.
The Nomads of the Zulavya Highlands follow their herds of goats in the cold steppes. They are particularly good survivalists and are adept at animal husbandry. Their lack of personal possessions (all possessions belong to the nomad tribe as a whole), and their ignorance of city life often makes them outcasts beyond the reach of Zulavya.
''Prerequisite:'' Must choose to be a [[Fighter]] or [[Rogue]]. Must be a [[Zulavic]].
''Bonus:'' You get a +1 bonus on all Handle Animal and Survival checks.
''Penalty:'' You have a -1 penalty on all Appraise and Diplomacy checks.
Established a couple generations ago, Onoco is an [[Iluana]] sponsored colony on the east coast of the [[Onoco Mainland]]. It is still struggling to be self-sufficient, but has already become profitable for Iluana with shipments of obsidian and other crystals.
!Environment
!Relations
!Economy
!History
!Culture
{{mapfloat{
[img[http://img114.imageshack.us/img114/4637/onocomainlandvm9.jpg]]
}}}
Filled with jungles, this small continent, almost exactly opposite the [[Ilua Mainland]] on the globe, is an unexplored and wild land. 1,476,845 square miles.
!!Colonies
[[Onoco]]
You are naturally able to reroute your memory, mind, and skill expertise.
''Benefit:'' You immediately gain an extra 5 skill points. You spend these skill points as normal. If you spend them on a cross-class skills they count as 1/2 ranks. You cannot exceed the normal maximum ranks for your level in any skill. For the purposes of this feat, any skill that is a class skill of any of your classes counts as a class skill.
''Special:'' You can gain this feat multiple times. Each time, you immediately gain another 5 skill points.
!!Designation of Open Game Content
All text in tiddlers tagged with OpenGameContent are declared Open Content, as per Section 8 of the Open Gaming License.
!!Open Gaming License
The following text is the property of Wizards of the Coast, Inc. and is Copyright 2000 Wizards of the Coast, Inc (“Wizards”). All Rights Reserved.
#Definitions: (a)”Contributors” means the copyright and/or trademark owners who have contributed Open Game Content; (b)”Derivative Material” means copyrighted material including derivative works and translations (including into other computer languages), potation, modification, correction, addition, extension, upgrade, improvement, compilation, abridgment or other form in which an existing work may be recast, transformed or adapted; (c) “Distribute” means to reproduce, license, rent, lease, sell, broadcast, publicly display, transmit or otherwise distribute; (d)”Open Game Content” means the game mechanic and includes the methods, procedures, processes and routines to the extent such content does not embody the Product Identity and is an enhancement over the prior art and any additional content clearly identified as Open Game Content by the Contributor, and means any work covered by this License, including translations and derivative works under copyright law, but specifically excludes Product Identity. (e) “Product Identity” means product and product line names, logos and identifying marks including trade dress; artifacts; creatures characters; stories, storylines, plots, thematic elements, dialogue, incidents, language, artwork, symbols, designs, depictions, likenesses, formats, poses, concepts, themes and graphic, photographic and other visual or audio representations; names and descriptions of characters, spells, enchantments, personalities, teams, personas, likenesses and special abilities; places, locations, environments, creatures, equipment, magical or supernatural abilities or effects, logos, symbols, or graphic designs; and any other trademark or registered trademark clearly identified as Product identity by the owner of the Product Identity, and which specifically excludes the Open Game Content; (f) “Trademark” means the logos, names, mark, sign, motto, designs that are used by a Contributor to identify itself or its products or the associated products contributed to the Open Game License by the Contributor (g) “Use”, “Used” or “Using” means to use, Distribute, copy, edit, format, modify, translate and otherwise create Derivative Material of Open Game Content. (h) “You” or “Your” means the licensee in terms of this agreement.
#The License: This License applies to any Open Game Content that contains a notice indicating that the Open Game Content may only be Used under and in terms of this License. You must affix such a notice to any Open Game Content that you Use. No terms may be added to or subtracted from this License except as described by the License itself. No other terms or conditions may be applied to any Open Game Content distributed using this License.
#Offer and Acceptance: By Using the Open Game Content You indicate Your acceptance of the terms of this License.
#Grant and Consideration: In consideration for agreeing to use this License, the Contributors grant You a perpetual, worldwide, royalty-free, non-exclusive license with the exact terms of this License to Use, the Open Game Content.
#Representation of Authority to Contribute: If You are contributing original material as Open Game Content, You represent that Your Contributions are Your original creation and/or You have sufficient rights to grant the rights conveyed by this License.
#Notice of License Copyright: You must update the COPYRIGHT NOTICE portion of this License to include the exact text of the COPYRIGHT NOTICE of any Open Game Content You are copying, modifying or distributing, and You must add the title, the copyright date, and the copyright holder’s name to the COPYRIGHT NOTICE of any original Open Game Content you Distribute.
#Use of Product Identity: You agree not to Use any Product Identity, including as an indication as to compatibility, except as expressly licensed in another, independent Agreement with the owner of each element of that Product Identity. You agree not to indicate compatibility or co-adaptability with any Trademark or Registered Trademark in conjunction with a work containing Open Game Content except as expressly licensed in another, independent Agreement with the owner of such Trademark or Registered Trademark. The use of any Product Identity in Open Game Content does not constitute a challenge to the ownership of that Product Identity. The owner of any Product Identity used in Open Game Content shall retain all rights, title and interest in and to that Product Identity.
#Identification: If you distribute Open Game Content You must clearly indicate which portions of the work that you are distributing are Open Game Content.
#Updating the License: Wizards or its designated Agents may publish updated versions of this License. You may use any authorized version of this License to copy, modify and distribute any Open Game Content originally distributed under any version of this License.
#Copy of this License: You MUST include a copy of this License with every copy of the Open Game Content You Distribute.
#Use of Contributor Credits: You may not market or advertise the Open Game Content using the name of any Contributor unless You have written permission from the Contributor to do so.
#Inability to Comply: If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Open Game Content due to statute, judicial order, or governmental regulation then You may not Use any Open Game Material so affected.
#Termination: This License will terminate automatically if You fail to comply with all terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses shall survive the termination of this License.
#Reformation: If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
#COPYRIGHT NOTICE
Open Game License v 1.0 Copyright 2000, Wizards of the Coast, Inc.
//System Reference Document// Copyright 2000, Wizards of the Coast, Inc.; Authors Jonathan Tweet, Monte Cook, Skip Williams, based on original material by E. Gary Gygax and Dave Arneson.
//E6: The Game Inside the World’s Most Popular Game// Copyright 2007, Ryan Stoughton; Author Ryan Stoughton
//Omnia Psionic// Copyright 2007, Jeff Sheets
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryMid]] [[ColorPalette::PrimaryLight]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
Like [[Delune]], Pavana is ruled by a higher caste of noble Psions; however, unlike Delune, no specific Discipline is enforced for the caste. Pavana is subdivided into a number of Realms, each of which is controlled by a single family of noble Psions. Pavana controls the area between Delune and [[Azume]], about 682,505 square miles of land.
!Environment
!Realms
!Relations
!Economy
!History
!Culture
{{mapfloat{
[img[http://img124.imageshack.us/img124/3527/pavanacoastue7.jpg]]
}}}
The Pavana Coast lies to the east of the [[Zulavya Highlands]] and the [[Tuznali Mainland]]. The Pavana Coast is hilly and heavily forested in the north and fertile plains in the south. 1,486,430 square miles.
!!Nations
[[Delune]]
[[Pavana]]
[[Azume]]
!!Subrace
[[Pavanno]]
Spoken among all [[Pavanno]]s, Pavani is the common language of the Pavana Coast. A speaker of Pavani can make an Intelligence check at a DC of 28 to understand a sentence of [[Biyami]] or [[Anuyi]].
The Pavanno live well structured lives in the forested hills bordered by the [[Pavana Coast]]. Accustomed to a rigid class heirarchy, the Pavanno tend to excel in the trade they are born to, seeing laziness or discontent as antisocial.
!!Starting Languages
One of [[Pavani]], [[Biyami]], or [[Anuyi]].
!!Bonus Languages
[[Pavani]], [[Biyami]], [[Anuyi]], [[Bishoy]], [[Atlathtu]], [[Tekhranu]], [[Nethrinu]], and [[Iluasa]].
!!Background Feats
<<list byTag "BackgroundFeat" "Pavanno">>
!!Starting Classes
<<list byTag "Class" "Pavanno">>
!!Appearance
Pavannos are dark skinned and have short curly black hair. They are tall people but otherwise well proportioned. Most have brown eyes, but green and blue eyes are also present.
Pavanno Academies have a reputation for their emphasis on developing a Psion's reserve of power. Unfortunately, like all academies, a greater knowledge of the more mundane nature of the world is lacking.
''Prerequisite:'' Must be a [[Pavanno]], Must also choose to be a [[Psion]].
''Bonus:'' You get 2 extra power points.
''Penalty:'' You have a -1 penalty on all Survival and Appraise checks.
The only naturally sentient life in the world of Omnia Psionic is Humanity. However, there are a great number of subraces of humanity, each with their particular background quirks and choices. Each subrace of humanity hails from a different region of the world, and thus will have access to a different set of [[Languages]] and [[Background Feats]].
The basic Racial Traits common to all of humanity is as follows:
*Medium: As Medium creatures, humans have no special bonuses or penalties due to their size.
*Human base land speed is 30 feet.
*1 background feat from those available to his or her subrace (with added class requirements).
*1 extra feat at 1st level.
*4 extra skill points at 1st level and 1 extra skill point at each additional level.
*Automatic Language: Varies from subrace to subrace. Bonus Languages: Varies from subrace to subrace.
*Starting Classes: Varies from subrace to subrace.
*Favored Class: Any. When determining whether a multiclass human takes an experience point penalty, his or her highest-level class does not count.
!Subraces
<<list byTag "Subrace">>
Spoken by the [[Zulavic]]s of [[Prozhiski]]. Speakers of Protsadiy can make an Intelligence check at a DC of 28 to understand a sentence of [[Zulaviy]] or [[Zdomishtiy]], and at a DC of 30 to understand [[Bishoy]].
Prozhiska is the most settled of the [[Zulavya Highlands]], and covers the heavily forested southern steppes of the highlands, some 301,630 square miles. It is also home to [[Demnomoy]], the only [[Zulavic]] city. Prozhiska, and the Zulavics that live there have a tenuous relationship with [[Tebir Nat]] to the south. Many of the tribes and clans of Zulavic routinely raid the farming villages of Tebir Nat, and are often a menace. On the other hand, many of the other Zulavic tribes have secured alliances with the northern kings of Tebir Nat, and help to defend against their very own cousins. Also, Zulavics produce the highest quality of wool in the world, and it can only be purchased in the heavily fortified Demnomoy. The kings of Tebir Nat are rarely capable of uniting to attack, nor do the [[Tuzanar]] really wish to live in the frigid highlands.
!Environment
!Tribes
!Relations
!Economy
!History
!Culture
The cooperative study of Psionics has existed in some form since the beginning of time. Academies for the advancement of Psionics exist in the [[Ilua Mainland]], the [[Tuznali Mainland]], the [[Nethrini Peninsula]], and the [[Pavana Coast]]. The students of these academies collectively refer to themselves as Psions.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Psion">>
You have taken up the role of //Mender//, and are capable of healing yourself and others much faster than normal.
''Prerequisite:'' Wilder level 1 or Egoist level 1.
''Benefit:'' As a Psi-like Ability, you can spend power points to heal yourself, or another, as per the table below. You can spend up to your manifester level in power points per use of this ability. This power takes a Standard Action to use, and has a range of Touch. You can only target one person per use of this ability. Metapsionic feats cannot modify this ability.{{rightfloat{
//Note that it is more cost effective to take your time with this power, taking 2 rounds to heal 2d8 for two power points, instead of 2d8 in one round for 3, etc. The situation may call for more rapid healing however.//
}}}
|!Healing|!Cost|!Healing|!Cost|
|1d8|1|2d10|4|
|1d12|2|3d8|5|
|2d8|3|3d10|6|
Warriors who harness their psionic abilities are known in the [[Nethrini Peninsula]], the [[Zulavya Highlands]], and the [[Pavana Coast]]. Rarely do these Psychic Warriors acquire more than a minimum of psionic training, instead preferring to let their instincts guide their abilities' growth.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Psychic Warrior">>
/***
|''Name:''|RSSReaderPlugin|
|''Description:''|This plugin provides a RSSReader for TiddlyWiki|
|''Version:''|1.1.1|
|''Date:''|Apr 21, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#RSSReaderPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#RSSReaderPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''Credit:''|BramChen for RssNewsMacro|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0|
|''OptionalRequires:''|http://www.tiddlytools.com/#NestedSlidersPlugin|
***/
//{{{
version.extensions.RSSReaderPlugin = {
major: 1, minor: 1, revision: 1,
date: new Date("Apr 21, 2007"),
source: "http://TiddlyWiki.bidix.info/#RSSReaderPlugin",
author: "BidiX",
coreVersion: '2.2.0'
};
config.macros.rssReader = {
dateFormat: "DDD, DD MMM YYYY",
itemStyle: "display: block;border: 1px solid black;padding: 5px;margin: 5px;", //useed '@@'+itemStyle+itemText+'@@'
msg:{
permissionDenied: "Permission to read preferences was denied.",
noRSSFeed: "No RSS Feed at this address %0",
urlNotAccessible: " Access to %0 is not allowed"
},
cache: [], // url => XMLHttpRequest.responseXML
desc: "noDesc",
handler: function(place,macroName,params,wikifier,paramString,tiddler) {
var desc = params[0];
var feedURL = params[1];
var toFilter = (params[2] ? true : false);
var filterString = (toFilter?(params[2].substr(0,1) == ' '? tiddler.title:params[2]):'');
var place = createTiddlyElement(place, "div", "RSSReader");
wikify("^^<<rssFeedUpdate "+feedURL+" [[" + tiddler.title + "]]>>^^\n",place);
if (this.cache[feedURL]) {
this.displayRssFeed(this.cache[feedURL], feedURL, place, desc, toFilter, filterString);
}
else {
var r = loadRemoteFile(feedURL,config.macros.rssReader.processResponse, [place, desc, toFilter, filterString]);
if (typeof r == "string")
displayMessage(r);
}
},
// callback for loadRemoteFile
// params : [place, desc, toFilter, filterString]
processResponse: function(status, params, responseText, url, xhr) { // feedURL, place, desc, toFilter, filterString) {
if (window.netscape){
try {
if (document.location.protocol.indexOf("http") == -1) {
netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
}
}
catch (e) { displayMessage(e.description?e.description:e.toString()); }
}
if (xhr.status == httpStatus.NotFound)
{
displayMessage(config.macros.rssReader.noRSSFeed.format([url]));
return;
}
if (!status)
{
displayMessage(config.macros.rssReader.noRSSFeed.format([url]));
return;
}
if (xhr.responseXML) {
// response is interpreted as XML
config.macros.rssReader.cache[url] = xhr.responseXML;
config.macros.rssReader.displayRssFeed(xhr.responseXML, params[0], url, params[1], params[2], params[3]);
}
else {
if (responseText.substr(0,5) == "<?xml") {
// response exists but not return as XML -> try to parse it
var dom = (new DOMParser()).parseFromString(responseText, "text/xml");
if (dom) {
// parsing successful so use it
config.macros.rssReader.cache[url] = dom;
config.macros.rssReader.displayRssFeed(dom, params[0], url, params[1], params[2], params[3]);
return;
}
}
// no XML display as html
wikify("<html>" + responseText + "</html>", params[0]);
displayMessage(config.macros.rssReader.msg.noRSSFeed.format([url]));
}
},
// explore down the DOM tree
displayRssFeed: function(xml, place, feedURL, desc, toFilter, filterString){
// Channel
var chanelNode = xml.getElementsByTagName('channel').item(0);
var chanelTitleElement = (chanelNode ? chanelNode.getElementsByTagName('title').item(0) : null);
var chanelTitle = "";
if ((chanelTitleElement) && (chanelTitleElement.firstChild))
chanelTitle = chanelTitleElement.firstChild.nodeValue;
var chanelLinkElement = (chanelNode ? chanelNode.getElementsByTagName('link').item(0) : null);
var chanelLink = "";
if (chanelLinkElement)
chanelLink = chanelLinkElement.firstChild.nodeValue;
var titleTxt = "!![["+chanelTitle+"|"+chanelLink+"]]\n";
var title = createTiddlyElement(place,"div",null,"ChanelTitle",null);
wikify(titleTxt,title);
// ItemList
var itemList = xml.getElementsByTagName('item');
var article = createTiddlyElement(place,"ul",null,null,null);
var lastDate;
var re;
if (toFilter)
re = new RegExp(filterString.escapeRegExp());
for (var i=0; i<itemList.length; i++){
var titleElm = itemList[i].getElementsByTagName('title').item(0);
var titleText = (titleElm ? titleElm.firstChild.nodeValue : '');
if (toFilter && ! titleText.match(re)) {
continue;
}
var descText = '';
descElem = itemList[i].getElementsByTagName('description').item(0);
if (descElem){
try{
for (var ii=0; ii<descElem.childNodes.length; ii++) {
descText += descElem.childNodes[ii].nodeValue;
}
}
catch(e){}
descText = descText.replace(/<br \/>/g,'\n');
if (desc == "asHtml")
descText = "<html>"+descText+"</html>";
}
var linkElm = itemList[i].getElementsByTagName("link").item(0);
var linkURL = linkElm.firstChild.nodeValue;
var pubElm = itemList[i].getElementsByTagName('pubDate').item(0);
var pubDate;
if (!pubElm) {
pubElm = itemList[i].getElementsByTagName('date').item(0); // for del.icio.us
if (pubElm) {
pubDate = pubElm.firstChild.nodeValue;
pubDate = this.formatDateString(this.dateFormat, pubDate);
}
else {
pubDate = '0';
}
}
else {
pubDate = (pubElm ? pubElm.firstChild.nodeValue : 0);
pubDate = this.formatDate(this.dateFormat, pubDate);
}
titleText = titleText.replace(/\[|\]/g,'');
var rssText = '*'+'[[' + titleText + '|' + linkURL + ']]' + '' ;
if ((desc != "noDesc") && descText){
rssText = rssText.replace(/\n/g,' ');
descText = '@@'+this.itemStyle+descText + '@@\n';
if (version.extensions.nestedSliders){
descText = '+++[...]' + descText + '===';
}
rssText = rssText + descText;
}
var story;
if ((lastDate != pubDate) && ( pubDate != '0')) {
story = createTiddlyElement(article,"li",null,"RSSItem",pubDate);
lastDate = pubDate;
}
else {
lastDate = pubDate;
}
story = createTiddlyElement(article,"div",null,"RSSItem",null);
wikify(rssText,story);
}
},
formatDate: function(template, date){
var dateString = new Date(date);
// template = template.replace(/hh|mm|ss/g,'');
return dateString.formatString(template);
},
formatDateString: function(template, date){
var dateString = new Date(date.substr(0,4), date.substr(5,2) - 1, date.substr(8,2)
);
return dateString.formatString(template);
}
};
config.macros.rssFeedUpdate = {
label: "Update",
prompt: "Clear the cache and redisplay this RssFeed",
handler: function(place,macroName,params) {
var feedURL = params[0];
var tiddlerTitle = params[1];
createTiddlyButton(place, this.label, this.prompt,
function () {
if (config.macros.rssReader.cache[feedURL]) {
config.macros.rssReader.cache[feedURL] = null;
}
story.refreshTiddler(tiddlerTitle,null, true);
return false;});
}
};
//}}}
This plugin provides a RSSReader for TiddlyWiki. If TiddlyWiki is viewed over HTTP, RSSReaderPlugin requires a ProxyService.
See examples : <<tag RSSFeed>>.
See documentation : RSSReaderPluginDoc
if NestedSlidersPlugin is available, item contents are folded.
//last update: RSSReaderPlugin v 1.1.1//
!Description
This plugin provides a RSSReader for TiddlyWiki
* It accesses asynchronously an RSSFeed
*Depending on the chanel item format, each item could be written as :
**simple text wikified
**html
!Usage
{{{
<<rssReader noDesc|asHtml|asText rssUrl ['filtering string']>>
noDesc: only title of item is printed
asHtml: if you know that description contain html (links, img ...),
the text is enclosed with <html> </html> tags
asText: if the description should not be interpreted as html the
description is wikified
rssUrl: the rssFeed url that could be accessed.
'filtering string': if present, the rssfeed item title must contained
this string to be displayed.
If 'filering string' contained space characters only, the tiddler
title is used for filtering.
}}}
For security reasons, if the TiddlyWiki is accessed from http, a ProxyService should be used to access an rssFeed from an other site.
!examples
| !reader | !RSSFeed type | !working from |
| BidiXTWRSS | Description asHtml | file: or tiddlywiki.bidix.info |
| [[Le Monde]] | Description asText | file: or tiddlywiki.bidix.info using proxy |
| YahooNewsSport | Description asHtml | file: or tiddlywiki.bidix.info using proxy |
| TiddlyWikiRSS | Description asHtml | file: or tiddlywiki.bidix.info using proxy |
| [[Libération]] | noDesc | file: or tiddlywiki.bidix.info using proxy |
| [[TestComment]] | asText and filters | file: or tiddlywiki.bidix.info using proxy |
see : <<tag RSSFeed>> for the full list.
!Revision history
* V1.1.0 (2207/04/13)
**No more import functions
* V1.0.0 (2006/11/11)
**refactoring using core loadRemoteFile function
**import using new tiddlywiki:tiddler element
**import and presentation preserved without EricShulman's NestedSliderPlugin
**better display of items
* v0.3.0 (24/08/2006)
** Filter on RSS item title
** Place to display redefined for asynchronous processing
* v0.2.2 (22/08/2006)
**Haloscan feed has no pubDate.
* v0.2.1 (08/05/2006)
* v0.2.0 (01/05/2006)
**Small adapations for del.icio.us feed
* v0.1.1 (28/04/2006)
**Bug : Channel without title
* v0.1.0 (24/04/2006)
** initial release
At any time, a player can choose to make a ‘raise’ before rolling any d20 check. The terms of the raise are up to the player, but the GM can either accept (by saying “Roll”) or decline (“no bet”).
There are no limits on what a player can propose, but the GM always has the power to decline. If the GM thinks the odds are too much in favour of the PC (such as situation 2) the GM isn’t ready for one or both consequences (situation 4), they can call “no bet.”
Making a raise does not change anything about the original roll; calculation of target numbers and modifiers are left to the standard rules. Raises based on strong odds can be declined; those raises should involve unequal terms before the GM accepts them (this could be the difference
between the situation 5 and 6).
Raises can also be used to bypass mechanics that feel tedious (situation 7).
Note that the GM takes on a greater responsibility of fairness when using raises. The GM needs to make sure that he accepts raises in a way that is fair to all the players – that means declining and accepting raises with the same principles regardless of which player proposed it.
This is the variant Ranger class used in Omnia Psionic:
''Alignment:'' any
''Hit Dice:'' d8
''Class Skills:'' Climb (Str), Craft (Int), Handle Animal (Cha), Heal (Wis), Hide (Dex), Jump (Str), Knowledge (Geography) (Int), Knowledge (Nature) (Int), Listen (Wis), Move Silently (Dex), Profession (Wis), Ride (Dex), Search (Int), Spot (Wis), Survival (Wis), Swim (Str), Tumble (Dex), and Use Rope (Dex).
''Skill Points at 1st Level:'' (6 + int modifier) x4.
''Skill Points at Each Additional Level:'' 6 + int modifier.
|!Level|!BAB|!Fort|!Ref|!Will|!Special|
|1st|+1|+2|+1|+0|Terrain Familiarity, Track|
|2nd|+2|+3|+2|+0|Endurance|
|3rd|+3|+3|+2|+1|Light Step|
|4th|+4|+4|+2|+1|Bonus Feat|
|5th|+5|+4|+3|+1|Terrain Advantage|
|6th|+6/+1|+5|+3|+2|Terrain Familiarity, Natural Stealth|
|7th|+7/+2|+5|+4|+2|Evasion|
|8th|+8/+3|+6|+4|+2|Bonus Feat|
|9th|+9/+4|+6|+4|+3|Greater Track|
|10th|+10/+5|+7|+5|+3||
|11th|+11/+6/+1|+7|+5|+3|Terrain Familiarity|
|12th|+12/+7/+2|+8|+6|+4|Bonus Feat|
|13th|+13/+8/+3|+8|+6|+4||
|14th|+14/+9/+4|+9|+6|+4|Trackless Step|
|15th|+15/+10/+5|+9|+7|+5||
|16th|+16/+11/+6/+1|+10|+7|+5|Bonus Feat, Terrain Familiarity|
|17th|+17/+12/+7/+2|+10|+8|+5|Improved Evasion|
|18th|+18/+13/+8/+3|+11|+8|+6|Silent Step|
|19th|+19/+14/+9/+4|+11|+8|+6||
|20th|+20/+15/+10/+5|+12|+9|+6|Bonus Feat|
''Weapon and Armor Proficiency:'' Rangers are proficient with all simple and martial weapons, light armor, and with shields (except tower shields).
''Bonus Feats:'' At 4th, 8th, 12th, 16th and 20th levels, a ranger receives a bonus feat. The ranger may select from the following list and must meet any prerequisites: Alertness, Athletic, Diehard, Endurance, Far Shot, Great Fortitude, Improved Precise Shot, Iron Will, Lightning Reflexes, Manyshot, Precise Shot, Pointblank Shot, Rapid Reload, Rapid Shot, Run, Self-Sufficient, Shot on the Run and Toughness.
''Endurance:'' A ranger gains Endurance as a bonus feat at 2nd level.
''Light Step (Ex):'' Starting at 3rd level, the Ranger becomes more difficult for others to track. He is considered two size categories smaller than his actual size for the purpose of determining the Survival DC needed to find and follow his trail.
''Terrain Advantage (Ex):'' Starting at 5th level, a Ranger can use his surroundings to hamper the attacks of his enemies. When fighting in one of his favored terrains, he gains a +2 dodge bonus to his armor class.
''Terrain Familiarity (Ex):'' at first level and every 5 levels thereafter, the ranger adds a new terrain environment to their repertoire from those given below. Terrain familiarity gives a ranger a bonus on checks involving a skill useful in that terrain, or some other appropriate benefit. A ranger also knows how to fight dangerous creatures typically found in that terrain, gaining a +1 insight bonus on attack rolls and damage rolls against creatures with that terrain mentioned in the environment entry of their descriptions. The ranger only gains the bonus if the creature description specifically lists the terrain type. Rangers also receive a +2 insight bonus on survival checks to track such creatures as well as to bluff, diplomacy, intimidate and sense motive checks.
A ranger may choose to select the same terrain multiple times. each time he or she does, the bonuses to attack, damage and skill checks increase by 1.
//Aquatic (Cold):// You gain a +4 insight bonus on swim checks or a +10-foot bonus to your swim speed if you have one in this terrain.
//Desert (Fire):// You gain a +3 insight bonus to resist fatigue and dehydration in this terrain.
//Forest:// You have a +3 insight bonus on hide checks in this terrain.
//Hills:// You gain a +3 insight bonus on listen checks in this terrain.
//Marsh (Acid):// You have a +3 insight bonus on move silently checks in this terrain.
//Mountains:// You gain a +3 insight bonus on climb checks, or a +10- foot bonus to your climb speed if you have one in this terrain.
//Plains:// You have a +3 insight bonus on spot checks in this terrain.
//Underground:// You have a +2 insight bonus on climb checks and listen checks in this terrain.
''Track:'' A ranger gains Track as a bonus feat.
''Wild Empathy (Ex):'' A ranger can improve the attitude of an animal. This ability functions just like a diplomacy check to improve the attitude of a person. The ranger rolls 1d20 and adds his ranger level and his charisma bonus to determine the wild empathy check result. The typical domestic animal has a starting attitude of indifferent, while wild animals are usually unfriendly.
To use wild empathy, the ranger and the animal must be able to study each other, which means that they must be within 30 feet of one another under normal visibility conditions. Generally, influencing an animal in this way takes 1 minute, but, as with influencing people, it might take more or less time.
the ranger can also use this ability to influence a magical beast with an intelligence score of 1 or 2, but he takes a –4 penalty on the check.
''Woodland Stride (Ex):'' Starting at 3rd level, a ranger may move through any sort of undergrowth (such as natural thorns, briars, overgrown areas, and similar terrain) at his normal speed and without taking damage or suffering any other impairment.
however, thorns, briars, and overgrown areas that are enchanted or magically manipulated to impede motion still affect him
''Improved Track:'' Beginning at 4th level, a ranger can move at his normal speed while following tracks without taking the normal –5 penalty. He takes only a –10 penalty (instead of the normal –20) when moving at up to twice normal speed while tracking.
''Natural Stealth (Ex):'' At 6th level, a ranger can use the hide skill in any sort of natural terrain, even if the terrain doesn’t grant cover or concealment. At 14th level, a ranger can use the hide skill in any natural terrain even while being observed.
''Evasion (ex):'' At 7th level, a ranger can avoid even magical and unusual attacks with great agility. If he makes a successful reflex saving throw against an attack that normally deals half damage on a successful save, he instead takes no damage. evasion can be used only if the ranger is wearing light armor or no armor. A helpless ranger does not gain the benefit of evasion.
''Greater Track:'' Beginning at 9th level, a ranger becomes so certain in the use of the survival skill that she can use it reliably even under adverse conditions.
When making a survival check, she may take 10 even if stress and distractions would normally prevent her from doing so.
''Trackless Step (Ex):'' Starting at 14th level, a Ranger leaves no trail in natural surroundings and cannot be tracked. She may choose to leave a trail if so desired.
''Improved Evasion (Ex):'' This ability works like evasion, except that while the ranger still takes no damage on a successful reflex saving throw against attacks henceforth she henceforth takes only half damage on a failed save. A helpless ranger does not gain the benefit of improved evasion. A ranger receives this ability at 17th level.
''Silent Step (Ex):'' Starting at 18th level, a Ranger can move very quietly when moving through one of his favored terrains, providing a +5 insight bonus to Move Silently checks in such conditions.
When a player spends Conviction, they’re saying “Hey, this is important to me. I want my character to have been the one that pulled this off - or at least, put everything into trying.”
When a player raises the Death flag, they’re saying “This is worth staking my character’s life on.”
When a player Raises they’re saying “Hey, I have an idea to make this more exciting. What do you think?”
When a GM says “no bet” they’re usually saying “Cool idea, but I’m not quite ready for that to happen right now.”
<<showUpdates excludeTag:system>>
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://solo.dc3.com/tw/|
|''Description:''|Bob Denny's extensions to TiddlyWiki|
|''Author:''|BobDenny|
|''Workspace:''|(default)|
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #99f solid; padding-left:0.2em; color:#33f;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
!Civilized Regions
<<list byTag "Region" "Civilized">>
!Unexplored Territory
<<list byTag "Region" "Unexplored">>
!Seas and Oceans
<<list byTag "Region" "Seas">>
Rogues, much like Fighters, are known throughout the world. Rogues easily find occupations as thieves, thugs, investigators, spies, and scouts, to name just a few of their many choices.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Rogue">>
''Prerequisite:'' Rogue 6th level.
''Benefit:'' Choose 1 Rogue Special Ability. You gain that ability. This feat can only be gained once.
/***
|''Name:''|saveClose |
|''Version:''|Revision: 1.1.1, 2006-04-10|
|''Source:''|http://knighjm.googlepages.com/knightnet-default-tw.html|
|''Author:''|[[Julian Knight]]|
|''Type:''|Toolbar Macro Extension|
|''Requires:''|TiddlyWiki 2.0.0 or higher|
!Description
Extends the TiddlyWiki commands for the toolbar macro by adding a button to save and then close the tiddler immediately.
It simply duplicates and mashes the code from the two pre-defined commands SaveTiddler and closeTiddler.
!History
|!2006-04-10 - 1.1.1|Minor improvements to versioning, no code changes, improve description and history|
|!2006-04-07 - 1.1|Amended "source" and move master copy to my Google web space|
|!2006-03-30 - 1.0|First release|
!Useage
Add to your EditTemplate, e.g.:
{{{
<!-- ********* -->
<div class='toolbar' macro='toolbar +saveTiddler saveClose -cancelTiddler deleteTiddler closeTiddler'></div>
}}}
It does a save followed by a close.
!Code
***/
//{{{
version.extensions.saveClose = {
major: 1, minor: 1, revision: 1, date: new Date("Apr 10, 2006"), type: 'macro',
source: 'http://knighjm.googlepages.com/knightnet-default-tw.html#saveClose'
};
config.commands.saveClose = {
text: "save/close", tooltip: "Save then close this tiddler"
}
config.commands.saveClose.handler = function(event,src,title) {
var newTitle = story.saveTiddler(title,event.shiftKey);
story.closeTiddler(title,true,event.shiftKey || event.altKey);
// story.displayTiddler(null,newTitle);
return false;
}
//}}}
/***
This plugin is released under the "Do whatever you like at your own risk" license.
***/
{{mapfloat{
[img[http://img386.imageshack.us/img386/1900/seaofimnerubr6.jpg]]
}}}
<<showUpdates onlyTag:RecentUpdates maxEntries:8>>
{{{<<showUpdates onlyTag:RecentUpdates maxEntries:8>>}}}
----
<<showUpdates onlyTag:RecentUpdates write:'(index==0? countLine + "\n{{blog{\n":"")+(index<8?"!!![["+tiddler.title+"]]@@color:#999;font-size:70%;" +tiddler.modified.formatString(" - DD/MM/YY")+"@@\n" +"{{excerpt{\n"+tiddler.text.substr(0,100)+"...\n[[read more...|"+tiddler.title+"]]\n}}}\n":"")+(index==count-1?"}}}":"")' >>
{{{
<<showUpdates
onlyTag:RecentUpdates
write:
'(index==0? countLine + "\n{{blog{\n":"")+
(index<8?"!!![["+tiddler.title+"]]@@color:#999;font-size:70%;" +tiddler.modified.formatString(" - DD/MM/YY")+"@@\n" +"{{excerpt{\n"+tiddler.text.substr(0,100)+"...\n[[read more...|"+tiddler.title+"]]\n}}}\n":"")+
(index==count-1?"}}}":"")'
>>
}}}
this one requires the following css in your StyleSheet:
//{{{
.blog h2, .blog h3, .blog h4{
margin:0;
padding:0;
border-bottom:none;
}
.blog {margin-left:1.5em;}
.blog .excerpt {
margin:0;
margin-top:0.3em;
padding: 0;
margin-left:1em;
padding-left:1em;
font-size:90%;
border-left:1px solid #ddd;
}
//}}}
/***
|Name|ShowUpdatesPlugin|
|Created by|SaqImtiaz|
|Version|0.2 |
|Requires|~TW2.x|
!!!Description:
Allows you to list tiddlers that have changed since the users last visit. You can list only all changed tiddlers, or filter them to only show tiddlers that have or do not have a specific tag. By default a simple list of the titles of changed tiddlers is created. However, using an extremely versatile syntax you can provide a custom template for the generated text.
!!!Examples:
[[ShowUpdatesDocs]]
!!!Installation:
Copy the contents of this tiddler to your TW, tag with systemConfig, save and reload your TW.
!!!Syntax:
{{{<<showUpdates>>}}}
additional optional params:
{{{<showUpdates excludeTag:TagToExclude onlyTag:TagToList maxEntries:10 write:CustomWriteParameter >>}}}
excludeTag: ~TagToExclude
onlyTag: ~TagToList
maxEntries: max number of entries displayed when there are no updates. (default is 10, which can be changed in the config.macros.showUpdates.settings part of the code)
write: if a write parameter is not provided, an un-numbered list of the updates is generated. Alternatively, you can specify a custom 'template' for the text generated. The syntax for the write parameter is identical to that of the forEachTiddler macro. Additonal documentation on this syntax will be provided soon.
Some of the variables available in the write parameter are 'index', 'count' and 'lastVisit' where lastVisit is the date of the last visit in the format YYYYMMDDHHMM. Also areUpdates is a boolean that is true if there are new updates since the users last visit.
!!!To Do:
*refactor code to facilitate translations
*a streamlined version without the custom write parameter
!!!Code
***/
//{{{
window.lewcidLastVisit = '';
window.old_lewcid_whatsnew_restart = window.restart;
window.restart = function()
{
if(config.options.txtLastVisit)
lewcidLastVisit= config.options.txtLastVisit;
config.options.txtLastVisit = (new Date()).convertToYYYYMMDDHHMM();
saveOptionCookie('txtLastVisit');
window.old_lewcid_whatsnew_restart();
}
TiddlyWiki.prototype.lewcidGetTiddlers = function(field,excludeTag,includeTag,updatesOnly)
{
var results = [];
this.forEachTiddler(function(title,tiddler)
{
if(excludeTag == undefined || !tiddler.isTagged(excludeTag))
if(includeTag == undefined || tiddler.isTagged(includeTag))
if ( updatesOnly == false || tiddler.modified.convertToYYYYMMDDHHMM()>lewcidLastVisit)
results.push(tiddler);
});
if(field)
results.sort(function (a,b) {if(a[field] == b[field]) return(0); else return (a[field] < b[field]) ? -1 : +1; });
return results;
}
config.macros.showUpdates={};
config.macros.showUpdates.settings =
{
maxEntries: 10 //max items to show, if there are no updates since last visit
}
config.macros.showUpdates.handler = function(place,macroName,params,wikifier,paramString,tiddler)
{
var args = paramString.parseParams("list",null,true);
var write = getParam(args, "write", undefined);
var onlyTag = getParam(args, "onlyTag", undefined);
var excludeTag = getParam(args, "excludeTag", undefined);
var sortBy = "modified";
var maxEntries = getParam(args,"maxEntries",this.settings.maxEntries);
if (lewcidLastVisit)
{var tiddlers = store.lewcidGetTiddlers(sortBy,excludeTag,onlyTag,true);
var areUpdates = tiddlers.length>0? true:false;}
if (!lewcidLastVisit)
{var countLine = "!!Recent Updates:";
var tiddlers = store.lewcidGetTiddlers(sortBy,excludeTag,onlyTag,false);
var areUpdates = false;}
else if (tiddlers.length == 0)
{var countLine = "!!@@color:red;No new updates@@ since your last visit. @@color:#999;font-size:70%;" + (Date.convertFromYYYYMMDDHHMM(lewcidLastVisit)).formatString(" (DD/MM/YY)") + "@@\n!!Recent Updates:";
var tiddlers = store.lewcidGetTiddlers(sortBy,excludeTag,onlyTag,false);}
else
{var countLine ="!!@@color:red;"+ tiddlers.length + "@@ new " + (tiddlers.length==1?"update":"updates") + " since your last visit: @@color:#999;font-size:70%;" + (Date.convertFromYYYYMMDDHHMM(lewcidLastVisit)).formatString(" (DD/MM/YY)") + "@@";}
tiddlers = tiddlers.reverse();
var lastVisit = lewcidLastVisit? lewcidLastVisit:undefined;
var count = areUpdates == true? tiddlers.length : maxEntries;
var sp = createTiddlyElement(place,"span","showUpdates");
if (write==undefined)
{
wikify(countLine,sp);
var list = createTiddlyElement(sp,"ul");
for (var i = 0; i < count; i++)
{
var tiddler = tiddlers[i];
createTiddlyLink(createTiddlyElement(list,"li"), tiddler.title, true);
}
}
else
{
var list = '';
for (var index = 0; index < count; index++) {
var tiddler = tiddlers[index];
list += eval(write); }
wikify(list, sp);
}
}
//}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY">><<upload http://omniapsionic.tiddlyspot.com/store.cgi index.html . . omniapsionic>><html><a href='http://omniapsionic.tiddlyspot.com/download' class='button'>download</a></html><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">><<calendar thismonth>>
/***
|Name|SidebarWithBackstagePlugin|
|Created by|JeffSheets|
|Version|0.1|
|Requires|~TW2.2.4|
!Description:
Hides the Sidebar when the Backstage is hidden, and shows it when the Backstage is shown.
!History
*07-13-07: version 0.1: First Version.
!Code
***/
//{{{
var old_backstage_show = backstage.show
var old_backstage_hide = backstage.hide
backstage.show = function() {
this.area.style.display = "block";
if(anim && config.options.chkAnimate) {
backstage.toolbar.style.left = findWindowWidth() + "px";
var p = [
{style: "left", start: findWindowWidth(), end: 0, template: "%0px"}
];
anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p));
} else {
backstage.area.style.left = "0px";
}
this.showButton.style.display = "none";
this.hideButton.style.display = "block";
config.options.chkBackstage = true;
saveOptionCookie("chkBackstage");
addClass(this.content,"backstageVisible");
document.getElementById('sidebar').style.display="block";
document.getElementById('displayArea').style.marginRight="17em";
}
backstage.hide = function() {
if(this.currTabElem) {
this.switchTab(null);
} else {
backstage.toolbar.style.left = "0px";
if(anim && config.options.chkAnimate) {
var p = [
{style: "left", start: 0, end: findWindowWidth(), template: "%0px"}
];
var c = function(element,properties) {backstage.area.style.display = "none";};
anim.startAnimating(new Morpher(backstage.toolbar,config.animDuration,p,c));
} else {
this.area.style.display = "none";
}
this.showButton.style.display = "block";
this.hideButton.style.display = "none";
config.options.chkBackstage = false;
saveOptionCookie("chkBackstage");
removeClass(this.content,"backstageVisible");
document.getElementById('sidebar').style.display="none";
document.getElementById('displayArea').style.marginRight="1em";
}
}
//if(config.options.chkBackstage) {
// document.getElementById('sidebar').style.display="block";
// document.getElementById('displayArea').style.marginRight="18em";
//} else {
// document.getElementById('sidebar').style.display="none";
// document.getElementById('displayArea').style.marginRight="1em";
//}
//}}}
//{{{
config.options.chkAnimate = false;
config.views.wikified.defaultText = "The tiddler '%0' doesn't yet exist."
//}}}
''Prerequisite:'' 6th Level.
''Bonus:'' Pick any single skill you have ever had as a class skill. Your max ranks rise to 11.
Soulknives are trained in many of the Psionic Academies of the [[Nethrini Peninsula]]. Many choose to work as mercenaries, bodyguards, assassins, or military leaders.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Soulknife">>
/*{{{*/
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:1px; top:1px;}
#mainMenu {width:12em;text-align: center;}
#mainMenu .tiddlyLinkNonExisting,
#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#mainMenu .tiddlyLinkExisting,
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}
.headerShadow {position:relative; padding:1em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:1em 0em 1em 1em; left:0px; top:0px;}
.mapfloat {float: left; width: 400px; border: 0px; padding: 0em; margin:0.5em 0.5em 0.1em 0.5em; background: #fff;}
.leftfloat {float: left; width: 25em; border: 1px solid #000; padding: 1em; margin:0.5em 0.5em 0.1em 0.5em; background: #fff;}
.leftfloat h1:first-child {margin-top:0em;}
.rightfloat {float: right; width: 25em; border: 1px solid #000; padding: 1em; margin: 0.5em 0.5em 0.1em 0.5em; background: #fff;}
.rightfloat h1:first-child {margin-top:0em;}
.leftcolumnfloat {float: left; width: 50%; padding: 0em; background: #fff;}
.rightcolumnfloat {float: right; width: 50%; padding: 0em; background: #fff;}
.clearfloat {clear: both;}
.toolbar {float: right;}
body {font-family:"Georgia Ref",Georgia,serif;}
.viewer {padding-left:1em;}
.viewer p {padding-top:0.2em;}
.siteTitle {font-size:3em;font-weight:bold;}
.siteSubtitle {font-size:1.2em;font-weight:bold;}
/*}}}*/
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #009 solid; padding-left:0.2em; color:#009;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<<timeline better:true excludeTag:noTimeLine sortBy:modified maxDays:7 maxEntries:20>>
/***
|''Name:''|TaggedList |
|''Version:''|Revision: 1.1.1, 2007-06-21|
|''Author:''|[[Jeff Sheets]]|
This plugin is released under the "Do whatever you like at your own risk" license.
!Example
{{{<<list byTag "systemConfig">>}}} produces:
<<list byTag "systemConfig">>
!Code
***/
//{{{
version.extensions.taggedList = {
major: 1, minor: 1, revision: 1, date: new Date("Jun 21, 2007"), type: 'macro'
};
config.macros.list.byTag = {};
config.macros.list.noTag = {};
config.macros.list.byTag.prompt = "";
config.macros.list.noTag.prompt = "";
store.dualLookup = function(lookupField,lookupValue,lookupValue2,lookupMatch,sortField)
{
var results = [];
this.forEachTiddler(function(title,tiddler) {
var f = !lookupMatch;
var matches = 0;
for(var lookup=0; lookup<tiddler[lookupField].length; lookup++) {
if(tiddler[lookupField][lookup] == lookupValue)
matches += 1;
if(tiddler[lookupField][lookup] == lookupValue2)
matches += 1;
}
if (matches == 2)
f = lookupMatch;
if(f)
results.push(tiddler);
});
if(!sortField)
sortField = "title";
results.sort(function(a,b) {return a[sortField] < b[sortField] ? -1 : (a[sortField] == b[sortField] ? 0 : +1);});
return results;
};
config.macros.list.byTag.handler = function(params) {
var byTag = params[1] ? params[1] : "systemConfig";
var byTag2 = params[2];
if (byTag2 != undefined) {
return store.dualLookup("tags",byTag,byTag2,true,"title");
} else {
return store.reverseLookup("tags",byTag,true,"title");
}
}
config.macros.list.noTag.handler = function(params) {
var byTag = params[1] ? params[1] : "systemConfig";
return store.reverseLookup("tags",byTag,false,"title");
}
//}}}
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Version|1.1.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.chooseTemplateForTiddler()|
|Description|use alternative ViewTemplate/EditTemplate for tiddler's tagged with specific tag values|
The core function, "story.chooseTemplateForTiddler(title,template)" is essentially a "pass-thru" that returns the same template it was given, and is provided by the core so that plugins can customize the template selection logic to select alternative templates, based on whatever programmatic criteria is appropriate. This tweak extends story.chooseTemplateForTiddler() so that ''whenever a tiddler is marked with a specific tag value, it can be viewed and/or edited using alternatives to the standard tiddler templates.''
!!!!!Usage
<<<
Each alternative template is associated with a specific tiddler tag value by using that tag value as a prefix added to the standard TiddlyWiki template titles, [[ViewTemplate]] and [[EditTemplate]].
For example, any tiddlers that are tagged with ''<<tag media>>'' will look for alternative templates named [[mediaViewTemplate]] and [[mediaEditTemplate]]. Additionally, in order to find templates that have proper WikiWord tiddler titles (e.g., [[MediaViewTemplate]] and [[MediaEditTemplate]]), the plugin will also attempt to use a capitalized form of the tag value (e.g., ''Media'') as a prefix. //This capitalization is for comparison purposes only and will not alter the actual tag values that are stored in the tiddler.//
If no matching alternative template can be found by using //any// of the tiddler's tags (either "as-is" or capitalized), the tiddler defaults to using the appropriate standard [[ViewTemplate]] or [[EditTemplate]] definition.
''To add your own custom templates:''
>First, decide upon a suitable tag keyword to uniquely identify your custom templates and create custom view and/or edit templates using that keyword as a prefix (e.g., "KeywordViewTemplate" and "KeywordEditTemplate"). Then, simply create a tiddler and tag it with your chosen keyword... that's it! As long as the tiddler is tagged with your keyword, it will be displayed using the corresponding alternative templates. If you remove the tag or rename/delete the alternative templates, the tiddler will revert to using the standard viewing and editing templates.
<<<
!!!!!Examples
<<<
|Sample tiddler| tag | view template | edit template |
|[[MediaSample - QuickTime]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[MediaSample - Windows]]| <<tag media>> | [[MediaViewTemplate]] | [[MediaEditTemplate]] |
|[[CDSample]]| <<tag CD>> | [[CDViewTemplate]] | [[CDEditTemplate]] |
|<<newTiddler label:"create new task..." title:SampleTask tag:task text:"Type some text and then press DONE to view the task controls">> | <<tag task>> | [[TaskViewTemplate]] | [[EditTemplate]] |
//(note: if these samples are not present in your document, please visit// http://www.TiddlyTools.com/ //to view these sample tiddlers on-line)//
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
[[TaggedTemplateTweak]]
<<<
!!!!!Revision History
<<<
''2007.06.23 [1.1.0]'' re-written to use automatic 'tag prefix' search instead of hard coded check for each tag. Allows new custom tags to be used without requiring code changes to this plugin.
''2007.06.11 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by Eric L Shulman / ELS Design Studios
<<<
!!!!!Code
***/
//{{{
version.extensions.taggedTemplate= {major: 1, minor: 1, revision: 0, date: new Date(2007,6,18)};
Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
// get default template from core
var template=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
// if the tiddler to be rendered doesn't exist yet, just return core result
var tiddler=store.getTiddler(title); if (!tiddler) return template;
// look for template whose prefix matches a tag on this tiddler
for (t=0; t<tiddler.tags.length; t++) {
var tag=tiddler.tags[t];
if (store.tiddlerExists(tag+template)) { template=tag+template; break; }
// try capitalized tag (to match WikiWord template titles)
var cap=tag.substr(0,1).toUpperCase()+tag.substr(1);
if (store.tiddlerExists(cap+template)) { template=cap+template; break; }
}
return template;
}
//}}}
Deep forests and hilly terrain cover the 1,007,000 square miles of Tebir Nat. Separated into numerous kingdoms, city-states, and other holdings, Tebir Nat is rarely considered as a whole. The nobles of Tebir Nat trace their lineage separately from those of [[Inzur Nat]], believing their ancestors to be very distantly related. Despite the local political intrigue, the kings of Tebir Nat rarely interfere with politics in Inzur Nat, though the occasional war does break out when one king disparages another. Tebir Nat is frequently raided by barbarian [[Zulavic]] tribes from the north, but otherwise maintains good relations with the one major merchant city of the [[Zulavya Highlands]].
!Environment
!Kingdoms, City-states
!Relations
!Economy
!History
!Culture
The native language of the [[Nesherim]] of [[Dassura]] and [[Elarnuz]]. Speakers of Tekhranu can make an Intelligence check at a DC of 28 to understand a sentence of [[Nethrinu]], and at a DC of 26 to understand a sentence of [[Atlathtu]].
The death flag is definitely designed for campaigns where characters can’t come back from the dead. This lets those campaigns get rid of random lethality without eliminating death altogether as a possibility. This is done with a change in the “social contract” between players and GM. Whereas in standard D&D the player is at the mercy of the GM and the rules, with the death flag the player decides when the stakes of a conflict are life and death.
As an Immediate action, a player character can choose to raise his Death Flag and gain 6 Conviction instantly (even if this brings their total Conviction pool above 6).
When the death flag is raised, the normal rules for death apply. If the death flag has not been raised, then the character, if killed, is treated as reducing the player character to 1 hit point above death. The Death Flag can be lowered by spending 6 Conviction.
A 'tiddler' is the name given to a unit of MicroContent in TiddlyWiki.
Tiddlers are pervasive in TiddlyWiki. The MainMenu is defined by a tiddler, plugins are delivered in tiddlers, there are special StyleSheet tiddlers, and so on.
Other systems have analogous concepts with more prosaic names: like "items", "entries", "entities". Even though "tiddler" is undoubtedly a silly name it at least has the virtue of being confusingly distinctive rather than confusingly generic.
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://tiddlystyles.com/|
|''Workspace:''|(default)|
|''URL:''|http://omniapsionic.tiddlyspot.com/proxy/http://www.tiddlytools.com/|
|''Description:''|Small Tools for Big Ideas!|
|''Author:''|EricShulman|
|''Workspace:''|(default)|
[[TiddlyWiki|http://www.tiddlywiki.com]] is a complete [[wiki|http://en.wikipedia.org/wiki/Wiki]] in a single HTML file. It contains the entire text of the wiki, and all the ~JavaScript, CSS and HTML goodness to be able to display it, and let you edit it or search it. Without needing a server.
~TiddlyWiki is published under an [[OpenSourceLicense|http://www.tiddlywiki.com/#OpenSourceLicense]] and maintained by a busy [[Community|http://www.tiddlywiki.com/#Community]] of independent developers.
/***
Contains the stuff you need to use Tiddlyspot
Note you must also have UploadPlugin installed
***/
//{{{
// edit this if you are migrating sites or retrofitting an existing TW
config.tiddlyspotSiteId = 'omniapsionic';
// make it so you can by default see edit controls via http
config.options.chkHttpReadOnly = false;
window.readOnly = false; // make sure of it (for tw 2.2)
// disable autosave in d3
if (window.location.protocol != "file:")
config.options.chkGTDLazyAutoSave = false;
// tweak shadow tiddlers to add upload button, password entry box etc
with (config.shadowTiddlers) {
SiteUrl = 'http://'+config.tiddlyspotSiteId+'.tiddlyspot.com';
SideBarOptions = SideBarOptions.replace(/(<<saveChanges>>)/,"$1<<tiddler TspotSidebar>>");
OptionsPanel = OptionsPanel.replace(/^/,"<<tiddler TspotOptions>>");
DefaultTiddlers = DefaultTiddlers.replace(/^/,"[[Welcome to Tiddlyspot]] ");
MainMenu = MainMenu.replace(/^/,"[[Welcome to Tiddlyspot]] ");
}
// create some shadow tiddler content
merge(config.shadowTiddlers,{
'Welcome to Tiddlyspot':[
"This document is a ~TiddlyWiki from tiddlyspot.com. A ~TiddlyWiki is an electronic notebook that is great for managing todo lists, personal information, and all sorts of things.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //What now?// @@ Before you can save any changes, you need to enter your password in the form below. Then configure privacy and other site settings at your [[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]] (your control panel username is //" + config.tiddlyspotSiteId + "//).",
"<<tiddler TspotControls>>",
"See also GettingStarted.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working online// @@ You can edit this ~TiddlyWiki right now, and save your changes using the \"save to web\" button in the column on the right.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Working offline// @@ A fully functioning copy of this ~TiddlyWiki can be saved onto your hard drive or USB stick. You can make changes and save them locally without being connected to the Internet. When you're ready to sync up again, just click \"upload\" and your ~TiddlyWiki will be saved back to tiddlyspot.com.",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Help!// @@ Find out more about ~TiddlyWiki at [[TiddlyWiki.com|http://tiddlywiki.com]]. Also visit [[TiddlyWiki Guides|http://tiddlywikiguides.org]] for documentation on learning and using ~TiddlyWiki. New users are especially welcome on the [[TiddlyWiki mailing list|http://groups.google.com/group/TiddlyWiki]], which is an excellent place to ask questions and get help. If you have a tiddlyspot related problem email [[tiddlyspot support|mailto:support@tiddlyspot.com]].",
"",
"@@font-weight:bold;font-size:1.3em;color:#444; //Enjoy :)// @@ We hope you like using your tiddlyspot.com site. Please email [[feedback@tiddlyspot.com|mailto:feedback@tiddlyspot.com]] with any comments or suggestions."
].join("\n"),
'TspotControls':[
"| tiddlyspot password:|<<option pasUploadPassword>>|",
"| site management:|<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">>//(requires tiddlyspot password)//<<br>>[[control panel|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/controlpanel]], [[download (go offline)|http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download]]|",
"| links:|[[tiddlyspot.com|http://tiddlyspot.com/]], [[FAQs|http://faq.tiddlyspot.com/]], [[announcements|http://announce.tiddlyspot.com/]], [[blog|http://tiddlyspot.com/blog/]], email [[support|mailto:support@tiddlyspot.com]] & [[feedback|mailto:feedback@tiddlyspot.com]], [[donate|http://tiddlyspot.com/?page=donate]]|"
].join("\n"),
'TspotSidebar':[
"<<upload http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/store.cgi index.html . . " + config.tiddlyspotSiteId + ">><html><a href='http://" + config.tiddlyspotSiteId + ".tiddlyspot.com/download' class='button'>download</a></html>"
].join("\n"),
'TspotOptions':[
"tiddlyspot password:",
"<<option pasUploadPassword>>",
""
].join("\n")
});
//}}}
Tuzanal is spoken predominantly in west [[Tebir Nat]]. It is somewhat similar to [[Urofal]], and marginally similar to [[Unahal]]. A speaker of Tuzanal can make an Intelligence check at a DC 26 to understand a sentence of Urofal, and at a DC of 30 to understand a sentence of Unahal.
Tuzanar are a scattered and independent people. They are the most feudalistic people in the world. Tuzanar politics are ever-changing, with deceit and violence at every turn. Tuzanar commoners rarely keep track of the politics of the nobles, since they change so frequently.
!!Starting Languages
One of [[Tuzanal]], [[Urofal]], or [[Unahal]].
!!Bonus Languages
[[Tuzanal]], [[Urofal]], [[Unahal]], [[Zulaviy]], [[Bishoy]], [[Protsadiy]], [[Iluasa]], [[Losccodu]], and [[Nethrinu]].
!!Background Feats
<<list byTag "BackgroundFeat" "Tuzanar">>
!!Starting Classes
<<list byTag "Class" "Tuzanar">>
!!Appearance
Tuzanar are of average height and build, with light or reddish skin. They usually have straight light brown hair. Their eyes tend to be green or brown, but blue eyes on a Tuzanar are not unheard of.
{{mapfloat{
[img[http://img503.imageshack.us/img503/5241/tuznalinethrinizulavyatc1.jpg]]
}}}
A hilly fertile land south of the cold [[Zulavya Highlands]] and northwest of the [[Nethrini Peninsula]]. It has a southwest and an east coastline. The [[Ilua Mainland]] lies off the southwest coast. 1,510,000 square miles.
!!Nations
[[Tebir Nat]]
[[Inzur Nat]]
!!Subrace
[[Tuzanar]]
Unahal is the language spoken in [[Inzur Nat]]. It is somewhat similar to [[Urofal]], and marginally similar to [[Tuzanal]]. A speaker of Unahal can make an Intelligence check at a DC 26 to understand a sentence of Urofal, and at a DC of 30 to understand a sentence of Tuzanal.
The Untrained Psionics of the Zulavya Highlands and the Pavani Coast have lacked guidance all their lives. Their soul searching, and often emotional, meditations lead them to a better control over their wild emotions and their body. Unfortunately, the lack of training leaves their knowledge of the science of psionics somewhat meager.
''Prerequisite:'' Must choose to be a [[Wilder]]. Must also be a [[Pavanno]] or a [[Zulavic]]
''Bonus:'' You get a +1 bonus on all Autohypnosis and Concentration checks.
''Penalty:'' You have a -1 penalty on all Knowledge (Psionics) and Psicraft checks.
| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |
| 06/08/2007 17:26:38 | JeffSheets | [[/|http://omniapsionic.tiddlyspot.com/]] | [[store.cgi|http://omniapsionic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://omniapsionic.tiddlyspot.com/index.html]] | . |
| 06/08/2007 17:29:06 | JeffSheets | [[/|http://omniapsionic.tiddlyspot.com/]] | [[store.cgi|http://omniapsionic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://omniapsionic.tiddlyspot.com/index.html]] | . |
| 06/08/2007 18:37:34 | JeffSheets | [[/|http://omniapsionic.tiddlyspot.com/]] | [[store.cgi|http://omniapsionic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://omniapsionic.tiddlyspot.com/index.html]] | . |
| 07/08/2007 01:47:21 | JeffSheets | [[/|http://omniapsionic.tiddlyspot.com/]] | [[store.cgi|http://omniapsionic.tiddlyspot.com/store.cgi]] | . | [[index.html | http://omniapsionic.tiddlyspot.com/index.html]] | . |
/***
|''Name:''|PasswordOptionPlugin|
|''Description:''|Extends TiddlyWiki options with non encrypted password option.|
|''Version:''|1.0.2|
|''Date:''|Apr 19, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#PasswordOptionPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.PasswordOptionPlugin = {
major: 1, minor: 0, revision: 2,
date: new Date("Apr 19, 2007"),
source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
coreVersion: '2.2.0 (Beta 5)'
};
config.macros.option.passwordCheckboxLabel = "Save this password on this computer";
config.macros.option.passwordInputType = "password"; // password | text
setStylesheet(".pasOptionInput {width: 11em;}\n","passwordInputTypeStyle");
merge(config.macros.option.types, {
'pas': {
elementType: "input",
valueField: "value",
eventName: "onkeyup",
className: "pasOptionInput",
typeValue: config.macros.option.passwordInputType,
create: function(place,type,opt,className,desc) {
// password field
config.macros.option.genericCreate(place,'pas',opt,className,desc);
// checkbox linked with this password "save this password on this computer"
config.macros.option.genericCreate(place,'chk','chk'+opt,className,desc);
// text savePasswordCheckboxLabel
place.appendChild(document.createTextNode(config.macros.option.passwordCheckboxLabel));
},
onChange: config.macros.option.genericOnChange
}
});
merge(config.optionHandlers['chk'], {
get: function(name) {
// is there an option linked with this chk ?
var opt = name.substr(3);
if (config.options[opt])
saveOptionCookie(opt);
return config.options[name] ? "true" : "false";
}
});
merge(config.optionHandlers, {
'pas': {
get: function(name) {
if (config.options["chk"+name]) {
return encodeCookie(config.options[name].toString());
} else {
return "";
}
},
set: function(name,value) {config.options[name] = decodeCookie(value);}
}
});
// need to reload options to load passwordOptions
loadOptionsCookie();
/*
if (!config.options['pasPassword'])
config.options['pasPassword'] = '';
merge(config.optionsDesc,{
pasPassword: "Test password"
});
*/
//}}}
/***
|''Name:''|UploadPlugin|
|''Description:''|Save to web a TiddlyWiki|
|''Version:''|4.1.0|
|''Date:''|May 5, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#UploadPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#UploadPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (#3125)|
|''Requires:''|PasswordOptionPlugin|
***/
//{{{
version.extensions.UploadPlugin = {
major: 4, minor: 1, revision: 0,
date: new Date("May 5, 2007"),
source: 'http://tiddlywiki.bidix.info/#UploadPlugin',
author: 'BidiX (BidiX (at) bidix (dot) info',
coreVersion: '2.2.0 (#3125)'
};
//
// Environment
//
if (!window.bidix) window.bidix = {}; // bidix namespace
bidix.debugMode = false; // true to activate both in Plugin and UploadService
//
// Upload Macro
//
config.macros.upload = {
// default values
defaultBackupDir: '', //no backup
defaultStoreScript: "store.php",
defaultToFilename: "index.html",
defaultUploadDir: ".",
authenticateUser: true // UploadService Authenticate User
};
config.macros.upload.label = {
promptOption: "Save and Upload this TiddlyWiki with UploadOptions",
promptParamMacro: "Save and Upload this TiddlyWiki in %0",
saveLabel: "save to web",
saveToDisk: "save to disk",
uploadLabel: "upload"
};
config.macros.upload.messages = {
noStoreUrl: "No store URL in parmeters or options",
usernameOrPasswordMissing: "Username or password missing"
};
config.macros.upload.handler = function(place,macroName,params) {
if (readOnly)
return;
var label;
if (document.location.toString().substr(0,4) == "http")
label = this.label.saveLabel;
else
label = this.label.uploadLabel;
var prompt;
if (params[0]) {
prompt = this.label.promptParamMacro.toString().format([this.destFile(params[0],
(params[1] ? params[1]:bidix.basename(window.location.toString())), params[3])]);
} else {
prompt = this.label.promptOption;
}
createTiddlyButton(place, label, prompt, function() {config.macros.upload.action(params);}, null, null, this.accessKey);
};
config.macros.upload.action = function(params)
{
// for missing macro parameter set value from options
var storeUrl = params[0] ? params[0] : config.options.txtUploadStoreUrl;
var toFilename = params[1] ? params[1] : config.options.txtUploadFilename;
var backupDir = params[2] ? params[2] : config.options.txtUploadBackupDir;
var uploadDir = params[3] ? params[3] : config.options.txtUploadDir;
var username = params[4] ? params[4] : config.options.txtUploadUserName;
var password = config.options.pasUploadPassword; // for security reason no password as macro parameter
// for still missing parameter set default value
if ((!storeUrl) && (document.location.toString().substr(0,4) == "http"))
storeUrl = bidix.dirname(document.location.toString())+'/'+config.macros.upload.defaultStoreScript;
if (storeUrl.substr(0,4) != "http")
storeUrl = bidix.dirname(document.location.toString()) +'/'+ storeUrl;
if (!toFilename)
toFilename = bidix.basename(window.location.toString());
if (!toFilename)
toFilename = config.macros.upload.defaultToFilename;
if (!uploadDir)
uploadDir = config.macros.upload.defaultUploadDir;
if (!backupDir)
backupDir = config.macros.upload.defaultBackupDir;
// report error if still missing
if (!storeUrl) {
alert(config.macros.upload.messages.noStoreUrl);
clearMessage();
return false;
}
if (config.macros.upload.authenticateUser && (!username || !password)) {
alert(config.macros.upload.messages.usernameOrPasswordMissing);
clearMessage();
return false;
}
bidix.upload.uploadChanges(false,null,storeUrl, toFilename, uploadDir, backupDir, username, password);
return false;
};
config.macros.upload.destFile = function(storeUrl, toFilename, uploadDir)
{
if (!storeUrl)
return null;
var dest = bidix.dirname(storeUrl);
if (uploadDir && uploadDir != '.')
dest = dest + '/' + uploadDir;
dest = dest + '/' + toFilename;
return dest;
};
//
// uploadOptions Macro
//
config.macros.uploadOptions = {
handler: function(place,macroName,params) {
var wizard = new Wizard();
wizard.createWizard(place,this.wizardTitle);
wizard.addStep(this.step1Title,this.step1Html);
var markList = wizard.getElement("markList");
var listWrapper = document.createElement("div");
markList.parentNode.insertBefore(listWrapper,markList);
wizard.setValue("listWrapper",listWrapper);
this.refreshOptions(listWrapper,false);
var uploadCaption;
if (document.location.toString().substr(0,4) == "http")
uploadCaption = config.macros.upload.label.saveLabel;
else
uploadCaption = config.macros.upload.label.uploadLabel;
wizard.setButtons([
{caption: uploadCaption, tooltip: config.macros.upload.label.promptOption,
onClick: config.macros.upload.action},
{caption: this.cancelButton, tooltip: this.cancelButtonPrompt, onClick: this.onCancel}
]);
},
refreshOptions: function(listWrapper) {
var uploadOpts = [
"txtUploadUserName",
"pasUploadPassword",
"txtUploadStoreUrl",
"txtUploadDir",
"txtUploadFilename",
"txtUploadBackupDir",
"chkUploadLog",
"txtUploadLogMaxLine",
]
var opts = [];
for(i=0; i<uploadOpts.length; i++) {
var opt = {};
opts.push()
opt.option = "";
n = uploadOpts[i];
opt.name = n;
opt.lowlight = !config.optionsDesc[n];
opt.description = opt.lowlight ? this.unknownDescription : config.optionsDesc[n];
opts.push(opt);
}
var listview = ListView.create(listWrapper,opts,this.listViewTemplate);
for(n=0; n<opts.length; n++) {
var type = opts[n].name.substr(0,3);
var h = config.macros.option.types[type];
if (h && h.create) {
h.create(opts[n].colElements['option'],type,opts[n].name,opts[n].name,"no");
}
}
},
onCancel: function(e)
{
backstage.switchTab(null);
return false;
},
wizardTitle: "Upload with options",
step1Title: "These options are saved in cookies in your browser",
step1Html: "<input type='hidden' name='markList'></input><br>",
cancelButton: "Cancel",
cancelButtonPrompt: "Cancel prompt",
listViewTemplate: {
columns: [
{name: 'Description', field: 'description', title: "Description", type: 'WikiText'},
{name: 'Option', field: 'option', title: "Option", type: 'String'},
{name: 'Name', field: 'name', title: "Name", type: 'String'}
],
rowClasses: [
{className: 'lowlight', field: 'lowlight'}
]}
}
//
// upload functions
//
if (!bidix.upload) bidix.upload = {};
if (!bidix.upload.messages) bidix.upload.messages = {
//from saving
invalidFileError: "The original file '%0' does not appear to be a valid TiddlyWiki",
backupSaved: "Backup saved",
backupFailed: "Failed to upload backup file",
rssSaved: "RSS feed uploaded",
rssFailed: "Failed to upload RSS feed file",
emptySaved: "Empty template uploaded",
emptyFailed: "Failed to upload empty template file",
mainSaved: "Main TiddlyWiki file uploaded",
mainFailed: "Failed to upload main TiddlyWiki file. Your changes have not been saved",
//specific upload
loadOriginalHttpPostError: "Can't get original file",
aboutToSaveOnHttpPost: 'About to upload on %0 ...',
storePhpNotFound: "The store script '%0' was not found."
};
bidix.upload.uploadChanges = function(onlyIfDirty,tiddlers,storeUrl,toFilename,uploadDir,backupDir,username,password)
{
var callback = function(status,uploadParams,original,url,xhr) {
if (!status) {
displayMessage(bidix.upload.messages.loadOriginalHttpPostError);
return;
}
if (bidix.debugMode)
alert(original.substr(0,500)+"\n...");
// Locate the storeArea div's
var posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
bidix.upload.uploadRss(uploadParams,original,posDiv);
};
if(onlyIfDirty && !store.isDirty())
return;
clearMessage();
// save on localdisk ?
if (document.location.toString().substr(0,4) == "file") {
var path = document.location.toString();
var localPath = getLocalPath(path);
saveChanges();
}
// get original
var uploadParams = Array(storeUrl,toFilename,uploadDir,backupDir,username,password);
var originalPath = document.location.toString();
// If url is a directory : add index.html
if (originalPath.charAt(originalPath.length-1) == "/")
originalPath = originalPath + "index.html";
var dest = config.macros.upload.destFile(storeUrl,toFilename,uploadDir);
var log = new bidix.UploadLog();
log.startUpload(storeUrl, dest, uploadDir, backupDir);
displayMessage(bidix.upload.messages.aboutToSaveOnHttpPost.format([dest]));
if (bidix.debugMode)
alert("about to execute Http - GET on "+originalPath);
var r = doHttp("GET",originalPath,null,null,null,null,callback,uploadParams,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
bidix.upload.uploadRss = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
if(status) {
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.rssSaved,bidix.dirname(url)+'/'+destfile);
bidix.upload.uploadMain(params[0],params[1],params[2]);
} else {
displayMessage(bidix.upload.messages.rssFailed);
}
};
// do uploadRss
if(config.options.chkGenerateAnRssFeed) {
var rssPath = uploadParams[1].substr(0,uploadParams[1].lastIndexOf(".")) + ".xml";
var rssUploadParams = Array(uploadParams[0],rssPath,uploadParams[2],'',uploadParams[4],uploadParams[5]);
bidix.upload.httpUpload(rssUploadParams,convertUnicodeToUTF8(generateRss()),callback,Array(uploadParams,original,posDiv));
} else {
bidix.upload.uploadMain(uploadParams,original,posDiv);
}
};
bidix.upload.uploadMain = function(uploadParams,original,posDiv)
{
var callback = function(status,params,responseText,url,xhr) {
var log = new bidix.UploadLog();
if(status) {
// if backupDir specified
if ((params[3]) && (responseText.indexOf("backupfile:") > -1)) {
var backupfile = responseText.substring(responseText.indexOf("backupfile:")+11,responseText.indexOf("\n", responseText.indexOf("backupfile:")));
displayMessage(bidix.upload.messages.backupSaved,bidix.dirname(url)+'/'+backupfile);
}
var destfile = responseText.substring(responseText.indexOf("destfile:")+9,responseText.indexOf("\n", responseText.indexOf("destfile:")));
displayMessage(bidix.upload.messages.mainSaved,bidix.dirname(url)+'/'+destfile);
store.setDirty(false);
log.endUpload("ok");
} else {
alert(bidix.upload.messages.mainFailed);
displayMessage(bidix.upload.messages.mainFailed);
log.endUpload("failed");
}
};
// do uploadMain
var revised = bidix.upload.updateOriginal(original,posDiv);
bidix.upload.httpUpload(uploadParams,revised,callback,uploadParams);
};
bidix.upload.httpUpload = function(uploadParams,data,callback,params)
{
var localCallback = function(status,params,responseText,url,xhr) {
url = (url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1));
if (xhr.status == httpStatus.NotFound)
alert(bidix.upload.messages.storePhpNotFound.format([url]));
if ((bidix.debugMode) || (responseText.indexOf("Debug mode") >= 0 )) {
alert(responseText);
if (responseText.indexOf("Debug mode") >= 0 )
responseText = responseText.substring(responseText.indexOf("\n\n")+2);
} else if (responseText.charAt(0) != '0')
alert(responseText);
if (responseText.charAt(0) != '0')
status = null;
callback(status,params,responseText,url,xhr);
};
// do httpUpload
var boundary = "---------------------------"+"AaB03x";
var uploadFormName = "UploadPlugin";
// compose headers data
var sheader = "";
sheader += "--" + boundary + "\r\nContent-disposition: form-data; name=\"";
sheader += uploadFormName +"\"\r\n\r\n";
sheader += "backupDir="+uploadParams[3] +
";user=" + uploadParams[4] +
";password=" + uploadParams[5] +
";uploaddir=" + uploadParams[2];
if (bidix.debugMode)
sheader += ";debug=1";
sheader += ";;\r\n";
sheader += "\r\n" + "--" + boundary + "\r\n";
sheader += "Content-disposition: form-data; name=\"userfile\"; filename=\""+uploadParams[1]+"\"\r\n";
sheader += "Content-Type: text/html;charset=UTF-8" + "\r\n";
sheader += "Content-Length: " + data.length + "\r\n\r\n";
// compose trailer data
var strailer = new String();
strailer = "\r\n--" + boundary + "--\r\n";
data = sheader + data + strailer;
if (bidix.debugMode) alert("about to execute Http - POST on "+uploadParams[0]+"\n with \n"+data.substr(0,500)+ " ... ");
var r = doHttp("POST",uploadParams[0],data,"multipart/form-data; boundary="+boundary,uploadParams[4],uploadParams[5],localCallback,params,null);
if (typeof r == "string")
displayMessage(r);
return r;
};
// same as Saving's updateOriginal but without convertUnicodeToUTF8 calls
bidix.upload.updateOriginal = function(original, posDiv)
{
if (!posDiv)
posDiv = locateStoreArea(original);
if((posDiv[0] == -1) || (posDiv[1] == -1)) {
alert(config.messages.invalidFileError.format([localPath]));
return;
}
var revised = original.substr(0,posDiv[0] + startSaveArea.length) + "\n" +
store.allTiddlersAsHtml() + "\n" +
original.substr(posDiv[1]);
var newSiteTitle = getPageTitle().htmlEncode();
revised = revised.replaceChunk("<title"+">","</title"+">"," " + newSiteTitle + " ");
revised = updateMarkupBlock(revised,"PRE-HEAD","MarkupPreHead");
revised = updateMarkupBlock(revised,"POST-HEAD","MarkupPostHead");
revised = updateMarkupBlock(revised,"PRE-BODY","MarkupPreBody");
revised = updateMarkupBlock(revised,"POST-SCRIPT","MarkupPostBody");
return revised;
};
//
// UploadLog
//
// config.options.chkUploadLog :
// false : no logging
// true : logging
// config.options.txtUploadLogMaxLine :
// -1 : no limit
// 0 : no Log lines but UploadLog is still in place
// n : the last n lines are only kept
// NaN : no limit (-1)
bidix.UploadLog = function() {
if (!config.options.chkUploadLog)
return; // this.tiddler = null
this.tiddler = store.getTiddler("UploadLog");
if (!this.tiddler) {
this.tiddler = new Tiddler();
this.tiddler.title = "UploadLog";
this.tiddler.text = "| !date | !user | !location | !storeUrl | !uploadDir | !toFilename | !backupdir | !origin |";
this.tiddler.created = new Date();
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
}
return this;
};
bidix.UploadLog.prototype.addText = function(text) {
if (!this.tiddler)
return;
// retrieve maxLine when we need it
var maxLine = parseInt(config.options.txtUploadLogMaxLine,10);
if (isNaN(maxLine))
maxLine = -1;
// add text
if (maxLine != 0)
this.tiddler.text = this.tiddler.text + text;
// Trunck to maxLine
if (maxLine >= 0) {
var textArray = this.tiddler.text.split('\n');
if (textArray.length > maxLine + 1)
textArray.splice(1,textArray.length-1-maxLine);
this.tiddler.text = textArray.join('\n');
}
// update tiddler fields
this.tiddler.modifier = config.options.txtUserName;
this.tiddler.modified = new Date();
store.addTiddler(this.tiddler);
// refresh and notifiy for immediate update
story.refreshTiddler(this.tiddler.title);
store.notify(this.tiddler.title, true);
};
bidix.UploadLog.prototype.startUpload = function(storeUrl, toFilename, uploadDir, backupDir) {
if (!this.tiddler)
return;
var now = new Date();
var text = "\n| ";
var filename = bidix.basename(document.location.toString());
if (!filename) filename = '/';
text += now.formatString("0DD/0MM/YYYY 0hh:0mm:0ss") +" | ";
text += config.options.txtUserName + " | ";
text += "[["+filename+"|"+location + "]] |";
text += " [[" + bidix.basename(storeUrl) + "|" + storeUrl + "]] | ";
text += uploadDir + " | ";
text += "[[" + bidix.basename(toFilename) + " | " +toFilename + "]] | ";
text += backupDir + " |";
this.addText(text);
};
bidix.UploadLog.prototype.endUpload = function(status) {
if (!this.tiddler)
return;
this.addText(" "+status+" |");
};
//
// Utilities
//
bidix.checkPlugin = function(plugin, major, minor, revision) {
var ext = version.extensions[plugin];
if (!
(ext &&
((ext.major > major) ||
((ext.major == major) && (ext.minor > minor)) ||
((ext.major == major) && (ext.minor == minor) && (ext.revision >= revision))))) {
// write error in PluginManager
if (pluginInfo)
pluginInfo.log.push("Requires " + plugin + " " + major + "." + minor + "." + revision);
eval(plugin); // generate an error : "Error: ReferenceError: xxxx is not defined"
}
};
bidix.dirname = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(0, lastpos);
} else {
return filePath.substring(0, filePath.lastIndexOf("\\"));
}
};
bidix.basename = function(filePath) {
if (!filePath)
return;
var lastpos;
if ((lastpos = filePath.lastIndexOf("#")) != -1)
filePath = filePath.substring(0, lastpos);
if ((lastpos = filePath.lastIndexOf("/")) != -1) {
return filePath.substring(lastpos + 1);
} else
return filePath.substring(filePath.lastIndexOf("\\")+1);
};
bidix.initOption = function(name,value) {
if (!config.options[name])
config.options[name] = value;
};
//
// Initializations
//
// require PasswordOptionPlugin 1.0.1 or better
bidix.checkPlugin("PasswordOptionPlugin", 1, 0, 1);
// styleSheet
setStylesheet('.txtUploadStoreUrl, .txtUploadBackupDir, .txtUploadDir {width: 22em;}',"uploadPluginStyles");
//optionsDesc
merge(config.optionsDesc,{
txtUploadStoreUrl: "Url of the UploadService script (default: store.php)",
txtUploadFilename: "Filename of the uploaded file (default: in index.html)",
txtUploadDir: "Relative Directory where to store the file (default: . (downloadService directory))",
txtUploadBackupDir: "Relative Directory where to backup the file. If empty no backup. (default: ''(empty))",
txtUploadUserName: "Upload Username",
pasUploadPassword: "Upload Password",
chkUploadLog: "do Logging in UploadLog (default: true)",
txtUploadLogMaxLine: "Maximum of lines in UploadLog (default: 10)"
});
// Options Initializations
bidix.initOption('txtUploadStoreUrl','');
bidix.initOption('txtUploadFilename','');
bidix.initOption('txtUploadDir','');
bidix.initOption('txtUploadBackupDir','');
bidix.initOption('txtUploadUserName','');
bidix.initOption('pasUploadPassword','');
bidix.initOption('chkUploadLog',true);
bidix.initOption('txtUploadLogMaxLine','10');
/* don't want this for tiddlyspot sites
// Backstage
merge(config.tasks,{
uploadOptions: {text: "upload", tooltip: "Change UploadOptions and Upload", content: '<<uploadOptions>>'}
});
config.backstageTasks.push("uploadOptions");
*/
//}}}
Urofal is spoken in east [[Tebir Nat]]. It is somewhat similar to both [[Tuzanal]] and [[Unahal]]. A speaker of Unahal can make an Intelligence check at a DC 26 to understand a sentence of Tuzanal or Unahal.
Uvamasi monks and soulknives train their skills in a monastery within the Nesherim capital city of Nasdaru. The Uvamasi training regimen stresses the benefits of grace and skillful movement. Uvamasi, however, lack extensive training in religious training and artistic performance.
''Prerequisite:'' Must be a [[Nesherim]], Must also choose to be a [[Monk]] or a [[Soulknife]].
''Bonus:'' You get a +1 bonus on all Move Silently and Tumble checks.
''Penalty:'' You have a -1 penalty on all Knowledge (Religion) and Perform checks.
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' style='border-left:1em #666 solid; padding-left:0.2em; color:#666;' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>) | <span class='comments' macro='haloscan comments'></span> | <span class='comments' macro='haloscan trackbacks'></span></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Put very simply:
>//E6 is normal D&D until level 6, then a feat every 5,000 XP.//
More information can be found [[here|E6]]. Feats found [[here|E6 Feats (for OP)]] can make the limits of E6 easier to overcome, or one could choose a variant, or simply use standard rules.
!!E8+
E8 is a variant similar to E6. The difference is that you stop at 8th level, and you don't generally need the special list of feats. E10, E12, Exx can also be used, but the higher you go, the further you get from the "sweet spot" described by Ryan Stoughton, et al.
!!~EEx
~EEx simply uses a different Level progression table, based on exponential math. This serves to keep character lower level longer, while not arbitrarily stopping them at a specific point.
Either of these variants on E6 could be used, and are really appropriate when you and your players feel that the "sweet spot" is higher level than 6th.
Though Wild Talents exist across the world, those that grow up in the [[Zulavya Highlands]] and sometimes the [[Pavana Coast]] cannot gain the training and guidance needed to become [[Psions|Psion]]. Those that follow this path in these areas often develop stronger abilities, but lack the versatility of the Psion.
!!Available Background Feats
<<list byTag "BackgroundFeat" "Wilder">>
Spoken by the [[Zulavic]]s of northwest [[Zulavya]]. Speakers of Zdomishtiy can make an Intelligence check at a DC of 28 to understand a sentence of [[Zulaviy]] or [[Protsadiy]], and at a DC of 30 to understand [[Bishoy]].
Life in the Zulavya Highlands is harsh and difficult. The terrain is poorly suited for building extensive cities, and the climate is quite cold. The land is fertile, but is almost exclusively hilly and mountainous, leading the Zulavics to herd flocks of sheep and goats, and rarely settle for farmland. Zulavics tend to be the least civilized people in the world.
!!Starting Languages
One of [[Zulaviy]], [[Bishoy]], [[Zdomishtiy]], or [[Protsadiy]].
!!Bonus Languages
[[Zulaviy]], [[Bishoy]], [[Zdomishtiy]], [[Protsadiy]], [[Tuzanal]], and [[Urofal]].
!!Background Feats
<<list byTag "BackgroundFeat" "Zulavic">>
!!Starting Classes
<<list byTag "Class" "Zulavic">>
!!Appearance
Zulavics are average height, but bulky for their size. They are fair skinned, with thin blond and red hair. Zulavics almost exclusively have blue eyes, and none have brown eyes.
Spoken by the [[Zulavic]]s of south [[Zulavya]], and the most common language spoken by Zulavics in all. Speakers of Zulaviy can make an Intelligence check at a DC of 28 to understand a sentence of [[Zdomishtiy]] or [[Protsadiy]], and at a DC of 30 to understand [[Bishoy]].
Zulavya itself is an expansive mountain range, with some of the highest mountains in the known world. Covering 1,170,740 square miles, Zulavya is home to numerous tribes and clans of [[Zulavic]], most of which try to stay out of each other's way. On rare occasions, clans will join together and separate again, intermixing marriages and new survival skills being the goals of these meetings. When times are hard in the highlands, tribes go to war, and distant cousins face each other in combat. A number of Zulavics have taken up living on the northern islands of the [[Sea of Imneru]], leading lives of piracy.
!Environment
!Tribes
!Relations
!Economy
!History
!Culture
{{mapfloat{
[img[http://img503.imageshack.us/img503/5241/tuznalinethrinizulavyatc1.jpg]]
}}}
The frigid cold mountains of the Zulavya Highlands lie to the north of the [[Tuznali Mainland]]. Also included with the highlands are three islands off the southeast coast of the highlands. There is also a thin land bridge to the east, leading to the Pavana Coast. the Highlands are surrounded otherwise by water, and glaciers closer to the north pole. 1,472,370 square miles.
!!Nations
[[Zulavya]]
[[Prozhiska]]
!!Subrace
[[Zulavic]]