/* settings */
var defaults = {};
defaults['map_width'] = 30;
defaults['map_height'] = 30;
var material = [
"undefined","other","food","cloth","plant","wood","stone","granite","iron","steel","mithril",
"titanium","copper","bronze","silver","gold","diamond","ice","glass","paper","leather",
"ivory","ebony","flesh","skin","bone","water","crystal","earth","light"
];
var weapon_type = [ "undefined","shortsword","broadsword","longsword","handaxe","battleaxe","quarterstaff","polearm","mace","warhammer","morning star","club","dagger","whip","two-handed","bow","spear" ];
var apply_type = [ "none","str","dex","int","wis","con","cha","","","age","","","maxmana","maxhit","maxmove","","","armor","hitroll","damroll","save para","save rod","save petri","save breath","save spell" ];
var mob_progs = [ "act_prog", "speech_prog", "rand_prog", "fight_prog", "death_prog", "hitprcnt_prog", "entry_prog", "greet_prog", "all_greet_prog", "bribe_prog", "shout_prog", "tell_prog", "time_prog" ];
var obj_positions = [ {a:-1,b:'carried'},{a:0,b:'light'},{a:1,b:'finger 1'},{a:2,b:'finger 2'},{a:3,b:'neck 1'},{a:4,b:'neck 2'},{a:5,b:'body'},{a:6,b:'head'},{a:7,b:'legs'},
{a:8,b:'feet'},{a:9,b:'hands'},{a:10,b:'arms'},{a:11,b:'shield'},{a:12,b:'about'},{a:13,b:'waist'},{a:14,b:'wrist 1'},{a:15,b:'wrist 2'},{a:16,b:'wield'},
{a:17,b:'held'},{a:18,b:'face'},{a:19,b:'ear 1'},{a:20,b:'ear 2'},{a:21,b:'eyes'},{a:22,b:'ankle 1'},{a:23,b:'ankle 2'},{a:24,b:'wield 2'}];
var obj_liquids = [ {a:0,b:'water'},{a:1,b:'beer'},{a:2,b:'wine'},{a:3,b:'ale'},{a:4,b:'dark ale'},{a:5,b:'whisky'},{a:6,b:'lemonade'},{a:7,b:'firebreather'},
{a:8,b:'moonshine'},{a:9,b:'slime'},{a:10,b:'milk'},{a:11,b:'tea'},{a:12,b:'coffee'},{a:13,b:'blood'},{a:14,b:'salt water'},{a:15,b:'fresh water'},{a:16,b:'coke'}];
var objects = [];
var dbr = {};
//array index of the currently selected zone, room, mob, object, shop
var Z, R, M, O, S;
//data hashes
var r = {}, m = {}, o = {}, s = {}, z = {};
var spells = [];
//icons
var mob_images = {};
var mob_index = [];
var room_images = {};
var room_index = [];
var obj_images = {};
var obj_index = [];
//the room grid
var grid = [];
var exits = [];
var dirs = [ 'north', 'east', 'south', 'west', 'up', 'down' ];
var rev_dir = [2, 3, 0, 1, 5, 4];
var north = 0;
var east = 1;
var south = 2;
var west = 3;
var up = 4;
var down = 5;
var dir = { north: 0, east: 1, south: 2, west: 3, up: 4, down: 5};
$(document).ready(function(){ initUI() });
function initUI() {
if (document.cookie.has('u='))
$.get('login.php', function(data) { loginResponse(data) });
else
setTimeout("loginPrompt('Bedlam Areabuilder Login')", 700);
$('#data').tabs({
show: function(event, ui) {
if (ui.index == 0) { $('#map-wrapper').show(); $('#obj-wrapper').hide(); $('#mob-wrapper').hide(); }
if (ui.index == 1) { $('#map-wrapper').hide(); $('#obj-wrapper').hide(); $('#mob-wrapper').show(); }
if (ui.index == 2) { $('#map-wrapper').hide(); $('#obj-wrapper').show(); $('#mob-wrapper').hide(); }
}
});
$('.multiselect').multiselect({
header: false,
noneSelectedText: 'select',
minWidth: 100
});
$('.multiselect').multiselect('uncheckAll');
for (var i = 0; i < material.length; i++)
if (material[i]) $('#obj-material').append('<option value="'+i+'">'+material[i]+'</option>');
$('.dropdown').selectmenu({style: 'dropdown', transferClasses: 'true'});
$('.ui-sync').button({ icons: { primary: "ui-icon-refresh" }});
$('.ui-publish').button({ icons: { primary: "ui-icon-arrowthick-1-n" }});
$('.ui-save').button({ icons: { primary: "ui-icon-disk" }});
$('.ui-revert').button({ icons: { primary: "ui-icon-arrowreturnthick-1-w" }});
$('.ui-idea').button({ icons: { primary: "ui-icon-lightbulb" }});
$('.ui-logout').button({ icons: { primary: "ui-icon-power" }});
$('.cell').live('mousedown', function(e){ roomInit(e) } );
$('.rcell').live('mousedown', function(e){ roomClick(e) } );
$('.rcell').live('dblclick', function(e){ roomDoubleClick(e) } );
$('.micon').live('mousedown', function(){ mobLoad($(this).attr('id').split('-')[1]) } );
$('.oicon').live('mousedown', function(){ objLoad($(this).attr('id').split('-')[1]) } );
$('.mcell').live('mousedown', function(e){ mobInit(e) } );
$('.ocell').live('mousedown', function(e){ objInit(e) } );
$('.max').live('change', function(){
for (var i in z.reset)
if (z.reset[i].LNUM == $(this).attr('lnum'))
z.reset[i].Arg2 = $(this).val();
});
$('#command-type').live('change', function(){
var v = $('.ui-dialog-content #command-type').val();
if (v == 'M') {
$('.ui-dialog-content #arg1-wrapper').html(buildMobSelect());
$('.ui-dialog-content #select-mob').selectmenu({style: 'dropdown', transferClasses: 'true'});
$('.ui-dialog-content #arg2-wrapper').html('Max: <input class="zreset max" id="arg2" value="1">');
$('.ui-dialog-content #arg3-wrapper').hide();
}
if (v == 'O') {
$('.ui-dialog-content #arg1-wrapper').html(buildObjSelect());
$('.ui-dialog-content #select-obj').selectmenu({style: 'dropdown', transferClasses: 'true'});
$('.ui-dialog-content #arg2-wrapper').html('Max: <input class="zreset max" id="arg2" value="1">');
$('.ui-dialog-content #arg3-wrapper').hide();
}
if (v == 'P') {
$('.ui-dialog-content #arg1-wrapper').html(buildObjSelect());
$('.ui-dialog-content #arg2-wrapper').html('max: <input class="zreset max" id="arg2" value="1"> inside ');
$('.ui-dialog-content #arg3-wrapper').html(buildObjSelect(r.data[R].VNUM));
$('.ui-dialog-content .select-obj').selectmenu({style: 'dropdown', transferClasses: 'true'});
$('.ui-dialog-content #arg3-wrapper').show();
}
});
$('.ui-reset-load').live('mousedown', function() {
zoneResetDelete($(this).attr('lnum'));
roomLoad($(this).attr('vnum'));
});
$('.ui-reset-add').live('mousedown', function(){ showLoadMenu() } );
$('#room-name').change(function() { r.data[R].Name = $(this).val() });
$('#room-description').change(function() { r.data[R].Description = $(this).val().format() });
$('#room-sector').change(function() { r.data[R].SectorType = $(this).selectmenu('value') });
$("#room-flags").bind('multiselectclick', function() { r.data[R].RoomFlags = scanToInt('#room-flags') });
$(".delete-exit").click(function() {
var from = $('#room-id').val();
var d = $(this).attr('id').split('-')[1];
var to = $('#exit-'+d+'-toroom').val();
if (!from || !to) return;
for (var i = 0; i < r.exits.length; i++)
if (r.exits[i].VNUM == from && r.exits[i].ToRoom == to && r.exits[i].NUM == dir[d]) {
r.exits.splice(i, 1);
$('#exit-'+d+'-toroom').val('');
$('#exit-'+d+'-info').multiselect('uncheckAll');
$('#exit-'+d+'-name').val('');
$('#exit-'+d+'-key').val('');
gridRefreshLinks();
roomLoad(from);
}
});
$(".link-exit").click(function() {
var from = $('#room-id').val().toInt();
var d = $(this).attr('id').split('-')[1];
roomLink(from, dir[d], 0, true); //attempt with no reverse linking
gridRefreshLinks();
roomLoad(from);
});
for (var e = 0; e < 6; e++) {
//Exit flags selector auto-escalates checkboxes
$('#exit-'+dirs[e]+'-info').multiselect("widget").find(":checkbox").click(function() {
if (this.checked)
for (var i = 0; i < this.value.toInt(); i++)
id(this.id.replace(this.value, i)).checked = true;
else for (var i = this.value.toInt(); i < 4; i++)
id(this.id.replace(this.value, i)).checked = false;
});
$('#exit-'+dirs[e]+'-info').bind("multiselectclick", function() {
var inum = r.data[R].VNUM+'.'+dir[this.id.split('-')[1]];
for (var i in r.exits)
if (r.exits[i].INUM==inum)
r.exits[i].ExitInfo = scanToInt('#'+$(this).attr('id'));
});
$('#exit-'+dirs[e]+'-name').change(function() {
var id = this.id.split('-')[1];
if (!$('#exit-'+id+'-toroom').val()) return;
if (!$('#exit-'+id+'-info').multiselect('getChecked')) return;
for (var i in r.exits)
if (r.exits[i].INUM==r.data[R].VNUM+'.'+dir[id])
r.exits[i].Keyword = $(this).val();
});
$('#exit-'+dirs[e]+'-key').change(function() {
var id = this.id.split('-')[1];
if (!$('#exit-'+id+'-toroom').val()) return;
if (!$('#exit-'+id+'-info').multiselect('getChecked')) return;
for (var i in r.exits)
if (r.exits[i].INUM==r.data[R].VNUM+'.'+dir[id])
r.exits[i].KeyNumber = $(this).val();
});
}
$('#mob-name').change(function() { m.data[M].Name = $(this).val() });
$('#mob-keywords').change(function() { m.data[M].Keywords = $(this).val() });
$('#mob-level').change(function() { m.data[M].Level = $(this).val() });
$('#mob-health').change(function() { m.points[M].BaseHit = $(this).val() });
$('#mob-armor').change(function() { m.points[M].Armor = $(this).val() });
$('#mob-hitroll').slider({
value: 0,
min: 0,
max: 40,
stop: function() { m.points[M].Hitroll = (20 - $(this).slider('option', 'value')).toString() }
});
$('#mob-exp').change(function() { m.points[M].Exp = $(this).val() });
$('#mob-gold').change(function() { m.points[M].Gold = $(this).val() });
$('#mob-align').change(function() { m.special_data[M].Align = $(this).val() });
$('#mob-short').change(function() { m.data[M].Descr = $(this).val(); loadMobGrid() });
$('#mob-long').change(function() { m.data[M].LongDescr = $(this).val().format() });
$('#mob-flags').bind('multiselectclick', function() { m.special_data[M].MobFlags = scanToInt('#mob-flags') });
$("#mob-affects").bind('multiselectclick', function() { m.special_data[M].AffectedBy = scanToInt('#mob-affects') });
$('#mob-sex').change(function() { m.data[M].Sex = $(this).selectmenu('value') });
$('#mob-class').change(function() { m.data[M].Class = $(this).selectmenu('value') });
$('#mob-race').change(function() { m.special_data[M].Race = $(this).selectmenu('value') });
$('.mob-attack').live('change', function() { mobAttackSet($(this).attr('inum'), $(this).attr('data'), $(this).val()) });
$('.attack-type').live('change', function() { for (var i in m.attacks) if (m.attacks[i].INUM == $(this).attr('data')) { m.attacks[i].Type = $(this).val() } });
$('.prog-type').live('change', function() { for (var i in m.progs) if (m.progs[i].INUM == $(this).attr('data')) m.progs[i].Type = $(this).val() });
$('.prog-args').live('change', function() { for (var i in m.progs) if (m.progs[i].INUM == $(this).attr('data')) m.progs[i].ArgList = $(this).val() });
$('.prog-commands').live('change', function() { for (var i in m.progs) if (m.progs[i].INUM == $(this).attr('data')) m.progs[i].Commands = $(this).val() });
$('.mob-object').live('change', function() { mobObjectSet($(this).parent().attr('id').split('-')[2], $(this).attr('data'), $(this).val()) });
$('.mob-object-position').live('change', function() { for (var i in m.objects) if (m.objects[i].INUM == $(this).attr('inum')) m.objects[i].Position = $(this).val() });
$('.mob-object-number').live('change', function() { for (var i in m.objects) if (m.objects[i].INUM == $(this).attr('inum')) m.objects[i].ONUM = $(this).val() });
$('.mob-product-select').live('change', function() { for (var i in s.products) if (s.products[i].INUM == $(this).attr('inum')) s.products[i].ONUM = $(this).val() });
$('#mob-buy-type').live('change', function() { for (var i in s.buys) if (s.buys[i].INUM == $(this).attr('inum')) s.buys[i].OTYPE = $(this).val() });
$('#mob-buy-keywords').live('change', function() { for (var i in s.buys) if (s.buys[i].INUM == $(this).attr('inum')) s.buys[i].Keywords = $(this).val() });
$('.mob-buy-profit').live('change', function() { if ($(this).val() <= 100) { showDialog('Sell Profit Error', 'The value should be over 100%'); return } for (var i in s.data) if (s.data[i].SNUM == $(this).attr('snum')) s.data[i].BuyProfit = round(($(this).val()/100), 2) });
$('.mob-sell-profit').live('change', function() { if ($(this).val() >= 100) { showDialog('Buy Profit Error', 'The value should be under 100%'); return } for (var i in s.data) if (s.data[i].SNUM == $(this).attr('snum')) s.data[i].SellProfit = round(($(this).val()/100), 2) });
$('.attack-add').live('click', function() { mobAttackAdd(m.data[M].VNUM) } );
$('.attack-delete').live('click', function() { mobAttackDelete($(this).attr('inum')) } );
$('.mob-object-add').live('click', function() { mobObjectAdd(m.data[M].VNUM) } );
$('.mob-object-delete').live('click', function() { mobObjectDelete($(this).attr('inum')) } );
$('.prog-add').live('click', function() { mobProgAdd(m.data[M].VNUM) } );
$('.prog-delete').live('click', function() { mobProgDelete($(this).attr('inum')) } );
$('#obj-name').change(function() { o.data[O].ShortDesc = $(this).val(); loadObjGrid() });
$('#obj-keywords').change(function() { o.data[O].Keywords = $(this).val() });
$('#obj-short').change(function() { o.data[O].Descr = $(this).val() });
$('#obj-type').change(function() { o.data[O].Type = $(this).selectmenu('value'); objTypeChange() });
$('#obj-flags').bind('multiselectclick', function() { o.data[O].WearFlags = scanToInt('#obj-flags') });
$('#obj-aff').bind('multiselectclick', function() { o.data[O].BitVector = scanToInt('#obj-aff') });
$('#obj-extra').bind('multiselectclick', function() { o.data[O].ExtraFlags = scanToInt('#obj-extra') });
$('#obj-v0').live('change', function() { o.data[O].Val0 = $(this).val() });
$('#obj-v1').live('change', function() { o.data[O].Val1 = $(this).val() });
$('#obj-v2').live('change', function() { o.data[O].Val2 = $(this).val() });
$('#obj-v3').live('change', function() { o.data[O].Val3 = $(this).val() });
$('#obj-material').live('change', function() { o.data[O].Val4 = $(this).selectmenu('value') });
$('#obj-value').change(function() { o.data[O].Cost = $(this).val() });
$('#obj-cost').change(function() { o.data[O].CostPerDay = $(this).val() });
$('#obj-weight').change(function() { o.data[O].Weight = $(this).val() });
$('.obj-input').live('change', function() { o.data[O][$(this).attr('data')] = $(this).val() });
$('#obj-apply-button').click(function() {
if ($(this).hasClass('collapsed')) {
$('#obj-apply-form').show();
$(this).removeClass('collapsed');
$(this).removeClass('ui-icon-triangle-1-e');
$(this).addClass('ui-icon-triangle-1-se');
}
else {
$('#obj-apply-form').hide();
$(this).addClass('collapsed');
$(this).removeClass('ui-icon-triangle-1-se');
$(this).addClass('ui-icon-triangle-1-e');
}
});
$('.obj-desc-add').live('click', function() { objDescriptionAdd(o.data[O].VNUM) } );
$('.obj-desc-delete').live('click', function() { objDescriptionDelete($(this).attr('inum')) } );
$('.obj-desc').live('change', function() { o.extra[objFindExtra($(this).attr('inum'))][$(this).attr('data')] = $(this).val() });
$('#area-name').change(function() { if (Z) z.data[Z].Name = $(this).val() });
$('#area-lifespan').change(function() { if (Z) z.data[Z].Lifespan = $(this).val() });
$('#area-flags').bind('multiselectclick', function() {if (Z) z.data[Z].Bits = scanToInt('#area-flags') });
$('#map-view').change(function() { gridLoad(); $(document).scrollTop() });
$("#data").tabs('select', '#data_area');
$('.ui-tooltip').tooltip({
position: 'bottom right',
predelay: 400,
effect: 'fade',
tipClass: "ui-tooltip-custom ui-corner-all"
});
}
function loadZones(d) {
if (d.hasError()) return;
z.data = eval('(' + d + ')');
$('#select-area-container').html('<select id="select-area"><option value="-1">select area</option></select>');
for (var i in z.data)
if (z.data[i].CanEdit != '0' || z.data[i].CanAccess != '0')
$('#select-area').append('<option value="' + i + '">' + z.data[i].Name + ((z.data[i].CanEdit == '0')?' [view]':' [edit]') + '</option>');
$('#select-area').selectmenu({
style: 'dropdown',
width: 360,
maxHeight: 700,
change: function() {
Z = parseInt($(this).val());
loadZone(1);
}
});
globalProgress();
}
function loadZone(first) {
globalProgress('Loading area: <b>' + z.data[Z].Name + '</b>');
//dbr.flat = z.data[Z].Name.has('AB')?false:true;
$('#map').html('<br><br><br><br> <img class="ui-corner-all" src="css/custom-theme/images/progress-bar.gif">');
r = {};
loadData('r_data', 'Data');
loadData('r_exits', 'Exits');
m = {};
loadData('m_data', 'Data');
loadData('m_special_data', 'SpecialData');
loadData('m_points', 'Points');
loadData('m_attacks', 'Attacks');
loadData('m_objects', 'Objects');
loadData('m_progs', 'Progs');
loadData('m_abilities', 'Abilities');
o = {};
loadData('o_data', 'Data');
loadData('o_extra', 'ExtraDescriptions');
z.reset = [];
loadData('z_reset', 'Reset');
$('#area-id').val(z.data[Z].VNUM);
$('#area-name').val(z.data[Z].Name);
$('#area-lifespan').val(z.data[Z].Lifespan);
$('#area-flags').multiselect('uncheckAll');
z.data[Z].Bits.toFlag('#area-flags');
$('.ui-revert').get(0).disabled=false;
$('.ui-revert').removeClass('ui-state-disabled');
$('#mob-level').get(0).disabled=false;
$('#obj-short').get(0).disabled=false;
loadData('s_data', 'Data');
loadData('s_products', 'Products');
loadData('s_buys', 'BuyTypes');
if (z.data[Z].CanEdit == '0') {
$('.ui-save').addClass('ui-state-disabled');
$('.ui-save').get(0).disabled=true;
}
else {
$('.ui-save').removeClass('ui-state-disabled');
$('.ui-save').get(0).disabled=false;
}
}
function loadData(what, from) {
switch (what) {
case 'z_data':
$.get('controller.php?task=getareas', function(data) { loadZones(data) });
break;
case 'r_data':
$.get('controller.php?task=getroom&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { globalProgress(); if (data.hasError()) return;
r.data = eval('(' + data + ')');
if (z.data[Z].Published == '1') {
$('.ui-sync').removeClass('ui-state-disabled');
$('.ui-sync').get(0).disabled = false;
}
else {
$('.ui-sync').addClass('ui-state-disabled');
$('.ui-sync').get(0).disabled = true;
}
});
break;
case 'r_exits':
$.get('controller.php?task=getroom&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) { r.exits = eval('(' + data + ')'); dbr.grid_start = r.exits[0].VNUM.toInt() } gridLoad() });
break;
case 'm_data':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.data = eval('(' + data + ')'); loadMobGrid() });
break;
case 'm_special_data':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.special_data = eval('(' + data + ')') });
break;
case 'm_points':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.points = eval('(' + data + ')') });
break;
case 'm_attacks':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.attacks = eval('(' + data + ')') });
break;
case 'm_objects':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.objects = eval('(' + data + ')') });
break;
case 'm_abilities':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.abilities = eval('(' + data + ')') });
break;
case 'm_progs':
$.get('controller.php?task=getmob&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) m.progs = eval('(' + data + ')'); else m.progs = [] });
break;
case 'o_data':
$.get('controller.php?task=getobj&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) o.data = eval('(' + data + ')'); loadObjGrid() });
break;
case 'o_extra':
$.get('controller.php?task=getobj&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { if (data.hasError()) return; if (!data.has('Alert')) o.extra = eval('(' + data + ')') });
break;
case 'z_reset':
$.get('controller.php?task=getzone&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { globalProgress(); if (data.hasError()) return; if (!data.has('Alert')) z.reset = eval('(' + data + ')') });
break;
case 's_data':
$.get('controller.php?task=getshop&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { globalProgress(); if (data.hasError()) return; if (!data.has('Alert')) s.data = eval('(' + data + ')') });
break;
case 's_products':
$.get('controller.php?task=getshop&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { globalProgress(); if (data.hasError()) return; if (!data.has('Alert')) s.products = eval('(' + data + ')') });
break;
case 's_buys':
$.get('controller.php?task=getshop&id=' + z.data[Z].VNUM + '&t=' + from, function(data) { globalProgress(); if (data.hasError()) return; if (!data.has('Alert')) s.buys = eval('(' + data + ')') });
break;
case 'spells':
$.get('controller.php?task=getspells', function(data) { if (data.hasError()) return; if (!data.has('Alert')) spells = eval('(' + data + ')') });
break;
case 'objects':
$.get('controller.php?task=getobjects', function(data) { if (data.hasError()) return; if (!data.has('Alert')) objects = eval('(' + data + ')') });
break;
}
}
function gridLoad() {
if (!r.data) { setTimeout('gridLoad()', 500); return }
if (!r.exits || !r.exits.length) {
roomInit(z.data[Z].VNUM*100);
}
var x, y, n, t, l = [];
grid = [];
grid[0] = [];
if ($('#map-view').val() == 'layout') {
grid[0].push(dbr.grid_start);
for (var round = 0; round < 30; round++) {
for (var i = 0; i < r.exits.length; i++) {
x = 0, y = 0;
n = r.exits[i].VNUM.toInt();
t = r.exits[i].ToRoom.toInt();
e = r.exits[i].NUM.toInt();
if (n != dbr.grid_start && (t != dbr.grid_start && !getGridLocation(n).length && !getGridLocation(t).length)) continue;
if (e > 3) continue;
if (!r.exits[i].ToRoom.inZone(z.data[Z].VNUM.toInt())) continue;
l = getGridLocation(n);
if (l.length) { y = l[0]; x = l[1] }
else {
l = getGridLocation(n-1);
if (l.length) { y = l[0]; x = l[1] }
gridPlaceRoom(0, east, y, grid[y].length-1);
gridPlaceRoom(n, south, y, grid[y].length-1);
l = getGridLocation(n);
if (l.length) { y = l[0]; x = l[1] }
}
if (!getGridLocation(t).length)
gridPlaceRoom(t, e, y, x);
else { //to_room is already placed, move from_room relative to to_room
grid[y][x] = 0;
l = getGridLocation(t);
y = l[0]; x = l[1];
gridPlaceRoom(n, rev_dir[e], y, x);
}
}
globalProgress('Analyzing area "'+z.data[Z].Name+'" - passes '+round+'/30');
}
gridZoomOut();
if (grid.length == 3 || grid[0].length == 3) gridZoomOut();
gridTrim();
$('.freestyle').each(function() { $(this).get(0).disabled=true });
}
else {
//list view
var i = 0;
var n = z.data[Z].VNUM.toInt() * 100;
var l = r.data[r.data.length-1].VNUM.slice(-2).toInt();
for (var y = 0; y < parseInt(l/7)+2; y++) {
grid[y] = [];
for (var x = 0; x < 7; x++) {
(roomFind(n+i) != -1)?grid[y].push(n+i):grid[y].push(0);
i++;
}
}
$('.freestyle').each(function() { $(this).get(0).disabled=false });
}
/*
else if (!dbr.flat) {
for (var i = 0; i < r.exits.length; i++) {
x = 0, y = 0;
n = r.exits[i].VNUM.toInt();
t = r.exits[i].ToRoom.toInt();
e = r.exits[i].NUM.toInt();
z = z.data[Z].VNUM.toInt();
if (e > 3) continue;
if (!r.exits[i].ToRoom.inZone(z)) continue;
//initial placement
if (!grid[0].length) grid[0].push(n);
else {
l = getGridLocation(n);
if (l.length) { y = l[0]; x = l[1] }
else {
l = getGridLocation(n-1);
if (l.length) { y = l[0]; x = l[1] }
gridPlaceRoom(0, east, y, grid[y].length-1);
gridPlaceRoom(n, south, y, grid[y].length-1);
l = getGridLocation(n);
if (l.length) { y = l[0]; x = l[1] }
}
}
if (!getGridLocation(t).length)
gridPlaceRoom(t, e, y, x);
else { //to_room is placed, place from_room relative to to_room
grid[y][x] = 0;
l = getGridLocation(t);
y = l[0]; x = l[1];
gridPlaceRoom(n, rev_dir[e], y, x);
}
if (dbr.flat) break; //give up and show flat room grid
} //end exits loop
gridZoomOut();
$('.freestyle').each(function() { $(this).get(0).disabled=true });
}
else {
gridFlatten();
$('.freestyle').each(function() { $(this).get(0).disabled=false });
} */
gridInit();
gridRender();
}
function gridPrependRow() { var t = []; for (i = 0; i < grid[0].length; i++) t.push(0); grid.unshift(t) }
function gridAppendRow() { var t = []; for (i = 0; i < grid[grid.length-1].length; i++) t.push(0); grid.push(t) }
function gridAppendColumn() { for (i = 0; i < grid.length; i++) grid[i].push(0) }
function gridPrependColumn() { for (i = 0; i < grid.length; i++) grid[i].unshift(0) }
function gridZoomOut() { gridPrependRow(); gridAppendRow(); gridPrependColumn(); gridAppendColumn() }
function gridTrim() {
var trim_x = true;
for (var y = 0; y < grid.length; y++) {
for (var x = 0; x < grid[y].length; x++)
if (x == grid[y].length-1 && grid[y][x-1]) trim_x = false;
}
if (trim_x) {
for (var y = 0; y < grid.length; y++) grid[y].pop();
gridTrim();
}
}
function gridPlaceRoom(n, e, y, x) {
if (!exists(grid[y]) || !exists(grid[y][x])) return;
if (e == 0) { /* north */
/* at top row? bump south */
if (y == 0) gridPrependRow();
else y--;
if (!grid[y][x]) grid[y][x] = n;
}
else /* south */
if (e == 2) {
/* at bottom row? bump north */
if (y == (grid.length-1)) gridAppendRow();
y++;
if (!grid[y][x]) grid[y][x] = n;
}
else /* east */
if (e == 1) {
/* at rightmost col? bump west */
if (x == (grid[y].length-1)) gridAppendColumn();
x++;
if (!grid[y][x]) grid[y][x] = n;
}
else /* west */
if (e == 3) {
/* at leftmost col? bump east */
if (x == 0) gridPrependColumn();
else x--;
if (!grid[y][x]) grid[y][x] = n;
}
}
function getMaxWidth() {
var w = 0;
for (var y = 0; y < grid.length; y++)
if (grid[y].length > w) w = grid[y].length;
return w;
}
function getMaxHeight() { return grid.length; }
function getGridLocation(n) {
for (y = 0; y < grid.length; y++)
for (x = 0; x < grid[y].length; x++)
if (grid[y][x] == n) return [y, x];
return [];
}
function gridInit(wide) {
globalProgress("Loading the map grid...");
var v = z.data[Z].VNUM*100;
var w = getMaxWidth();
var h = getMaxHeight();
if (w > 100) {
$('#map-view').selectmenu('value', 1);
return;
}
$('#map').html('');
if (!wide) {
$(".gridbox").width(400);
$("#map").width(400);
}
var cell_size = parseInt(($(".gridbox").width() - (wide?160:60)) / w);
if (cell_size < 15 && !wide) {
$(".gridbox").width(1060);
$("#map").width(1060);
gridInit(1);
return;
}
if ($('#map-view').val() == 'list')
cell_size = parseInt(($(".gridbox").width() - 20) / w);
var x = 0, y = 0;
for (var i = 0; i < (w * h); i++) {
var myid = y + '-' + x;
id("map").innerHTML += '<li class="cell ui-state-highlight context rContextClear" style="height: '+cell_size+'px; width: '+cell_size+'px" id="' + myid + '" vnum="' + v + '"></li>\n';
$("#" + myid).width(cell_size);
if ($('#map-view').val() == 'list')
$("#" + myid).height(1.5*cell_size);
else
$("#" + myid).height(cell_size);
if (((i+1)%w) == 0) {
id("map").innerHTML += '<div class="c"></div>\n';
y++; x=0;
}
else x++;
v++;
}
//$("#map-wrapper").show();
globalProgress();
}
function loadMobGrid() {
if (!m.data || !m.data.length)
return mobInit(z.data[Z].VNUM*100);
var w = 6;
var cell_size = parseInt(($("#mob-icons").width() - 50) / w);
$('#mob-icons').html('');
for (var i = 0; i < 100; i++) {
var myid = (z.data[Z].VNUM*100)+i;
var mi = mobFind(myid);
if (mi == -1)
id("mob-icons").innerHTML += '<li class="mcell ui-state-highlight context mContextClear" style="height: '+cell_size+'px; width: '+cell_size+'px" id="mob-' + myid + '"></li>\n';
else {
id("mob-icons").innerHTML += '<li class="micon ui-widget-header context mContext" id="mob-' + myid + '" style="height: '+cell_size+'px; width: '+cell_size+'px"></li>\n';
$("#mob-" + myid).html('<div class="vnum">'+myid.toString().slice(-2)+'</div><img class="mi" title="'+m.data[mi].Name+'" style="height: '+cell_size+'px; width: '+cell_size+'px" src="'+getMobPic(m.data[mi].Name)+'">');
}
if (((i+1)%w) == 0)
id("mob-icons").innerHTML += '<div class="c"></div>\n';
if (i == (m.data[m.data.length-1].VNUM.toInt()-(z.data[Z].VNUM*100)) && i < (z.data[Z].VNUM*100)+99) {
id("mob-icons").innerHTML += '<li class="mcell ui-state-highlight context mContextClear" style="height: '+cell_size+'px; width: '+cell_size+'px" id="mob-' + (myid+1) + '"></li>\n';
break;
}
}
}
function loadObjGrid() {
if (!o.data || !o.data.length)
return objInit(z.data[Z].VNUM*100);
var w = 8;
var cell_size = parseInt(($("#obj-icons").width() - 50) / w);
$('#obj-icons').html('');
for (var i = 0; i < 100; i++) {
var myid = (z.data[Z].VNUM*100)+i;
var mi = objFind(myid);
if (mi == -1)
id("obj-icons").innerHTML += '<li class="ocell ui-state-highlight context oContextClear" style="height: '+cell_size+'px; width: '+cell_size+'px" id="obj-' + myid + '"></li>\n';
else {
id("obj-icons").innerHTML += '<li class="oicon ui-widget-header context oContext" id="obj-' + myid + '" style="height: '+cell_size+'px; width: '+cell_size+'px"></li>\n';
$("#obj-" + myid).html('<div class="vnum">'+myid.toString().slice(-2)+'</div><img class="mi" title="'+o.data[mi].ShortDesc+'" style="height: '+cell_size+'px; width: '+cell_size+'px" src="'+getObjPic(o.data[mi].ShortDesc)+'">');
}
if (((i+1)%w) == 0)
id("obj-icons").innerHTML += '<div class="c"></div>\n';
if (i == (o.data[o.data.length-1].VNUM.toInt()-(z.data[Z].VNUM*100)) && i < (z.data[Z].VNUM*100)+99) {
id("obj-icons").innerHTML += '<li class="ocell ui-state-highlight context mContextClear" style="height: '+cell_size+'px; width: '+cell_size+'px" id="obj-' + (myid+1) + '"></li>\n';
break;
}
}
}
function gridRender() {
var y, x, i, v, u, d, b, my, w;
for (y = 0; y < grid.length; y++)
for (x = 0; x < grid[y].length; x++)
if (grid[y][x] > 0) {
v = grid[y][x];
i = roomFind(v);
my = '#'+y+'-'+x;
$(my).attr('class', 'rcell ui-widget-header context rContext');
$(my).attr('title', v + ': ' + r.data[i].Name);
$(my).attr('vnum', v);
if ($('#map-view').val() == 'list')
$(my).html('<div class="vnum">'+v.toString().slice(-2)+'</div><img class="ri" vnum="'+v+'" title="'+v+': '+r.data[i].Name+'" style="height: 100%; width: 100%" src="'+getRoomPic(r.data[i].Name)+'">');
else {
w = '';
u = getExitUp(v);
d = getExitDown(v);
if (u && d) w = 'updown'; else if (u) w = 'up'; else if (d) w = 'down';
if (w)
$(my).html('<div class="vnum">'+v.toString().slice(-2)+'</div><img class="ri" vnum="'+v+'" title="'+v+': '+r.data[i].Name+'" style="height: '+$(my).height()+'px; width: '+$(my).width()+'px" '+(w?' src="hub/stairs'+w+'.png"':'')+'">');
else
$(my).html('<div class="vnum">'+v.toString().slice(-2)+'</div>');
}
}
if ($('#map-view').val() == 'layout') {
b = '1px solid #eeeeee';
$('.rcell').each(function() {
var y = $(this).attr('id').split('-')[0].toInt();
var x = $(this).attr('id').split('-')[1].toInt();
if (y && grid[y-1][x] && !roomCheckLink(grid[y][x], grid[y-1][x]))
$(this).css('border-top', b);
if (x && grid[y][x-1] && !roomCheckLink(grid[y][x], grid[y][x-1]))
$(this).css('border-left', b);
if (y < (grid.length-1) && grid[y+1][x] && !roomCheckLink(grid[y][x], grid[y+1][x]))
$(this).css('border-bottom', b);
if (x < (grid[y].length-1) && grid[y][x+1] && !roomCheckLink(grid[y][x], grid[y][x+1]))
$(this).css('border-right', b);
});
b = '1px solid #000000';
$('.rcell').each(function() {
var y = $(this).attr('id').split('-')[0].toInt();
var x = $(this).attr('id').split('-')[1].toInt();
if (y && grid[y-1][x] && roomCheckDoor(grid[y][x], grid[y-1][x]))
$(this).css('border-top', b);
if (x && grid[y][x-1] && roomCheckDoor(grid[y][x], grid[y][x-1]))
$(this).css('border-left', b);
if (y < (grid.length-1) && grid[y+1][x] && roomCheckDoor(grid[y][x], grid[y+1][x]))
$(this).css('border-bottom', b);
if (x < (grid[y].length-1) && grid[y][x+1] && roomCheckDoor(grid[y][x], grid[y][x+1]))
$(this).css('border-right', b);
});
}
//enable context menus
contextReset();
}
function gridRefreshLinks() {
gridInit();
gridRender();
}
function contextReset() {
$(".context").destroyContextMenu();
$(".rContext").contextMenu(
{ menu: 'rContext' },
function(action, el, pos) {
if (action == 'cut') { dbr.room_cut = $(el).attr('vnum'); dbr.room_copy = 0 }
else if (action == 'copy') dbr.room_copy = $(el).attr('vnum');
else if (action == 'paste') roomPaste(dbr.room_copy, $(el).attr('vnum'), el);
else if (action == 'reset') roomReset($(el).attr('vnum'), el);
else if (action == 'delete') roomDelete($(el).attr('vnum'));
else if (action == 'up') roomDig(el, up);
else if (action == 'down') roomDig(el, down);
else if (action == 'load') showLoadMenu();
});
$(".rContextClear").contextMenu(
{ menu: 'rContextClear' },
function(action, el, pos) {
if (action == 'paste')
roomMove(dbr.room_cut, el);
});
$(".mContext").contextMenu(
{ menu: 'mContext' },
function(action, el, pos) {
if (action == 'cut') { dbr.mob_cut = $(el).attr('vnum'); dbr.mob_copy = 0 }
else if (action == 'copy') dbr.mob_copy = $(el).attr('id').split('-')[1];
else if (action == 'paste') mobPaste(el);
else if (action == 'delete') { mobDelete($(el).attr('id').split('-')[1]); loadMobGrid() }
else if (action == 'load') mobObjectAdd($(el).attr('id').split('-')[1]);
});
$(".mContextClear").contextMenu(
{ menu: 'mContextClear' },
function(action, el, pos) {
if (action == 'move')
mobMove(el);
else (action == 'clone')
mobInit(null, el);
});
}
function contextBeforeShow(el) {
if ($('#map-view').val() != 'layout') {
$('#rContext .down').hide();
$('#rContext .up').hide();
return;
}
if ($(el).html().has('updown')) {
$('#rContext .up-text').html('Go Up');
$('#rContext .down-text').html('Go Down');
$('#rContext .up').show();
$('#rContext .down').show();
return;
}
if ($(el).html().has('up')) {
$('#rContext .up-text').html('Go Up');
$('#rContext .down-text').html('Dig Down');
$('#rContext .up').show();
$('#rContext .down').show();
return;
}
if ($(el).html().has('down')) {
$('#rContext .up-text').html('Dig Up');
$('#rContext .down-text').html('Go Down');
$('#rContext .up').show();
$('#rContext .down').show();
return;
}
$('#rContext .up-text').html('Dig Up');
$('#rContext .down-text').html('Dig Down');
$('#rContext .up').show();
$('#rContext .down').show();
}
function roomCheckLink(A, B) {
for (var i = 0; i < r.exits.length; i++) {
if (r.exits[i].VNUM != A) continue;
if (r.exits[i].ToRoom == B) return true;
}
return false;
}
function roomCheckDoor(A, B) {
for (var i = 0; i < r.exits.length; i++) {
if (r.exits[i].VNUM != A) continue;
if (r.exits[i].ToRoom == B && r.exits[i].ExitInfo != '0') return true;
}
return false;
}
function roomCheckPlacement(y, x) {
if (grid.length == 1) return true;
if (x && grid[y][x-1]) return true;
if (y && grid[y-1][x]) return true;
if (x < grid[y].length - 1 && grid[y][x+1]) return true;
if (y < grid.length - 1 && grid[y+1][x]) return true;
return false;
}
/* room grid interactions */
function roomClick(evt) {
evt = evt?evt:window.event;
if (evt.which != 1) return false;
var el = evt.target||evt.srcElement;
//if (!$(el).hasClass('ui-state-active')) {
roomLoad($(el).attr('vnum'));
$('.rcell').removeClass('ui-state-active');
if ($(el).is('img'))
$(el).parent().addClass('ui-state-active');
else $(el).addClass('ui-state-active');
//}
}
function roomDoubleClick(evt) {
evt = evt?evt:window.event;
if (evt.which != 1) return false;
var el = evt.target||evt.srcElement;
}
/* room saving & loading */
function roomInit(evt) {
evt = evt?evt:window.event;
if (evt.which != 1) return false;
var el = evt.target||evt.srcElement;
var vnum;
if ($('#map-view').val() == 'list')
vnum = $(el).attr('vnum');
else vnum = getFreeVnum(r.data);
if (vnum == -1) {
showDialog('Room creation error', 'There are no more free unique room numbers in the current area. Delete some rooms first or request another area.');
return false;
}
var y = el.id.split('-')[0].toInt();
var x = el.id.split('-')[1].toInt();
/*
if (!dbr.flat && !roomCheckPlacement(y, x)) {
showDialog('Room placement error', 'The areabuilder doesn\'t allow unlinked rooms. You can add spacial irregularities later using OLC.');
return false;
}*/
grid[y][x] = vnum;
$(el).attr('vnum', vnum);
r.data.push({
Zone: z.data[Z].VNUM,
VNUM: vnum.toString(),
Name: 'New room',
Description: 'You are in an unfinished room.\r\n',
RoomFlags: '0',
SectorType: '0'
});
r.data = sortHash(r.data, 'VNUM');
roomAutoLink(vnum, y, x);
r.exits = sortHash(r.exits, 'INUM');
if ($('#map-view').val() != 'list')
for (y = 0; y < grid.length; y++)
for (x = 0; x < grid[y].length; x++) {
if (!grid[y][x]) continue;
if (!y) gridPrependRow();
if (!x) gridPrependColumn();
if (y == grid.length-1) gridAppendRow();
if (x == grid[y].length-1) gridAppendColumn();
gridInit();
}
gridRender();
$('#'+y+'-'+x).trigger({ type: 'mousedown', which: 1 });
}
function roomLoad(vnum) {
if ($("*:focus").html() != null) $("*:focus").get(0).blur();
//$('#room-flags').multiselect('uncheckAll');
$("#data").tabs('select', '#data_rooms');
R = roomFind(vnum);
$('#room-name').val(r.data[R].Name);
$('#room-id').val(r.data[R].VNUM);
r.data[R].RoomFlags.toFlag('#room-flags');
$('#room-sector').selectmenu('value', r.data[R].SectorType);
$('#room-description').val(r.data[R].Description.format());
for (i = 0; i < dirs.length; i++) {
$('#exit-'+dirs[i]+'-toroom').val('');
$('#exit-'+dirs[i]+'-keyword').val('');
$('#exit-'+dirs[i]+'-key').val('');
$('#exit-'+dirs[i]+'-info').multiselect('uncheckAll');
}
$('.delete-exit').hide();
$('.link-exit').hide();
for (i in r.exits) {
if (r.exits[i].VNUM != vnum) continue;
if (r.exits[i].ToRoom == '-1') continue;
var e = r.exits[i].NUM.toInt();
$('#exit-'+dirs[e]+'-toroom').val(r.exits[i].ToRoom);
$('#exit-'+dirs[e]+'-keyword').val(r.exits[i].Keyword);
$('#exit-'+dirs[e]+'-key').val(r.exits[i].KeyNumber);
r.exits[i].ExitInfo.toFlag('#exit-'+dirs[e]+'-info');
//if (!dbr.flat)
$('#del-'+dirs[e]).show();
}
//if (!dbr.flat)
for (i = 0; i < 6; i++)
if (!$('#del-'+dirs[i]).is(":visible"))
$('#link-'+dirs[i]).show();
$('#room-loads').html('');
var html = '', l, obj_to = [];
for (i in z.reset) {
l = z.reset[i].LNUM;
if (z.reset[i].Arg3 == vnum && z.reset[i].Command == 'M') {
html += '<span class="left ui-icon ui-icon-circle-close ui-reset-load" lnum="'+l+'" vnum="'+vnum+'"></span> Mob: <a href="#" onclick="mobLoad('+m.data[mobFind(z.reset[i].Arg1)].VNUM+')">' + m.data[mobFind(z.reset[i].Arg1)].Name + '</a> max: <input class="zreset max" lnum="'+l+'" arg="Arg2" value="' + z.reset[i].Arg2 + '"><div class="sep"></div>';
}
else if (z.reset[i].Arg3 == vnum && z.reset[i].Command == 'O') {
html += '<span class="left ui-icon ui-icon-circle-close ui-reset-load" lnum="'+l+'" vnum="'+vnum+'"></span> Obj: <a href="#" onclick="objLoad('+o.data[objFind(z.reset[i].Arg1)].VNUM+')">' + o.data[objFind(z.reset[i].Arg1)].ShortDesc + '</a> max: <input class="zreset max" lnum="'+l+'" arg="Arg2" value="' + z.reset[i].Arg2 + '"><div class="sep"></div>';
obj_to.push(o.data[objFind(z.reset[i].Arg1)].VNUM);
}
else if (z.reset[i].Command == 'P' && $.inArray(z.reset[i].Arg3, obj_to) != -1) {
html += '<span class="left ui-icon ui-icon-circle-close ui-reset-load" lnum="'+l+'" vnum="'+vnum+'"></span> Put: ' + o.data[objFind(z.reset[i].Arg1)].ShortDesc + ' max: <input class="zreset max" lnum="'+l+'" arg="Arg2" value="' + z.reset[i].Arg2 + '"> inside ' + o.data[objFind(z.reset[i].Arg3)].ShortDesc + '<div class="sep"></div>';
}
}
$('#room-loads').html('<span class="left ui-icon ui-icon-circle-plus ui-reset-add"></span> <b>Loads:</b><br><br>' + html + '<div class="sep"></div>');
}
function roomLink(from, dir, to, no_rev) {
if (!to) {
var l = getGridLocation(from.toString());
if (!l.length) return false;
var y = l[0]; var x = l[1];
switch (dir) {
case 0: if (!y || !grid[y-1][x]) return false; else to = grid[y-1][x]; break;
case 1: if (x == grid[y].length-1 || !grid[y][x+1]) return false; else to = grid[y][x+1]; break;
case 2: if (y == grid.length-1 || !grid[y+1][x]) return false; else to = grid[y+1][x]; break;
case 3: if (!x || !grid[y][x-1]) return false; else to = grid[y][x-1]; break;
default : return false; break;
}
}
r.exits.push({
VNUM: from.toString(),
NUM: dir.toString(),
Description: '',
Keyword: '',
ExitInfo: '0',
KeyNumber: '0',
ToRoom: to.toString(),
INUM: from + '.' + dir
});
if (no_rev) return true;
r.exits.push({
VNUM: to.toString(),
NUM: rev_dir[dir].toString(),
Description: '',
Keyword: '',
ExitInfo: '0',
KeyNumber: '0',
ToRoom: from.toString(),
INUM: to + '.' + rev_dir[dir]
});
}
function roomPaste(from, to, el) {
if (!from) {
showDialog('Room paste error.', 'No room properties found in clipboard.');
return false;
}
var vnum = to;
from = roomFind(from);
to = roomFind(to);
r.data[to].Name = r.data[from].Name;
r.data[to].Description = r.data[from].Description;
r.data[to].RoomFlags = r.data[from].RoomFlags;
r.data[to].SectorType = r.data[from].SectorType;
roomLoad(vnum);
}
function roomMove(cut, el) {
if (!cut) {
showDialog('Room move error.', 'No \'cut\' room found in clipboard.');
return false;
}
var y = $(el).attr('id').split('-')[0].toInt();
var x = $(el).attr('id').split('-')[1].toInt();
var l = getGridLocation(cut);
grid[y][x] = cut;
grid[l[0]][l[1]] = 0;
roomDeleteExits(cut);
roomAutoLink(cut, y, x);
r.exits = sortHash(r.exits, 'INUM');
if (!x) x = 1;
if (!y) y = 1;
gridLoad();
$('#'+y+'-'+x).trigger({ type: 'mousedown', which: 1 });
}
function roomReset(room, el) {
var vnum = room;
room = roomFind(room);
r.data[room].Name = 'New Room';
r.data[room].Description = 'You are in an unfinished room.';
r.data[room].RoomFlags = '0';
r.data[room].SectorType = '0';
$(el).trigger({ type: 'mousedown', which: 1 });
}
function roomDig(el, dir) {
var from = $(el).attr('vnum');
var to = (dir==up)?getExitUp(from):getExitDown(from);
if (!to) {
to = getFreeVnum(r.data);
if (to == -1) {
showDialog('Room creation error', 'There are no more free unique room numbers in the current area. Delete some rooms first or request a new area.');
return false;
}
r.data.push({
Zone: z.data[Z].VNUM,
VNUM: to.toString(),
Name: 'New room',
Description: 'You are in an unfinished room.\r\n',
RoomFlags: '0',
SectorType: '0'
});
roomLink(from, dir, to);
r.exits = sortHas(r.exits, 'INUM');
}
dbr.grid_start = to;
gridLoad();
}
function roomDelete(vnum) {
r.data.splice(roomFind(vnum), 1);
roomDeleteExits(vnum);
gridLoad();
}
function roomDeleteExits(vnum) {
for (var i = r.exits.length-1; i >=0; i--)
if (r.exits[i].VNUM == vnum || r.exits[i].ToRoom == vnum)
r.exits.splice(i, 1);
}
function roomAutoLink(vnum, y, x) {
if ($('#map-view').val() == 'list') return;
if (y && grid[y-1][x])
roomLink(vnum, north, grid[y-1][x]);
if (y < grid.length-1 && grid[y+1][x])
roomLink(vnum, south, grid[y+1][x]);
if (x && grid[y][x-1])
roomLink(vnum, west, grid[y][x-1]);
if (x < grid[0].length-1 && grid[y][x+1])
roomLink(vnum, east, grid[y][x+1]);
}
function mobLoad(vnum) {
if ($("*:focus").html() != null) $("*:focus").get(0).blur();
$("#data").tabs('select', '#data_mobs');
$('.micon').removeClass('ui-state-active');
$('#mob-'+vnum).addClass('ui-state-active');
//$('#mob-flags').multiselect('uncheckAll');
//$('#mob-affects').multiselect('uncheckAll');
M = mobFind(vnum);
$('#mob-name').val(m.data[M].Name);
$('#mob-keywords').val(m.data[M].Keywords);
$('#mob-level').val(m.data[M].Level);
$('#mob-id').val(m.data[M].VNUM);
m.special_data[M].MobFlags.toFlag('#mob-flags');
m.special_data[M].AffectedBy.toFlag('#mob-affects');
$('#mob-sex').selectmenu('value', m.data[M].Sex);
$('#mob-class').selectmenu('value', m.data[M].Class);
$('#mob-race').selectmenu('value', m.special_data[M].Race);
$('#mob-short').val(m.data[M].Descr.stripBreaks());
$('#mob-long').val(m.data[M].LongDescr.stripBreaks());
$('#mob-health').val(m.points[M].BaseHit);
$('#mob-armor').val(m.points[M].Armor);
$('#mob-hitroll').slider('option', 'value', 20 - m.points[M].Hitroll.toInt());
$('#mob-exp').val(m.points[M].Exp);
$('#mob-gold').val(m.points[M].Gold);
$('#mob-align').val(m.special_data[M].Align);
mobAttacksLoad(vnum);
mobObjectsLoad(vnum);
mobProgsLoad(vnum);
mobShopLoad(vnum);
}
function mobAttacksLoad(vnum) {
$('#mob-attacks').html('<span class="left ui-icon ui-icon-circle-plus attack-add"></span> <b>Attacks:</b><br><br>');
var n = 0;
for (var i in m.attacks) {
if (m.attacks[i].VNUM != vnum) continue;
$('#mob-attacks').append('<div id="mob-attack-'+m.attacks[i].INUM+'"><span class="left">\
<span class="left ui-icon ui-icon-circle-close attack-delete" inum="'+m.attacks[i].INUM+'"></span> \
<input class="mob-attack attack-damroll-'+n+'" inum="'+m.attacks[i].INUM+'" data="Damroll" type="text" style="width: 20px" value="'+m.attacks[i].Damroll+'">\
+ <input class="mob-attack attack-nodice-'+n+'" inum="'+m.attacks[i].INUM+'" data="NoDice" type="text" style="width: 20px" value="'+m.attacks[i].NoDice+'">\
dice of <input class="mob-attack attack-sizedice-'+n+'" inum="'+m.attacks[i].INUM+'" data="SizeDice" type="text" style="width: 20px" value="'+m.attacks[i].SizeDice+'"> sides \
<select class="attack-type attack-type-'+n+'" data="'+m.attacks[i].INUM+'">\
<option value="0">hit</option>\
<option value="1">slash</option>\
<option value="3">trash</option>\
<option value="5">crush</option>\
<option value="6">pound</option>\
<option value="11">strike</option>\
<option value="12">pierce</option>\
<option value="13">whip</option>\
<option value="16">stab</option>\
<option value="17">pummel</option>\
<option value="18">smite</option>\
<option value="21">sting</option>\
<option value="22">bite</option>\
<option value="23">bludgeon</option>\
<option value="24">claw</option>\
<option value="25">maul</option>\
<option value="26">blast</option>\
<option value="27">punch</option>\
</select></span>\
<span class="left"> Speed: - </span><div data="'+m.attacks[i].INUM+'" class="left attack-speed-'+n+'" style="width: 90px"></div><span class="left"> +</span></div>\
');
$('.attack-type-'+n).val(m.attacks[i].Type);
$('.attack-speed-'+n).slider({
value: 1,
min: 1,
max: 100,
stop: function() { for (var i in m.attacks) if (m.attacks[i].INUM == $(this).attr('data')) { m.attacks[i].Attacks = (101-$(this).slider('option', 'value')).toString() } }
});
$('.attack-speed-'+n).slider('option', 'value', 101 - m.attacks[i].Attacks);
n++;
}
}
function mobAttackSet(id, param, value) {
for (var i in m.attacks) { if (m.attacks[i].INUM == id) m.attacks[i][param] = value }
}
function mobAttackAdd(vnum) {
var a = 0;
for (var i in m.attacks) {
if (m.attacks[i].VNUM == vnum) {
var t = m.attacks[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
m.attacks.push({
INUM: vnum.toString()+'.'+a,
VNUM: vnum.toString(),
NoDice: '1',
SizeDice: '1',
Damroll: '1',
Type: '0',
Attacks: '100'
});
m.attacks = sortHash(m.attacks, 'INUM');
mobLoad(vnum);
$('#mob-progs-accordion').accordion("activate", a);
}
function mobAttackDelete(inum) {
for (var i in m.attacks)
if (m.attacks[i].INUM == inum) {
m.attacks.splice(i, 1);
mobLoad(m.data[M].VNUM);
return;
}
}
function mobObjectsLoad(mnum) {
var html = '<span class="left ui-icon ui-icon-circle-plus mob-object-add"></span> <b>Loads:</b><br><br>';
for (var i in m.objects) {
if (m.objects[i].MNUM != mnum) continue;
html += '<div id="mob-object-'+m.objects[i].INUM+'">\
<span class="left ui-icon ui-icon-circle-close mob-object-delete" inum="'+m.objects[i].INUM+'"></span>\
<span class="left"> '+buildMobObjSelect(m.objects[i].ONUM, m.objects[i].INUM, 'mob-object-number mob-object-'+m.objects[i].NUM)+'</span>';
if (m.objects[i].ONUM.slice(0, -2) == z.data[Z].VNUM)
html += ' <span class="left ui-icon ui-icon-pencil" onclick="objLoad($(\'.mob-object-'+m.objects[i].NUM+'\').val())"></span> ';
html += '<span class="left"> <select class="mob-object-position" inum="'+m.objects[i].INUM+'">';
for (var p in obj_positions) {
if (m.objects[i].Position == obj_positions[p].a)
html += '<option value="'+obj_positions[p].a+'" selected="selected">'+obj_positions[p].b+'</option>';
else
html += '<option value="'+obj_positions[p].a+'">'+obj_positions[p].b+'</option>';
}
html += '</select></span><span class="left"> \
% Load: <input class="mob-object" data="Chance" type="text" style="width: 26px" value="'+m.objects[i].Chance+'">\
Max: <input class="mob-object" data="Max" type="text" style="width: 26px" value="'+m.objects[i].Max+'"></span></div><div style="clear:both"></div>';
}
$('#mob-objects').html(html);
}
function mobObjectSet(id, param, value) {
for (var i in m.objects) { if (m.objects[i].INUM != id) continue; m.objects[i][param] = value }
}
function mobObjectAdd(vnum) {
var a = 0;
for (var i in m.objects) {
if (m.objects[i].VNUM == vnum) {
var t = m.objects[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
m.objects.push({
INUM: vnum.toString()+'.'+a,
MNUM: vnum.toString(),
ONUM: o.data[0].VNUM,
NUM: a.toString(),
Chance: '50',
Position: '-1',
Max: '10'
});
m.objects = sortHash(m.objects, 'INUM');
mobLoad(vnum);
}
function mobObjectDelete(inum) {
for (var i in m.objects)
if (m.objects[i].INUM == inum) {
m.objects.splice(i, 1);
mobLoad(inum.split('.')[0]);
return;
}
}
function mobProgsLoad(vnum) {
var html = '<span class="left ui-icon ui-icon-circle-plus prog-add"></span> <b>Mobprogs:</b><span class="right"><a href="../mobprogs.php" target="_blank">examples</a></span><br><br><div id="mob-progs-accordion">';
var n = 1;
for (var i in m.progs)
if (m.progs[i].VNUM == vnum) {
html += '<h3><a href="#">Prog #'+n+'</a></h3><div id="mob-prog-'+m.progs[i].INUM+'">\
<span class="left ui-icon ui-icon-circle-close prog-delete" inum="'+m.progs[i].INUM+'"></span> \
Type:\
<select class="prog-type" data="'+m.progs[i].INUM+'">';
for (var p in mob_progs) {
if (mob_progs[p] == m.progs[i].Type)
html += '<option value="'+mob_progs[p]+'" selected="selected">'+mob_progs[p]+'</option>';
else
html += '<option value="'+mob_progs[p]+'">'+mob_progs[p]+'</option>';
}
html += '</select> Args:\
<input class="prog-args" type="text" style="width: 160px" value="'+m.progs[i].ArgList+'" data="'+m.progs[i].INUM+'"><div class="sep"></div>\
<textarea class="prog-commands" cols="70" rows="10" style="font-size: 10px" data="'+m.progs[i].INUM+'">'+m.progs[i].Commands+'</textarea>\
</div>';
n++;
}
$('#mob-progs').html(html + '</div>');
$('#mob-progs-accordion').accordion();
}
function mobProgAdd(vnum) {
var a = 0;
for (var i in m.progs) {
if (m.progs[i].VNUM == vnum) {
var t = m.progs[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
m.progs.push({
INUM: vnum.toString()+'.'+a,
VNUM: vnum.toString(),
Type: '0',
ArgList: '',
Commands: ''
});
m.progs = sortHash(m.progs, 'INUM');
mobLoad(vnum);
}
function mobProgDelete(inum) {
for (var i in m.progs)
if (m.progs[i].INUM == inum) {
m.progs.splice(i, 1);
mobLoad(inum.split('.')[0]);
return;
}
}
function mobShopLoad(vnum) {
var shop = shopFind(vnum);
$('#mob-shop').html('');
if (shop > -1) {
var html = '<span class="left ui-icon ui-icon-circle-close" onclick="mobShopDelete('+s.data[shop].SNUM+')"></span> <b>Shopkeeper:</b> sells at <input class="mob-buy-profit" style="width: 30px" snum="'+s.data[shop].SNUM+'" value="'+Math.round(s.data[shop].BuyProfit*100)+'"> %, buys at <input class="mob-sell-profit" style="width: 24px" snum="'+s.data[shop].SNUM+'" value="'+Math.round(s.data[shop].SellProfit*100)+'"> %<br><br>';
html += '<div class="indent"><span class="left ui-icon ui-icon-circle-plus" onclick="mobProductAdd(\''+s.data[shop].SNUM+'\')"></span><span class="ui-tooltip" title="The items a shopkeeper produces will be unlimited in quantity. Each has to be set to load on the mob in order to be available."> Produces:</span><br><br>';
for (var i in s.products)
if (s.products[i].SNUM == s.data[shop].SNUM) {
html += '<span class="left ui-icon ui-icon-circle-close" onclick="mobProductDelete(\''+s.products[i].INUM+'\')"></span>\
<span class="left"> '+buildMobObjSelect(s.products[i].ONUM, s.products[i].INUM, 'mob-product-select')+'</span>';
if (vnum.slice(0, -2) == z.data[Z].VNUM)
html += ' <span class="left ui-icon ui-icon-pencil" onclick="objLoad($(\'.mob-product-select\').val())"></span>';
html += '<div id="c"></div>';
}
html += '<br><br>';
html += '<span class="left ui-icon ui-icon-circle-plus" onclick="mobTypeAdd(\''+s.data[shop].SNUM+'\')"></span><span class="ui-tooltip" title="List item types that a shopkeeper will buy. For each type, optionally specify keywords this item type should match. For example: silver gold"."> Will buy:</span><br><br>';
for (var i in s.buys)
if (s.buys[i].SNUM == s.data[shop].SNUM) {
html += '<span class="left ui-icon ui-icon-circle-close" onclick="mobTypeDelete('+s.buys[i].INUM+')"></span> ';
html += buildBuyType(s.buys[i].INUM, s.buys[i].OTYPE);
html += ' with keywords: <input id="mob-buy-keywords" type="text" style="width: 160px" value="'+((s.buys[i].Keywords != '(null)')?s.buys[i].Keywords:'')+'" inum="'+s.buys[i].INUM+'"><div style="clear:both"></div>';
}
html += '</div><br>';
$('#mob-shop').html(html);
}
else $('#mob-shop').html('<span class="left ui-icon ui-icon-circle-plus" onclick="mobShopAdd('+vnum+')"></span> <b>Shopkeeper:</b><br>');
}
function mobShopAdd(mnum) {
var snum = getFree(s.data, 'SNUM');
var rnum = '';
for (var i in z.reset)
if (z.reset[i].Command == 'M' && z.reset[i].Arg1 == mnum) rnum = z.reset[i].Arg3;
s.data.push({
"SNUM": snum,
"ShopKeeper": mnum,
"BuyProfit": "1.2",
"SellProfit": "0.8",
"BitVector": "0",
"TradeWith": "0",
"BrokeTemper": "0",
"Open1":"0",
"Close1":"28",
"Open2":"0",
"Close2":"0",
"NoSuchItem1":"%s Haven't got that on storage - try list!",
"NoSuchItem2":"%s I don't have that.",
"DoNotBuy":"%s I don't buy these.",
"MissingCash1":"%s I can't afford that.",
"MissingCash2":"%s You don't have enough money.",
"MessageBuy":"%s That'll be %d coins.",
"MessageSell":"%s Oops - %d a minor bug - please report!",
"RNUM": rnum
});
s.buys.push({
"OTYPE":"0",
"Keywords":"(null)",
"INUM":snum+".0",
"NUM":"0",
"SNUM":snum
});
s.data = sortHash(s.data, 'INUM');
s.buys = sortHash(s.buys, 'INUM');
mobLoad(mnum);
}
function mobShopDelete(snum) {
for (var i in s.products)
if (s.products[i].SNUM == snum) { s.products.splice(i, 1); return }
for (var i in s.buys)
if (s.buys[i].SNUM == snum) { s.buys.splice(i, 1); return }
for (var i in s.data)
if (s.data[i].SNUM == snum) { s.data.splice(i, 1); return }
mobLoad(m.data[M].VNUM);
}
function mobProductDelete(inum) {
for (var i in s.products)
if (s.products[i].INUM == inum) {
s.products.splice(i, 1);
mobLoad(m.data[M].VNUM);
return;
}
}
function mobProductAdd(snum) {
if (!o.data || !o.data.length) return;
var a = 0;
for (var i in s.products) {
if (s.products[i].SNUM == snum) {
var t = s.products[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
s.products.push({
INUM: snum.toString()+'.'+a,
SNUM: snum.toString(),
NUM: a,
ONUM: o.data[0].VNUM
});
s.products = sortHash(s.products, 'INUM');
mobLoad(m.data[M].VNUM);
}
function mobTypeAdd(snum) {
var a = 0;
for (var i in s.buys) {
if (s.buys[i].SNUM == snum) {
var t = s.buys[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
s.buys.push({
INUM: snum.toString()+'.'+a,
SNUM: snum.toString(),
NUM: a,
Type: '0',
Keywords: '(null)'
});
s.buys = sortHash(s.buys, 'INUM');
mobLoad(m.data[M].VNUM);
}
function mobTypeDelete(inum) {
for (var i in s.buys)
if (s.buys[i].INUM == inum) {
s.buys.splice(i, 1);
mobLoad(m.data[M].VNUM);
return;
}
}
function mobBalance() {
if ($("*:focus").html() != null) $("*:focus").get(0).blur();
if (!$('#mob-level').val()) {
showDialog('Mob auto-balance error', 'Enter the mob level so it can be used as a basis.');
return;
}
var l = $('#mob-level').val().toInt();
var vnum = m.data[M].VNUM;
$('#mob-armor').val(parseInt(100-(l*3.2))).trigger('change');
$('#mob-health').val(parseInt((l*l*l*l)/450)).trigger('change');
$('#mob-hitroll').slider('option', 'value', parseInt((l*2)/3));
m.points[M].Hitroll = (20 - parseInt((l*2)/3)).toString();
$('#mob-exp').val(parseInt(Math.pow(l,4)/10)).trigger('change');
$('#mob-gold').val(parseInt(Math.pow(l,4)/96)).trigger('change');
if ($('.attack-nodice-0').html() != null) {
$('.attack-nodice-0').val(parseInt(l/5.4)).trigger('change');
$('.attack-sizedice-0').val(parseInt(l/3.8)).trigger('change');
$('.attack-damroll-0').val(parseInt(l/2.6)).trigger('change');
$('.attack-speed-0').slider('option', 'value', l);
for (var i in m.attacks) if (m.attacks[i].INUM == vnum + '.0') m.attacks[i].INUM = (l).toString();
}
else {
m.attacks.push({
INUM: vnum.toString()+'.0',
VNUM: vnum.toString(),
NoDice: (parseInt(l/8)).toString(),
SizeDice: (parseInt(l/6)).toString(),
Damroll: (parseInt(l/3)).toString(),
Type: '0',
Attacks: (20+l).toString()
});
m.attacks = sortHash(m.attacks, 'INUM');
mobLoad(vnum);
}
}
function mobInit(evt, el) {
var from = '';
if (!el) {
evt = evt?evt:window.event;
if (evt.which != 1) return false;
el = evt.target||evt.srcElement;
}
else {
from = dbr.mob_copy?dbr.mob_copy:dbr.mob_cut;
if (!from) {
showDialog('Mobile clone error', 'You have to copy or cut an existing mobile before cloning it.');
return;
}
from = mobFind(from);
}
var vnum = ($('#map-view').val() == 'list')?$(el).attr('vnum'):getFreeVnum(m.data);
if (vnum == -1) {
showDialog('Mobile creation error', 'There are no more free unique mobile numbers in the current area. Delete some first or request another area.');
return;
}
$(el).attr('vnum', vnum);
m.data.push({
VNUM: vnum.toString(),
Name: from?m.data[from].Name:'New mob',
Class: from?m.data[from].Class:'0',
Sex: from?m.data[from].Sex:'0',
Level: from?m.data[from].Level:'1',
Descr: from?m.data[from].Descr:'An unfinished mob is here.\r\n',
LongDescr: from?m.data[from].LongDescr:'',
Keywords: from?m.data[from].Keywords:'0'
});
m.data = sortHash(m.data, 'VNUM');
m.special_data.push({
VNUM: vnum.toString(),
Align: from?m.special_data[from].Align:'0',
MobFlags: from?m.special_data[from].MobFlags:'0',
AffectedBy: from?m.special_data[from].AffectedBy:'0',
Position: from?m.special_data[from].Position:'1',
DefaultPos: from?m.special_data[from].DefaultPos:'8',
Race: from?m.special_data[from].Race:'0'
});
m.points.push({
VNUM: vnum.toString(),
Hit1: from?m.points[from].Hit1:'0',
Hit2: from?m.points[from].Hit2:'0',
BaseHit: from?m.points[from].BaseHit:'0',
Armor: from?m.points[from].Armor:'0',
Gold: from?m.points[from].Gold:'0',
Exp: from?m.points[from].Exp:'0',
Hitroll: from?m.points[from].Hitroll:'0',
Damroll: from?m.points[from].Damroll:'0'
});
m.abilities.push({
VNUM: vnum.toString(),
Str: from?m.points[from].Str:'11',
StrAdd: from?m.points[from].StrAdd:'11',
Intel: '11',
Wis: '11',
Dex: '11',
Con: '11',
Cha: '11'
});
if (!from)
m.attacks.push({
INUM: vnum.toString()+'.0',
VNUM: vnum.toString(),
NoDice: '1',
SizeDice: '1',
Damroll: '1',
Type: '0',
Attacks: '100'
});
else {
for (var i in m.attacks)
if (m.attacks[i].VNUM == m.data[from].VNUM)
m.attacks.push({
INUM: vnum.toString()+'.0',
VNUM: vnum.toString(),
NoDice: m.attacks[i].NoDice,
SizeDice: m.attacks[i].SizeDice,
Damroll: m.attacks[i].Damroll,
Type: m.attacks[i].Type,
Attacks: m.attacks[i].Attacks
});
}
loadMobGrid();
$('#mob-'+vnum).trigger({ type: 'mousedown', which: 1 });
}
function mobMove(el) {
var from = dbr.mob_copy?dbr.mob_copy:dbr.mob_cut;
var to = $(el).attr('id').split('-')[1];
var i;
if (!from) {
showDialog('Mobile move error', 'You have to copy or cut an existing mobile before moving it.');
return;
}
from = mobFind(from);
for (i in m.data)
if (m.data[i].VNUM == from) m.data[i].VNUM = to;
for (i in m.points)
if (m.points[i].VNUM == from) m.points[i].VNUM = to;
for (i in m.special_data)
if (m.special_data[i].VNUM == from) m.special_data[i].VNUM = to;
for (i in m.abilities)
if (m.abilities[i].VNUM == from) m.abilities[i].VNUM = to;
for (i in m.attacks)
if (m.attacks[i].VNUM == from) {
m.attacks[i].VNUM = to;
m.attacks[i].INUM = to + m.attacks[i].INUM.split('.')[1];
}
for (i in m.progs)
if (m.progs[i].VNUM == from) {
m.progs[i].VNUM = to;
m.progs[i].INUM = to + m.progs[i].INUM.split('.')[1];
}
for (i in m.objects)
if (m.objects[i].MNUM == from) {
m.objects[i].MNUM = to;
m.objects[i].INUM = to + m.objects[i].INUM.split('.')[1];
}
for (i in z.reset) {
if (z.reset[i].Command == 'M' && z.reset[i].Arg1 == from) z.reset[i].Arg1 = to;
if (z.reset[i].Command == 'G' && z.reset[i].Arg3 == from) z.reset[i].Arg3 = to;
}
}
function mobDelete(vnum) {
var i, scan;
for (i in m.data)
if (m.data[i].VNUM == vnum) m.data.splice(i, 1);
for (i in m.points)
if (m.points[i].VNUM == vnum) m.points.splice(i, 1);
for (i in m.special_data)
if (m.special_data[i].VNUM == vnum) m.special_data.splice(i, 1);
for (i in m.abilities)
if (m.abilities[i].VNUM == vnum) m.abilities.splice(i, 1);
for (i in m.attacks)
if (m.attacks[i].VNUM == vnum) {
m.attacks.splice(i, 1);
i--;
}
for (i in m.progs)
if (m.progs[i].VNUM == vnum) {
m.progs.splice(i, 1);
i--;
}
for (i in m.objects)
if (m.objects[i].MNUM == vnum) {
m.objects.splice(i, 1);
i--;
}
for (i in z.reset) {
if (z.reset[i].Command == 'G' && z.reset[i].Arg3 == vnum) { z.reset.splice(i, 1); i-- }
if (z.reset[i].Command == 'M' && z.reset[i].Arg1 == vnum) {
z.reset.splice(i, 1);
i--;
scan = true;
}
if (scan) {
if (z.reset[i].Command == 'M') scan = false;
if (z.reset[i].Command == 'E') { z.reset.splice(i, 1); i-- }
}
}
}
function objLoad(vnum) {
if ($("*:focus").html() != null) $("*:focus").get(0).blur();
$("#data").tabs('select', '#data_objs');
$('.oicon').removeClass('ui-state-active');
$('#obj-'+vnum).addClass('ui-state-active');
//$('#obj-flags').multiselect('uncheckAll');
//$('#obj-extra').multiselect('uncheckAll');
O = objFind(vnum);
$('#obj-id').val(o.data[O].VNUM);
$('#obj-name').val(o.data[O].ShortDesc);
$('#obj-keywords').val(o.data[O].Keywords);
$('#obj-type').selectmenu('value', o.data[O].Type.toString());
$('#obj-weight').val(o.data[O].Weight);
$('#obj-material').selectmenu('value', o.data[O].Val4);
o.data[O].WearFlags.toFlag('#obj-worn');
o.data[O].ExtraFlags.toFlag('#obj-extra');
o.data[O].BitVector.toFlag('#obj-aff');
$('#obj-value').val(o.data[O].Cost);
$('#obj-cost').val(o.data[O].CostPerDay);
$('#obj-short').val(o.data[O].Descr.stripBreaks());
objTypeChange();
$('#obj-apply-form').html('<table style="width: 80%"><tr><td class="obj-col-0"></td><td class="obj-col-1"></td></tr></table>');
var c = 0
for (var i = 0; i < 6; i++) {
$('.obj-col-'+c).append('<input class="obj-input" data="Mod'+i+'" type="text" style="width: 28px" value="'+o.data[O]['Mod'+i].toInt()+'"> to ' + buildApplySelect(i, o.data[O]['Aff'+i].toInt()) + '<br>');
c = 1 - c;
}
if ($('#obj-apply-button').hasClass('collapsed'))
$('#obj-apply-form').hide();
objLoadDescriptions(vnum);
}
function objLoadDescriptions(vnum) {
$('#obj-desc').html('<span class="left ui-icon ui-icon-circle-plus obj-desc-add"></span> <span class="ui-tooltip" title="additional item descriptions when the user looks at or examines via a keyword"><b>Extra Descriptions:</b></span><br><br>');
for (var i in o.extra) {
if (o.extra[i].VNUM == vnum) {
$('#obj-desc').append('<div id="obj-desc-'+o.extra[i].INUM+'"><span class="left">\
<span class="left ui-icon ui-icon-circle-close obj-desc-delete" inum="'+o.extra[i].INUM+'"></span><span class="left"> \
Keyword: <input class="obj-desc" inum="'+o.extra[i].INUM+'" data="Keyword" type="text" style="width: 140px" value="'+o.extra[i].Keyword+'"></span><br><br>\
Description:<textarea class="obj-desc" inum="'+o.extra[i].INUM+'" data="Description" cols="80" rows="5" style="font-size: 11px">'+o.extra[i].Description+'</textarea><br><br></div>');
}
}
}
function objDescriptionAdd(vnum) {
var a = 0;
if (!o.extra || !o.extra.length) o.extra = [];
for (var i in o.extra) {
if (o.extra[i].VNUM == vnum) {
var t = o.extra[i].INUM.split('.')[1].toInt();
if (t == a) a++;
}
}
o.extra.push({
INUM: vnum.toString()+'.'+a,
VNUM: vnum.toString(),
NUM: a,
Keyword: '',
Description: ''
});
o.extra = sortHash(o.extra, 'INUM');
objLoad(vnum);
}
function objDescriptionDelete(inum) {
for (var i in o.extra)
if (o.extra[i].INUM == inum) {
o.extra.splice(i, 1);
objLoad(inum.split('.')[0]);
return;
}
}
function objInit(evt) {
//$("#data").tabs('select', '#data_objs');
evt = evt?evt:window.event;
if (evt.which != 1) return false;
var el = evt.target||evt.srcElement;
var vnum;
if ($('#map-view').val() == 'list')
vnum = $(el).attr('vnum');
else vnum = getFreeVnum(o.data);
if (vnum == -1) {
showDialog('Object creation error', 'There are no more free unique object numbers in the current area. Delete some first or request another area.');
return false;
}
$(el).attr('vnum', vnum);
o.data.push({
VNUM: vnum.toString(),
ShortDesc: 'New object',
Type: '11',
Keywords: '',
Descr: 'An unfinished object is here.\r\n',
LongDesc: '',
WearFlags: '1',
ExtraFlags: '0',
BitVector: '0',
Cost: '0',
CostPerDay: '0',
Val0: '0',
Val1: '0',
Val2: '0',
Val3: '0',
Val4: '0',
Sval0: '0',
Sval1: '0',
Sval2: '0',
Aff0: '0',
Mod0: '0',
Aff1: '0',
Mod1: '0',
Aff2: '0',
Mod2: '0',
Aff3: '0',
Mod3: '0',
Aff4: '0',
Mod4: '0',
Aff5: '0',
Mod5: '0',
});
o.data = sortHash(o.data, 'VNUM');
loadObjGrid('#obj-'+vnum);
$('#obj-'+vnum).trigger({ type: 'mousedown', which: 1 });
}
function objTypeChange() {
if ($('#obj-type').val() == 5) {
$('#v0-label').html('');
$('#v1-label').html('<input id="obj-v1" type="text" style="width: 20px" value="'+o.data[O].Val1+'"> dice of');
$('#v2-label').html(' <input id="obj-v2" type="text" style="width: 20px" value="'+o.data[O].Val2+'"> sides');
$('#v3-label').html(' '+buildWeaponSelect(o.data[O].Val3));
}
else if ($.inArray($('#obj-type').val(), ['2','3','4','10']) != -1) {
$('#v0-label').html('Lvl: <input id="obj-v0" type="text" value="'+o.data[O].Val0+'" style="width: 24px"> ');
$('#v1-label').html('<div class="sep"></div>Casts: '+buildSpellSelect(1, o.data[O].Val1));
$('#v2-label').html(buildSpellSelect(2, o.data[O].Val2));
$('#v3-label').html(buildSpellSelect(3, o.data[O].Val3));
}
else if ($('#obj-type').val() == 9) {
$('#v0-label').html('AC Apply: <input id="obj-v0" type="text" style="width: 24px" value="'+o.data[O].Val0+'">');
$('#v1-label').html('');
$('#v2-label').html('');
$('#v3-label').html('');
}
else if ($('#obj-type').val() == 15) {
$('#v0-label').html('Capacity: <input id="obj-v0" type="text" style="width: 24px" value="'+o.data[O].Val0+'">');
$('#v1-label').html('');
$('#v2-label').html('');
$('#v3-label').html('');
}
else if ($('#obj-type').val() == 19) {
$('#v0-label').html('How filling (1-24): <input id="obj-v0" type="text" style="width: 24px" value="'+o.data[O].Val0+'">');
$('#v1-label').html('');
$('#v2-label').html('');
$('#v3-label').html('');
}
else if ($('#obj-type').val() == 1) {
$('#v0-label').html('');
$('#v1-label').html('');
$('#v2-label').html('Hours (-1 for perm.): <input id="obj-v2" type="text" style="width: 24px" value="'+o.data[O].Val2+'">');
$('#v3-label').html('');
}
else if ($('#obj-type').val() == 17 || $('#obj-type').val() == 23) {
$('#v0-label').html('Max: <input id="obj-v0" type="text" style="width: 24px" value="'+o.data[O].Val0+'">');
$('#v1-label').html('Contains: <input id="obj-v1" type="text" style="width: 24px" value="'+o.data[O].Val1+'">');
$('#v2-label').html(' ');
$('#v3-label').html(buildLiquidSelect(o.data[O].Val3));
}
else if ($.inArray($('#obj-type').val(), ['0','8','11','12','13','16','18','20','22','24']) != -1) {
$('#v0-label').html('');
$('#v1-label').html('');
$('#v2-label').html('');
$('#v3-label').html('');
}
else {
$('#v0-label').html('<input id="obj-v0" type="text" value="'+o.data[O].Val0+'" style="width: 30px"> ');
$('#v1-label').html('<input id="obj-v1" type="text" value="'+o.data[O].Val1+'" style="width: 30px"> ');
$('#v2-label').html('<input id="obj-v2" type="text" value="'+o.data[O].Val2+'" style="width: 30px"> ');
$('#v3-label').html('<input id="obj-v3" type="text" value="'+o.data[O].Val3+'" style="width: 30px"> ');
}
}
function save(obj, where) {
globalProgress('Saving to database...');
if (!obj) {
if (where.has('r')) {
if (r.data) save(r.data, 'RoomData');
if (r.exits) save(r.exits, 'RoomExits');
}
if (where.has('m')) {
if (m.data) {
save(m.data, 'MobData');
save(m.special_data, 'MobSpecialData');
save(m.objects, 'MobObjects');
save(m.attacks, 'MobAttacks');
save(m.points, 'MobPoints');
save(m.abilities, 'MobAbilities');
}
if (m.progs) save(m.progs, 'MobProgs');
if (s.data) save(s.data, 'ShopData');
if (s.buys) save(s.buys, 'ShopBuyTypes');
if (s.products) save(s.products, 'ShopProducts');
}
if (where.has('o')) {
if (o.data) save(o.data, 'ObjectData');
if (o.extra) save(o.extra, 'ObjectExtraDescriptions');
}
if (where.has('z')) {
if (z.reset) save(z.reset, 'ZoneReset');
}
}
if (exists(obj) && obj && obj.length)
$.ajax({
type: 'POST',
url: 'controller.php?task=put&t='+where,
data: JSON.stringify(obj),
dataType: 'json',
success: function(data) {
globalProgress();
data.response.hasError();
}
});
}
function roomFind(vnum) { for (var i = 0; i < r.data.length; i++) if (r.data[i].VNUM==vnum) return i; return -1 }
function mobFind(vnum) { for (var i = 0; i < m.data.length; i++) if (m.data[i].VNUM==vnum) return i; return -1 }
function objFind(vnum) { for (var i = 0; i < o.data.length; i++) if (o.data[i].VNUM==vnum) return i; return -1 }
function objFindExtra(inum) { for (var i = 0; i < o.extra.length; i++) if (o.extra[i].INUM==inum) return i; return -1 }
function shopFind(vnum) { for (var i = 0; i < s.data.length; i++) if (s.data[i].ShopKeeper==vnum) return i; return -1 }
function zonePublish() {
if (!Z) return;
globalProgress(z.data[Z].Name+': publishing to production...');
$.get('controller.php?task=publish&id=' + z.data[Z].VNUM, function(data) { globalProgress() });
}
function zoneSync() {
if (!Z) return;
globalProgress(z.data[Z].Name+': restoring production version...');
$.get('controller.php?task=sync&id=' + z.data[Z].VNUM, function(data) { globalProgress(); loadZone(Z) });
}
function zoneResetDelete(lnum) {
for (var i = 0; i < z.reset.length; i++)
if (i == lnum) {
z.reset.splice(i, 1);
for (var i = 0; i < z.reset.length; i++)
z.reset[i].LNUM = i.toString();
return;
}
}
/* entity icons */
function loadSettings(A) {
A = A.split('\n');
var n = 0, mi, oi, ri;
for (var i = 0; i < A.length; i++) {
//if (dev) alert(A[i]);
if (A[i].has('//NPC')) { mi=true }
else if (A[i].has('//OBJ')) { mi=false; oi=true }
else if (A[i].has('//ROOM')) { mi=oi=false; ri=true }
if (!A[i] || A[i].indexOf('//') == 0 || A[i].indexOf('|') == -1) continue;
//if (dev) alert(A[i]);
var line = A[i].split('|');//if (dev) alert(line[0]);
var key = line[0].split('_')[1];
if (!key) continue;
if (mi) {
mob_images[key] = line[1];
mob_index.push(key);
//if (dev) alert(key);
}
else if (oi) {
obj_images[key] = line[1];
obj_index.push(key);
}
else if (ri) {
room_images[key] = line[1];
room_index.push(key);
}
}
}
function getMobPic(A) {
if (!mob_images) return;
A = A.toLowerCase();
for (var n in mob_index) {
var mob = mob_index[n];
if (!mob_images[mob] || !mob_images[mob].length) continue;
var l = mob_images[mob].split(',');
for (var i in l)
if (A.has(l[i])) return 'creatures/' + mob;
}
return 'hub/default.png';
}
function getObjPic(A) {
if (!obj_images) return;
A = A.toLowerCase();
for (var n in obj_index) {
var obj = obj_index[n];
if (!obj_images[obj] || !obj_images[obj].length) continue;
var l = obj_images[obj].split(',');
for (var i in l)
if (A.has(l[i])) return 'objects/obj.' + obj;
}
return 'hub/default.png';
}
function getRoomPic(A) {
if (!room_images) return;
A = A.toLowerCase();
for (var n in room_index) {
var me = room_index[n];
if (!room_images[me] || !room_images[me].length) continue;
var l = room_images[me].split(',');
for (var i in l)
if (A.has(l[i])) return 'rooms/' + me;
}
return 'rooms/room.dungeon.3.jpg';
}
function buildMobSelect() {
var html = '<select id="arg1">\n';
for (i in m.data)
html += '<option value="'+m.data[i].VNUM+'">'+m.data[i].VNUM.slice(-2)+': '+m.data[i].Name+'</option>\n';
return html + '</select>';
}
function buildObjSelect(room) {
var html = '<select class="obj-select" id="arg'+(room?'3':'1')+'">\n';
if (!room)
for (i in o.data)
html += '<option value="'+o.data[i].VNUM+'">'+o.data[i].VNUM.slice(-2)+': '+o.data[i].ShortDesc+'</option>\n';
else
for (i in z.reset)
if (z.reset[i].Command == 'O' && z.reset[i].Arg3 == room)
html += '<option value="'+z.reset[i].Arg1+'">'+z.reset[i].Arg1.slice(-2)+': '+o.data[objFind(z.reset[i].Arg1)].ShortDesc+'</option>\n';
return html + '</select>';
}
function buildMobObjSelect(vnum, inum, cls) {
var html = '<select style="width: '+(cls.has('product')?'380':'230')+'px" class="'+cls+'" inum="'+inum+'">\n';
if (vnum.slice(0, -2) != z.data[Z].VNUM)
for (i in objects)
if (objects[i].v == vnum)
html += '<option value="'+vnum+'" selected="selected">'+vnum+': ' + objects[i].d + '</option>\n';
for (i in o.data)
if (o.data[i].VNUM == vnum)
html += '<option value="'+o.data[i].VNUM+'" selected="selected">'+o.data[i].VNUM.slice(-2)+': '+o.data[i].ShortDesc+'</option>\n';
else
html += '<option value="'+o.data[i].VNUM+'">'+o.data[i].VNUM.slice(-2)+': '+o.data[i].ShortDesc+'</option>\n';
return html + '</select>';
}
function buildWeaponSelect(selected) {
var html = '<select id="weapon-type">\n';
for (var i in weapon_type)
html += '<option value="'+i+'" '+(i==selected?'selected="selected"':'')+'>'+weapon_type[i]+'</option>\n';
return html + '</select>';
}
function buildApplySelect(id, selected) {
var html = '<select class="obj-input" data="Aff'+id+'">\n';
for (var i in apply_type)
if (apply_type[i])
html += '<option value="'+i+'" '+(i==selected?'selected="selected"':'')+'>'+apply_type[i]+'</option>\n';
return html + '</select>';
}
function buildSpellSelect(id, selected) {
var html = '<select id="obj-v'+id+'" style="width: 150px">\n';
for (var i in spells)
html += '<option value="'+spells[i].NUM+'" '+(spells[i].NUM==selected?'selected="selected"':'')+'>'+spells[i].Name+'</option>\n';
return html + '</select>';
}
function buildLiquidSelect(id, selected) {
var html = '<span class="left"> <select id="obj-v3">';
for (var p in obj_liquids) {
if (selected == obj_liquids[p].a)
html += '<option value="'+obj_liquids[p].a+'" selected="selected">'+obj_liquids[p].b+'</option>';
else
html += '<option value="'+obj_liquids[p].a+'">'+obj_liquids[p].b+'</option>';
}
return html + '</select></span>';
}
function buildBuyType(inum, selected) {
var buy_types = ['','Light','Scroll','Wand','Staff','Weapon','','','Treasure','Armor','Potion','Worn','Other','Trash','','Container','Note','Drink Cont.','','Food','Money','Pen','Boat','Fountain','Trophy'];
var html = '<select id="mob-buy-type" style="width: 100px" inum="'+inum+'">';
for (var i in buy_types)
if (buy_types[i])
html += '<option value="'+i+'" '+((i==selected)?'selected="selected"':'')+'>'+buy_types[i]+'</option>\n';
return html + '</select>';
}
/* event indicators & dialogs */
function globalProgress(arg) {
hideDialog();
if (arg) {
globalProgress();
id('popup-wrapper').innerHTML = '<div id="progress"><br><br><div id="progress-msg">' + ((typeof arg == 'string' && arg)?arg:'') + '</div><br><img class="ui-corner-all" src="css/custom-theme/images/progress-bar.gif"></div>';
$('#progress').dialog({
modal: true,
width: 500,
height: 160,
dialogClass: 'alert',
resizable: false,
closeOnEscape: true
});
} else {
$('#progress').dialog('destroy');
$('#progress').remove();
contextReset();
}
}
function loginPrompt(title, error) {
globalProgress();
id('popup-wrapper').innerHTML = '<div id="login" title="' + title + '">\
<div class="hidden ui-state-error"><div class="ui-state-error-text"></div></div>\
<table style="width: 300px; text-align: left" cellspacing="10">\
<tr>\
<td><strong>Builder: </strong></td>\
<td><input id="char" type="text" size=20></td>\
</tr>\
<tr>\
<td><strong>Password: </strong></td>\
<td><input id="pass" type="password" size=20></td>\
</tr>\
<tr>\
<td colspan=2>\
<em><br><a href="mailto:bedlam@eyecandid.com?subject=Bedlam Areabuilder Access">email us</a> to apply for builder access.</em>\
</td>\
</tr>\
</table>\
</div>';
$('#login').dialog({
width: 400,
height: 270,
modal: true,
resizable: false,
closeOnEscape: false,
show: 'fade',
buttons: {
"Login": function() {
loginPerform();
}
}
});
$('.ui-dialog-titlebar-close').hide();
if (error) {
$('#login .ui-state-error').show();
$('#login .ui-state-error-text').html(error);
}
$('#login #pass').bind('keypress', function(e){
if (e.keyCode == 13) loginPerform();
});
}
function loginPerform() {
$.get('login.php?c='+$('#login #char').val()+'&p='+$('#login #pass').val(), function(data) { loginResponse(data) });
$('#login').dialog('destroy');
$('#login').remove();
globalProgress('Logging in...');
}
function loginResponse(data) {
if (data.has('Error'))
loginPrompt(data.split(': ')[0], data.split(': ')[1]);
else {
globalProgress('Building list of available areas...');
$.get('controller.php?task=getareas', function(data) { loadZones(data) });
$.get('controller.php?task=getsettings', function(data) { loadSettings(data) });
if (data.has('Publisher')) {
$('.ui-sync').show();
$('.ui-publish').show();
}
$('.ui-logout').removeClass('ui-state-disabled');
$('.ui-logout').get(0).disabled = false;
$('.ui-publish').removeClass('ui-state-disabled');
$('.ui-publish').get(0).disabled = false;
loadData('spells');
loadData('objects');
}
}
function logout() {
var c = document.cookie.split(";");
for (var i = 0; i < c.length; i++)
createCookie(c[i].split("=")[0],"",-1);
location.reload(true);
}
function showDialog(title, body, h) {
globalProgress();
document.body.innerHTML += '<div id="dialog" title="'+title+'"><p>'+body+'</p><br></div>';
$('#dialog').dialog({
width: 520,
height: (exists(h)?h:220),
buttons: {
"OK": function() {
$(this).dialog('destroy');
$('#dialog').remove();
contextReset();
}
}
});
}
function showLoadMenu() {
globalProgress();
$('#main').append('<div id="dialog" title="On-Reset Events for room "'+r.data[R].Name+'"></div>');
$('#dialog').append('\
<span class="left">\
What do you want to do? \
</span>\
<span class="left">\
<select id="command-type">\
<option value="0">select action</option>\
<option value="M">Load mobile</option>\
<option value="O">Load object</option>\
<option value="P">Put object</option>\
</select>\
</span>\
<div class="sep"></div>\
<span id="arg1-wrapper"></span>\
<span id="arg2-wrapper"></span>\
<span id="arg3-wrapper"></span>\
');
$('#dialog').dialog({
width: 500,
height: 240,
buttons: {
"Cancel": function() {
$(this).dialog('destroy');
$('#dialog').remove();
contextReset();
},
"Add": function() {
var c = $('.ui-dialog-content #command-type').val();
if (c == '0') return;
z.reset.push({
IfFlag: '0',
Command: c,
Arg1: $('.ui-dialog-content #arg1').val(),
Arg2: c == 'P'?'1':$('.ui-dialog-content #arg2').val(),
Arg3: c == 'P'?$('.ui-dialog-content #arg3').val():r.data[R].VNUM,
LNUM: z.reset.length,
ZNUM: z.data[Z].VNUM,
INUM: z.data[Z].VNUM +'.'+ z.reset.length
});
roomLoad(r.data[R].VNUM);
$(this).dialog('destroy');
$('#dialog').remove();
contextReset();
}
}
});
//$('.ui-dialog-content #command-type').selectmenu({ type: 'dropdown' });
}
function hideDialog() {
if (id('dialog')) {
$('#dialog').dialog('destroy');
$('#dialog').remove();
}
}
/* utility functions */
function id(A) { return document.getElementById(A) }
function exists(A) { return (typeof A != 'undefined') }
function center(A) { $(A).css({top:'50%',left:'50%',margin:'-'+($(A).height() / 2)+'px 0 0 -'+($(A).width() / 2)+'px'}) }
function strip_comments(A) {
A = A.split('\n');
B = [];
for (var i = 0; i < A.length; i++) {
if (A[i].indexOf('#') == 0) continue;
B.push(A[i]);
}
return B.join('\n').replace('\n\n', '\n');
}
function scanToInt(id) {
var n = '', o = 0;
$(id).multiselect("widget").find(":checkbox").each(function(){
while (o < this.value.toInt()) { n += '0'; o++ }
n += this.checked?'1':'0';
o++;
});
return parseInt(n.reverse(), 2).toString();
}
String.prototype.toFlag = function(id) {
var f = this.toRevBin();
if (f) $(id).multiselect("widget").find(":checkbox").each(function(){ if (f[this.value.toInt()] == '1') this.checked=true; else this.checked=false });
}
String.prototype.has = function(A) { return (this.indexOf(A) != -1) }
String.prototype.toInt = function() { return parseInt(this) }
String.prototype.inZone = function(Z) { return (this.toInt() >= (Z*100) && this.toInt() < ((Z+1)*100)) }
String.prototype.hasError = function() { if (this.has('Error: ') && !exists(id('dialog'))) { showDialog(this.split(': ')[0], this.split(': ')[1]); if (this.has('Session expired')) logout(); else return false }}
String.prototype.toRevBin = function () { return this.toInt().toString(2).reverse() }
String.prototype.toBin = function () { return this.toInt().toString(2) }
String.prototype.stripBreaks = function () { return this.replace(/\\n\\r/g, '\r\n') }
String.prototype.format = function () { var a = this; if (a[a.length-1] != '\n' && a[a.length-2] != '\r') a += '\r\n'; if (a[0] != ' ' && a[1] != ' ') a = ' '+a; return a }
String.prototype.splitFields = function(fields) {
var A = this.split(' ');
if (A < fields) return '';
if (A.length > fields) A[fields-1] = A.slice(fields-1).join(' ');
return A.slice(0, fields);
}
String.prototype.reverse=function(){return this.split("").reverse().join("")}
function sortHash(hash, by) {
var keys = [], sorted = [];
for (var i in hash) keys.push(hash[i][by]);
keys.sort();
for (var i in keys)
for (var n in hash)
if (hash[n][by] == keys[i])
sorted.push(hash[n]);
return sorted;
}
function round(num, dec) { var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec); return result; }
function getFreeVnum(A) { return getFree(A, 'VNUM') }
function getFree(A, B) {
if (A.length == 100) return -1;
if (!A.length) return (z.data[Z][B].toInt()*100);
var v, i;
for (i = 0; i < A.length; i++) {
v = A[i][B].toInt();
if (i == (A.length-1))
{ if ((v+1) < (z.data[Z][B].toInt()+1)*100) return (v+1); }
else
if (A[i+1][B].toInt() > (v+1)) return (v+1);
}
return -1;
}
function zeroPad(number, limit) { return (Array(limit).join('0') + number).slice(-limit) }
function getExitUp(vnum) {
for (var i = 0; i < r.exits.length; i++)
if (r.exits[i].VNUM == vnum && r.exits[i].NUM == '4') return r.exits[i].ToRoom;
return false;
}
function getExitDown(vnum) {
for (var i = 0; i < r.exits.length; i++)
if (r.exits[i].VNUM == vnum && r.exits[i].NUM == '5') return r.exits[i].ToRoom;
return false;
}
function createCookie(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/areabuilder/";
}