view gnusto-engine.min.js @ 53:0abb2dbc2dd1

Renamed trivial-zui.js to web-zui.js, since it's not really trivial anymore.
author Atul Varma <varmaa@toolness.com>
date Fri, 16 May 2008 10:07:38 -0700
parents 8d13bbad9641
children 605a0060e5a7
line wrap: on
line source


const CVS_VERSION='$Date: 2005/04/26 01:50:32 $';const ENGINE_DESCRIPTION="Gnusto's interactive fiction engine";var default_unicode_translation_table={155:0xe4,156:0xf6,157:0xfc,158:0xc4,159:0xd6,160:0xdc,161:0xdf,162:0xbb,163:0xab,164:0xeb,165:0xef,166:0xff,167:0xcb,168:0xcf,169:0xe1,170:0xe9,171:0xed,172:0xf3,173:0xfa,174:0xfd,175:0xc1,176:0xc9,177:0xcd,178:0xd3,179:0xda,180:0xdd,181:0xe0,182:0xe8,183:0xec,184:0xf2,185:0xf9,186:0xc0,187:0xc8,188:0xcc,189:0xd2,190:0xd9,191:0xe2,192:0xea,193:0xee,194:0xf4,195:0xfb,196:0xc2,197:0xca,198:0xce,199:0xd4,200:0xdb,201:0xe5,202:0xc5,203:0xf8,204:0xd8,205:0xe3,206:0xf1,207:0xf5,208:0xc3,209:0xd1,210:0xd5,211:0xe6,212:0xc6,213:0xe7,214:0xc7,215:0xfe,216:0xf0,217:0xde,218:0xd0,219:0xa3,220:0x153,221:0x152,222:0xa1,223:0xbf,};const PARENT_REC=0;const SIBLING_REC=1;const CHILD_REC=2;const CALLED_FROM_INTERRUPT=0;var GNUSTO_EFFECT_INPUT='"RS"';var GNUSTO_EFFECT_INPUT_CHAR='"RC"';var GNUSTO_EFFECT_SAVE='"DS"';var GNUSTO_EFFECT_RESTORE='"DR"';var GNUSTO_EFFECT_QUIT='"QU"';var GNUSTO_EFFECT_RESTART='"NU"';var GNUSTO_EFFECT_WIMP_OUT='"WO"';var GNUSTO_EFFECT_BREAKPOINT='"BP"';var GNUSTO_EFFECT_FLAGS_CHANGED='"XC"';var GNUSTO_EFFECT_PIRACY='"CP"';var GNUSTO_EFFECT_STYLE='"SS"';var GNUSTO_EFFECT_SOUND='"FX"';var GNUSTO_EFFECT_SPLITWINDOW='"TW"';var GNUSTO_EFFECT_SETWINDOW='"SW"';var GNUSTO_EFFECT_ERASEWINDOW='"YW"';var GNUSTO_EFFECT_ERASELINE='"YL"';var GNUSTO_EFFECT_SETCURSOR='"SC"';var GNUSTO_EFFECT_SETBUFFERMODE='"SB"';var GNUSTO_EFFECT_SETINPUTSTREAM='"SI"';var GNUSTO_EFFECT_GETCURSOR='"GC"';var GNUSTO_EFFECT_PRINTTABLE='"PT"';function handleZ_je(engine,a){if(a.length<2){return'';}else if(a.length==2){return engine._brancher(a[0]+'=='+a[1]);}else{var condition='';for(var i=1;i<a.length;i++){if(i!=1)condition=condition+'||';condition=condition+'t=='+a[i];}
return't='+a[0]+';'+engine._brancher(condition);}}
function handleZ_jl(engine,a){return engine._brancher(a[0]+'<'+a[1]);}
function handleZ_jg(engine,a){return engine._brancher(a[0]+'>'+a[1]);}
function handleZ_dec_chk(engine,a){return't='+a[0]+';t2=_varcode_get(t)-1;_varcode_set(t2,t);'+engine._brancher('t2<'+a[1]);}
function handleZ_inc_chk(engine,a){return't='+a[0]+';t2=_varcode_get(t)+1;_varcode_set(t2,t);'+engine._brancher('t2>'+a[1]);}
function handleZ_jin(engine,a){return engine._brancher("_obj_in("+a[0]+','+a[1]+')');}
function handleZ_test(engine,a){return't='+a[1]+';'+engine._brancher('('+a[0]+'&t)==t');}
function handleZ_or(engine,a){return engine._storer('('+a[0]+'|'+a[1]+')&0xffff');}
function handleZ_and(engine,a){return engine._storer(a[0]+'&'+a[1]+'&0xffff');}
function handleZ_test_attr(engine,a){return engine._brancher('_test_attr('+a[0]+','+a[1]+')');}
function handleZ_set_attr(engine,a){return'_set_attr('+a[0]+','+a[1]+')';}
function handleZ_clear_attr(engine,a){return'_clear_attr('+a[0]+','+a[1]+')';}
function handleZ_store(engine,a){return"_varcode_set("+a[1]+","+a[0]+")";}
function handleZ_insert_obj(engine,a){return"_insert_obj("+a[0]+','+a[1]+")";}
function handleZ_loadw(engine,a){return engine._storer("getWord((1*"+a[0]+"+2*"+a[1]+")&0xFFFF)");}
function handleZ_loadb(engine,a){return engine._storer("m_memory[0xFFFF&(1*"+a[0]+"+1*"+a[1]+")]");}
function handleZ_get_prop(engine,a){return engine._storer("_get_prop("+a[0]+','+a[1]+')');}
function handleZ_get_prop_addr(engine,a){return engine._storer("_get_prop_addr("+a[0]+','+a[1]+')');}
function handleZ_get_next_prop(engine,a){return engine._storer("_get_next_prop("+a[0]+','+a[1]+')');}
function handleZ_add(engine,a){return engine._storer(a[0]+'*1+'+a[1]+'*1');}
function handleZ_sub(engine,a){return engine._storer(a[0]+'-'+a[1]);}
function handleZ_mul(engine,a){return engine._storer(a[0]+'*'+a[1]);}
function handleZ_div(engine,a){return engine._storer('_trunc_divide('+a[0]+','+a[1]+')');}
function handleZ_mod(engine,a){return engine._storer(a[0]+'%'+a[1]);}
function handleZ_set_colour(engine,a){return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_STYLE+",-1,"+a[0]+','+a[1]+"];return";}
function handleZ_throw(engine,a){engine.m_compilation_running=0;return"_throw_stack_frame("+a[0]+");return";}
function handleZ_jz(engine,a){return engine._brancher(a[0]+'==0');}
function handleZ_get_sibling(engine,a){return"t=_get_sibling("+a[0]+");"+engine._storer("t")+";"+engine._brancher("t");}
function handleZ_get_child(engine,a){return"t=_get_child("+a[0]+");"+
engine._storer("t")+";"+
engine._brancher("t");}
function handleZ_get_parent(engine,a){return engine._storer("_get_parent("+a[0]+")");}
function handleZ_get_prop_len(engine,a){return engine._storer("_get_prop_len("+a[0]+')');}
function handleZ_inc(engine,a){return"t="+a[0]+';_varcode_set(_varcode_get(t)+1, t)';}
function handleZ_dec(engine,a){return"t="+a[0]+';_varcode_set(_varcode_get(t)-1, t)';}
function handleZ_print_addr(engine,a){return engine._handler_zOut('_zscii_from('+a[0]+')',0);}
function handleZ_remove_obj(engine,a){return"_remove_obj("+a[0]+','+a[1]+")";}
function handleZ_print_obj(engine,a){return engine._handler_zOut("_name_of_object("+a[0]+")",0);}
function handleZ_ret(engine,a){engine.m_compilation_running=0;return"_func_return("+a[0]+');return';}
function handleZ_jump(engine,a){engine.m_compilation_running=0;if(a[0]&0x8000){a[0]=(~0xFFFF)|a[0];}
var addr=(a[0]+engine.m_pc)-2;return"m_pc="+addr+";return";}
function handleZ_print_paddr(engine,a){return engine._handler_zOut("_zscii_from("+engine.m_pc_translate_for_string(a[0])+")",0);}
function handleZ_load(engine,a){return engine._storer('_varcode_get('+a[0]+')');}
function handleZ_rtrue(engine,a){engine.m_compilation_running=0;return"_func_return(1);return";}
function handleZ_rfalse(engine,a){engine.m_compilation_running=0;return"_func_return(0);return";}
function handleZ_print(engine,a){return engine._handler_print('',0);}
function handleZ_print_ret(engine,a){engine.m_compilation_running=0;return engine._handler_print('\n',1)+';_func_return(1);return';}
function handleZ_nop(engine,a){return"";}
function handleZ_restart(engine,a){engine.m_compilation_running=0;return"m_effects=["+GNUSTO_EFFECT_RESTART+"];return";}
function handleZ_ret_popped(engine,a){engine.m_compilation_running=0;return"_func_return(m_gamestack.pop());return";}
function handleZ_catch(engine,a){return engine._storer("call_stack.length");}
function handleZ_pop(engine,a){return"m_gamestack.pop()";}
function handleZ_quit(engine,a){engine.m_compilation_running=0;return"m_effects=["+GNUSTO_EFFECT_QUIT+"];return";}
function handleZ_new_line(engine,a){return engine._handler_zOut("'\\n'",0);}
function handleZ_show_status(engine,a){engine._handler_zOut('');return"";}
function handleZ_verify(engine,a){return engine._brancher('_verify()');}
function handleZ_illegal_extended(engine,a){gnusto_error(199);}
function handleZ_piracy(engine,a){engine.m_compilation_running=0;var setter='m_rebound=function(){'+engine._brancher('(!m_answers[0])')+'};';return"m_pc="+engine.m_pc+";"+setter+"m_effects=["+GNUSTO_EFFECT_PIRACY+"];return";}
function handleZ_call_1n(engine,a){return engine._generate_gosub(a[0],'',0);}
function handleZ_call_1s(engine,a){return engine._generate_gosub(a[0],'',1);}
function handleZ_call_2n(engine,a){return engine._generate_gosub(a[0],a[1],0);}
function handleZ_call_2s(engine,a){return engine._generate_gosub(a[0],a[1],1);}
function handleZ_call_vn(engine,a){return engine._generate_gosub(a[0],a.slice(1),0);}
function handleZ_call_vs(engine,a){return engine._generate_gosub(a[0],a.slice(1),1);}
function handleZ_store_w(engine,a){return"setWord("+a[2]+",1*"+a[0]+"+2*"+a[1]+")";}
function handleZ_storeb(engine,a){return"setByte("+a[2]+",1*"+a[0]+"+1*"+a[1]+")";}
function handleZ_putprop(engine,a){return"_put_prop("+a[0]+','+a[1]+','+a[2]+')';}
function handleZ_read(engine,a){var timeout_deciseconds;var address_of_timeout_routine;engine.m_compilation_running=0;var rebound_for_no_timeout="_aread(m_answers[0],m_rebound_args[1],"+"m_rebound_args[2],m_answers[1])";var recaps_getter;var char_count_getter;if(engine.m_version>=5){rebound_for_no_timeout=engine._storer(rebound_for_no_timeout);}
if(engine.m_version>=5){recaps_getter="m_memory[0xFFFF&a0+1]";char_count_getter="m_memory[0xFFFF&a0]";}else{recaps_getter='0';char_count_getter="m_memory[0xFFFF&a0]+1";}
if(a[2]&&a[3]&&(engine.m_version>=4)){timeout_deciseconds=a[2];address_of_timeout_routine=engine.m_pc_translate_for_routine(a[3]);}else{timeout_deciseconds='0';address_of_timeout_routine='0';}
var rebound_setter="m_rebound=function(){"+"var t=1*m_answers[0];"+"if(t<0){"+"_func_interrupt(m_rebound_args[0],onISRReturn_for_read);"+"}else{"+
rebound_for_no_timeout+";"+"}"+"};";var rebound_args_setter="m_rebound_args=["+
address_of_timeout_routine+","+"a0,"+
a[1]+","+"];";return"var a0=eval("+a[0]+");"+"m_pc="+engine.m_pc+";"+
rebound_args_setter+
rebound_setter+"m_effects=["+
GNUSTO_EFFECT_INPUT+","+
timeout_deciseconds+","+
recaps_getter+","+
char_count_getter+","+"_terminating_characters()];return";}
function handleZ_print_char(engine,a){return engine._handler_zOut('_zscii_char_to_ascii('+a[0]+')',0);}
function handleZ_print_num(engine,a){return engine._handler_zOut(a[0],0);}
function handleZ_random(engine,a){return engine._storer("_random_number("+a[0]+")");}
function handleZ_push(engine,a){return'm_gamestack.push('+a[0]+')';}
function handleZ_pull(engine,a){return'_varcode_set(m_gamestack.pop(),'+a[0]+')';}
function handleZ_split_window(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_SPLITWINDOW+","+a[0]+"];return";}
function handleZ_set_window(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_SETWINDOW+","+a[0]+"];return";}
function handleZ_erase_window(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_ERASEWINDOW+","+a[0]+"];return";}
function handleZ_erase_line(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_ERASELINE+","+a[0]+"];return";}
function handleZ_set_cursor(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_SETCURSOR+","+a[0]+","+a[1]+"];return";}
function handleZ_get_cursor(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_GETCURSOR+","+a[0]+"];return";}
function handleZ_set_text_style(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_STYLE+","+a[0]+",0,0];return";}
function handleZ_buffer_mode(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_SETBUFFERMODE+","+a[0]+"];return";}
function handleZ_output_stream(engine,a){return'_set_output_stream('+a[0]+','+a[1]+')';}
function handleZ_input_stream(engine,a){engine.m_compilation_running=0;return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_SETINPUTSTREAM+","+a[0]+"];return";}
function handleZ_sound_effect(engine,a){engine.m_compilation_running=0;while(a.length<5){a.push(0);}
return"m_pc="+engine.m_pc+';m_effects=['+GNUSTO_EFFECT_SOUND+','+a[0]+','+a[1]+','+a[2]+','+a[3]+','+a[4]+'];return';}
function handleZ_read_char(engine,a){var timeout_deciseconds;var rebound_args_setter;var rebound_setter;engine.m_compilation_running=0;if(a[1]&&a[2]&&(engine.m_version>=4)){timeout_deciseconds=a[1];rebound_args_setter="m_rebound_args=["+
engine.m_pc_translate_for_routine(a[2])+'];';rebound_setter="m_rebound=function(){"+"var t=1*m_answers[0];"+"if(t<0){"+"_func_interrupt(m_rebound_args[0],onISRReturn_for_read_char);"+"}else{"+
engine._storer("t")+"}"+"};";}else{timeout_deciseconds='0';rebound_args_setter='';rebound_setter="m_rebound=function(){"+
engine._storer("1*m_answers[0]")+"};";}
return"m_pc="+engine.m_pc+";"+
rebound_args_setter+
rebound_setter+"m_effects=["+GNUSTO_EFFECT_INPUT_CHAR+","+timeout_deciseconds+"];return";}
function handleZ_scan_table(engine,a){if(a.length==4){return"t=_scan_table("+a[0]+','+a[1]+"&0xFFFF,"+a[2]+"&0xFFFF,"+a[3]+");"+
engine._storer("t")+";"+engine._brancher('t');}else{return"t=_scan_table("+a[0]+','+a[1]+"&0xFFFF,"+a[2]+"&0xFFFF,"+0x82+");"+
engine._storer("t")+";"+engine._brancher('t');}}
function handleZ_not(engine,a){return engine._storer('~'+a[1]+'&0xffff');}
function handleZ_tokenise(engine,a){return"_tokenise(("+a[0]+")&0xFFFF,("+a[1]+")&0xFFFF,"+a[2]+","+a[3]+")";}
function handleZ_encode_text(engine,a){return"_encode_text("+a[0]+","+a[1]+","+a[2]+","+a[3]+")";}
function handleZ_copy_table(engine,a){return"_copy_table("+a[0]+','+a[1]+','+a[2]+")";}
function handleZ_print_table(engine,a){if(a.length<3){a.push(1);}
if(a.length<4){a.push(0);}
return"m_pc="+engine.m_pc+";m_effects=_print_table("+a[0]+","+a[1]+","+a[2]+","+a[3]+");return";}
function handleZ_check_arg_count(engine,a){return engine._brancher(a[0]+'<=_param_count()');}
function handleZ_saveV123(engine,a){engine.m_compilation_running=0;var setter='m_rebound=function(){'+
engine._brancher('m_answers[0]')+'};';return"m_state_to_save=_saveable_state(1);m_pc="+engine.m_pc+";"+setter+";m_effects=["+GNUSTO_EFFECT_SAVE+"];return";}
function handleZ_saveV45678(engine,a){engine.m_compilation_running=0;var setter="m_rebound=function() { "+
engine._storer('m_answers[0]')+"};";return"m_state_to_save=_saveable_state("+
(engine.m_version==4?'1':'3')+");m_pc="+engine.m_pc+";"+
setter+";m_effects=["+GNUSTO_EFFECT_SAVE+"];return";}
function handleZ_restoreV123(engine,a){engine.m_compilation_running=0;engine._brancher('');return"m_pc="+engine.m_pc+";m_effects=["+GNUSTO_EFFECT_RESTORE+"];return";}
function handleZ_restoreV45678(engine,a){engine.m_compilation_running=0;var setter='m_rebound=function() { '+'var t=m_answers[0]; if (t==0){'+
engine._storer('t')+'}};';return"m_pc="+engine.m_pc+";"+setter+"m_effects=["+GNUSTO_EFFECT_RESTORE+"];return";}
function handleZ_log_shift(engine,a){return engine._storer("_log_shift("+a[0]+','+a[1]+')');}
function handleZ_art_shift(engine,a){return engine._storer("_art_shift("+a[0]+','+a[1]+')');}
function handleZ_set_font(engine,a){return engine._storer('('+a[0]+'<2?1:0)');}
function handleZ_save_undo(engine,a){return engine._storer('_save_undo(3)');}
function handleZ_restore_undo(engine,a){return'if(_restore_undo(3))return;'+engine._storer('0');}
function handleZ_print_unicode(engine,a){return engine._handler_zOut("String.fromCharCode("+a[0]+")",0);}
function handleZ_check_unicode(engine,a){return engine._storer('3');}
const handlers_v578={1:handleZ_je,2:handleZ_jl,3:handleZ_jg,4:handleZ_dec_chk,5:handleZ_inc_chk,6:handleZ_jin,7:handleZ_test,8:handleZ_or,9:handleZ_and,10:handleZ_test_attr,11:handleZ_set_attr,12:handleZ_clear_attr,13:handleZ_store,14:handleZ_insert_obj,15:handleZ_loadw,16:handleZ_loadb,17:handleZ_get_prop,18:handleZ_get_prop_addr,19:handleZ_get_next_prop,20:handleZ_add,21:handleZ_sub,22:handleZ_mul,23:handleZ_div,24:handleZ_mod,25:handleZ_call_2s,26:handleZ_call_2n,27:handleZ_set_colour,28:handleZ_throw,128:handleZ_jz,129:handleZ_get_sibling,130:handleZ_get_child,131:handleZ_get_parent,132:handleZ_get_prop_len,133:handleZ_inc,134:handleZ_dec,135:handleZ_print_addr,136:handleZ_call_1s,137:handleZ_remove_obj,138:handleZ_print_obj,139:handleZ_ret,140:handleZ_jump,141:handleZ_print_paddr,142:handleZ_load,143:handleZ_call_1n,176:handleZ_rtrue,177:handleZ_rfalse,178:handleZ_print,179:handleZ_print_ret,180:handleZ_nop,183:handleZ_restart,184:handleZ_ret_popped,185:handleZ_catch,186:handleZ_quit,187:handleZ_new_line,189:handleZ_verify,190:handleZ_illegal_extended,191:handleZ_piracy,224:handleZ_call_vs,225:handleZ_store_w,226:handleZ_storeb,227:handleZ_putprop,228:handleZ_read,229:handleZ_print_char,230:handleZ_print_num,231:handleZ_random,232:handleZ_push,233:handleZ_pull,234:handleZ_split_window,235:handleZ_set_window,236:handleZ_call_vs,237:handleZ_erase_window,238:handleZ_erase_line,239:handleZ_set_cursor,240:handleZ_get_cursor,241:handleZ_set_text_style,242:handleZ_buffer_mode,243:handleZ_output_stream,244:handleZ_input_stream,245:handleZ_sound_effect,246:handleZ_read_char,247:handleZ_scan_table,248:handleZ_not,249:handleZ_call_vn,250:handleZ_call_vn,251:handleZ_tokenise,252:handleZ_encode_text,253:handleZ_copy_table,254:handleZ_print_table,255:handleZ_check_arg_count,1000:handleZ_saveV45678,1001:handleZ_restoreV45678,1002:handleZ_log_shift,1003:handleZ_art_shift,1004:handleZ_set_font,1009:handleZ_save_undo,1010:handleZ_restore_undo,1011:handleZ_print_unicode,1012:handleZ_check_unicode,};const handlers_fixups={1:{25:0,26:0,27:0,28:0,136:0,143:handleZ_not,181:handleZ_saveV123,182:handleZ_restoreV123,185:handleZ_pop,188:handleZ_show_status,190:0,191:0,236:0,237:0,238:0,239:0,240:0,241:0,242:0,246:0,247:0,248:0,249:0,250:0,251:0,252:0,253:0,254:0,255:0,},2:{25:0,26:0,27:0,28:0,136:0,143:handleZ_not,181:handleZ_saveV123,182:handleZ_restoreV123,185:handleZ_pop,188:handleZ_show_status,190:0,191:0,236:0,237:0,238:0,239:0,240:0,241:0,242:0,246:0,247:0,248:0,249:0,250:0,251:0,252:0,253:0,254:0,255:0,},3:{25:0,26:0,27:0,28:0,136:0,143:handleZ_not,181:handleZ_saveV123,182:handleZ_restoreV123,185:handleZ_pop,188:handleZ_show_status,190:0,191:0,236:0,237:0,238:0,239:0,240:0,241:0,242:0,246:0,247:0,248:0,249:0,250:0,251:0,252:0,253:0,254:0,255:0,},4:{26:0,27:0,28:0,143:handleZ_not,181:handleZ_saveV45678,182:handleZ_restoreV45678,185:handleZ_pop,190:0,191:0,248:0,249:0,250:0,251:0,252:0,253:0,254:0,255:0,},5:'',6:undefined,7:'',8:'',};function pc_translate_v123(p){return'(('+p+')&0xFFFF)*2';}
function pc_translate_v45(p){return'(('+p+')&0xFFFF)*4';}
function pc_translate_v67R(p){return'(('+p+')&0xFFFF)*4+'+this.m_routine_start;}
function pc_translate_v67S(p){return'(('+p+')&0xFFFF)*4+'+this.m_string_start;}
function pc_translate_v8(p){return'(('+p+')&0xFFFF)*8';}
function gnusto_error(number){message='Component: engine\n';for(var i=1;i<arguments.length;i++){if(arguments[i]&&arguments[i].toString){message+='\nDetail: '+arguments[i].toString();}}
var procs=arguments.callee;var procstring='';var loop_count=0;var loop_max=100;while(procs!=null&&loop_count<loop_max){var name=procs.toString();if(name==null){procstring=' (anon)'+procstring;}else{var r=name.match(/function (\w*)/);if(r==null){procstring=' (weird)'+procstring;}else{procstring=' '+r[1]+procstring;}}
procs=procs.caller;loop_count++;}
if(loop_count==loop_max){procstring='...'+procstring;}
message+='\n\nJS call stack:'+procstring;console.log("Error "+number+": "+message);console.log('-- Temporary burin error: ');console.log(number);console.log(' ');console.log(message);console.log('\n');throw'Error '+number+': '+message;}
function onISRReturn_for_read_char(interrupt_info,result){if(result){interrupt_info.engine.m_answers[0]=0;interrupt_info.rebound();}else{interrupt_info.engine.m_effects=interrupt_info.effects;interrupt_info.engine.m_rebound=interrupt_info.rebound;interrupt_info.engine.m_rebound_args=interrupt_info.rebound_args;}}
function onISRReturn_for_read(interrupt_info,result){var engine=interrupt_info.engine;if(result){engine.m_answers[0]=0;engine.m_answers[1]='';interrupt_info.rebound();}else{engine.m_effects=interrupt_info.effects;engine.m_rebound=interrupt_info.rebound;engine.m_rebound_args=interrupt_info.rebound_args;}}
function GnustoEngine(){}
GnustoEngine.prototype={loadStory:function ge_loadStory(sourceFile){this.m_memory=sourceFile;this._initial_setup();},loadSavedGame:function ge_loadSavedGame(memLen,mem,mem_is_compressed,stacksLen,stacks,pc)
{function decodeStackInt(offset,length){var result=stacks[offset++];for(var i=1;i<length;i++){result=(result<<8)|stacks[offset++];}
return result;}
if(mem_is_compressed){var temp=[];var cursor_compressed=0;var cursor_original=0;while(cursor_compressed<mem.length){if(cursor_original>=this.m_original_memory.length){gnusto_error(999,"overshoot in decompression");}
var candidate=mem[cursor_compressed++];if(candidate==0){var run_length=mem[cursor_compressed++]+1;temp=temp.concat(this.m_original_memory.slice(cursor_original,cursor_original+run_length));cursor_original+=run_length;}else{temp.push(candidate^this.m_original_memory[cursor_original++]);}}
mem=temp;}
this.m_call_stack=[];this.m_gamestack=[];this.m_locals_stack=[];this.m_locals=[];this.m_result_targets=[];var evals_count=0;evals_count=decodeStackInt(7,1);this.m_gamestack_callbreaks=[];var callbreaks_top=evals_count;var cursor=8;for(var m=0;m<evals_count;m++){this.m_gamestack.push(decodeStackInt(cursor,2));cursor+=2;}
while(cursor<stacksLen){this.m_call_stack.push(decodeStackInt(cursor,3));cursor+=3;var flags=stacks[cursor++];var varcode=stacks[cursor++];if(flags&0x10){varcode=-1;}
var locals_count=flags&0xF;this.m_locals_stack.unshift(locals_count);this.m_result_targets.push(varcode);var logArgs=stacks[cursor++]+1;var argCount=0;while(logArgs>1){logArgs>>=1;argCount++;}
this.m_param_counts.unshift(argCount);evals_count=decodeStackInt(cursor,2);cursor+=2;callbreaks_top+=evals_count;this.m_gamestack_callbreaks.push(callbreaks_top);var locals_temp=[];for(var k=0;k<locals_count;k++){locals_temp.push(decodeStackInt(cursor,2));cursor+=2;}
this.m_locals=locals_temp.concat(this.m_locals);for(var m=0;m<evals_count;m++){this.m_gamestack.push(decodeStackInt(cursor,2));cursor+=2;}}
for(var n=0;n<16;n++){this.m_locals.push(0);}
this.m_memory=mem.concat(this.m_memory.slice(mem.length));if(this.m_version<=3){this.m_pc=pc;eval("var t=new Function('with(this){'+_brancher('1')+'}');t.call(this);",this);}else{this._varcode_set(2,this.m_memory[pc]);this.m_pc=pc+1;}},resetStory:function ge_resetStory(){this.m_memory=this.m_original_memory.slice();this._initial_setup();},get version(){gnusto_error(101,"'version' not implemented");},get signature(){gnusto_error(101,"'signature' not implemented");},get cvsVersion(){return CVS_VERSION.substring(7,26);},setGoldenTrail:function ge_setGoldenTrail(value){if(value){this.m_goldenTrail=1;}else{this.m_goldenTrail=0;}},setCopperTrail:function ge_setCopperTrail(value){if(value){this.m_copperTrail=1;}else{this.m_copperTrail=0;}},effect:function ge_effect(which){return this.m_effects[which];},answer:function ge_answer(which,what){this.m_answers[which]=what;},run:function ge_run(){var start_pc=0;var turns=0;var jscode;var turns_limit=this.m_single_step?1:10000;if(this.m_rebound){this.m_rebound();this.m_rebound=0;this.m_rebound_args=[];}
this.m_effects=[];while(this.m_effects.length==0){if(turns++>=turns_limit){this.m_effects=['WO'];return 1;}
start_pc=this.m_pc;if(this.m_jit[start_pc]){jscode=this.m_jit[start_pc];}else{jscode=eval('dummy='+this._compile(),this);if(start_pc>=this.m_stat_start){this.m_jit[start_pc]=jscode;}}
if(this.m_copperTrail){burin('pc : '+start_pc.toString(16));burin('jit : '+jscode);}
jscode();}},walk:function ge_walk(answer){gnusto_error(101,"'walk' not implemented");},setRandomSeed:function ge_setRandomSeed(seed){if(seed>0){this._random_number(-seed);}else{this._random_number(seed);}},saveGame:function ge_saveGame(){function int_to_bytes(number,bytecount){var result=[];result.length=bytecount;for(var i=0;i<bytecount;i++){result[(bytecount-i)-1]=number&0xFF;number>>=8;}
return result;}
var state=this.m_state_to_save;var tag_FORM=[0x46,0x4f,0x52,0x4d];var tag_CMem=[0x43,0x4d,0x65,0x6d];var tag_UMem=[0x55,0x4d,0x65,0x6d];var tag_Stks=[0x53,0x74,0x6b,0x73];var content=[0x49,0x46,0x5a,0x53,0x49,0x46,0x68,0x64,0x00,0x00,0x00,0x0d,state.m_memory[0x02],state.m_memory[0x03],state.m_memory[0x12],state.m_memory[0x13],state.m_memory[0x14],state.m_memory[0x15],state.m_memory[0x16],state.m_memory[0x17],state.m_memory[0x1C],state.m_memory[0x1D],(state.m_pc>>16)&0xFF,(state.m_pc>>8)&0xFF,(state.m_pc)&0xFF,0];if(this.m_compress_save_files){var compressed=[];var same_count=0;for(var i=0;i<this.m_stat_start;i++){if(state.m_memory[i]==this.m_original_memory[i]){same_count++;if(same_count==256){compressed.push(0);compressed.push(255);same_count=0;}}else{if(same_count!=0){compressed.push(0);compressed.push(same_count-1);same_count=0;}
compressed.push(state.m_memory[i]^this.m_original_memory[i]);}}
if(same_count!=0){compressed.push(0);compressed.push(same_count-1);}
content=content.concat(tag_CMem);content=content.concat(int_to_bytes(compressed.length,4));content=content.concat(compressed);if((compressed.length%2)!=0){content.push(0);}}else{content=content.concat(tag_UMem);content=content.concat(int_to_bytes(this.m_stat_start,4));content=content.concat(this.m_memory.slice(0,this.m_stat_start));if((this.m_stat_start%2)!=0){content.push(0);}}
var stacks=[0x00,0x00,0x00,0x00,0x00,0x00];stacks=stacks.concat(int_to_bytes(this.m_gamestack_callbreaks[0],2));var locals_cursor=this.m_locals.length-16;var gamestack_cursor=0;for(var m=0;m<this.m_gamestack_callbreaks[0];m++){stacks=stacks.concat(int_to_bytes(this.m_gamestack[gamestack_cursor++],2));}
for(var j=0;j<this.m_call_stack.length;j++){stacks=stacks.concat(int_to_bytes(this.m_call_stack[j],3));var local_count=this.m_locals_stack[this.m_locals_stack.length-(j+1)];var flags=local_count;var target=this.m_result_targets[j];var args_supplied=this.m_param_counts[this.m_param_counts.length-(j+1)];var eval_taken=this.m_gamestack_callbreaks[j]-gamestack_cursor;if(target==-1){target=0;flags|=0x10;}
stacks=stacks.concat([flags,target,(1<<args_supplied)-1,(eval_taken>>8)&0xFF,(eval_taken)&0xFF]);locals_cursor-=local_count;for(var k=0;k<local_count;k++){stacks=stacks.concat(int_to_bytes(this.m_locals[locals_cursor+k],2));}
for(var m=0;m<eval_taken;m++){stacks=stacks.concat(int_to_bytes(this.m_gamestack[gamestack_cursor++],2));}}
content=content.concat(tag_Stks);content=content.concat(int_to_bytes(stacks.length,4));content=content.concat(stacks);var quetzal=tag_FORM;quetzal=quetzal.concat(int_to_bytes(content.length,4));quetzal=quetzal.concat(content);this.m_quetzal_image=quetzal;return this.m_quetzal_image.length;},saveGameData:function ge_saveGameData(len,result){var temp=this.m_quetzal_image;this.m_quetzal_image=0;return temp;},get architecture(){return'none';},get piracy(){return-1;},get tandy(){return-1;},get status(){return'this is the status, hurrah!';},getStatusLine:function ge_getStatusLine(width){var current_room_object_number=this.getUnsignedWord(this.m_vars_start);var object_properties_address=this.getUnsignedWord(this.m_property_list_addr_start+(this.m_object_size*current_room_object_number));var outtext=this._zscii_from(object_properties_address+1);if(outtext.length>width){outtext=outtext.substring(0,width-3);var outtext2='...';var spacebuffer='';}else{if((this.m_version>3)&&((this.getByte(1)&0x02)==2)){var hours=this.getUnsignedWord(this.m_vars_start+2);var minutes=this.getUnsignedWord(this.m_vars_start+4);if(minutes<10){var outtext2=hours+':0'+minutes;}else{var outtext2=hours+':'+minutes;}}else{var outtext2='Score: '+this.getUnsignedWord(this.m_vars_start+2)+'  Moves: '+this.getUnsignedWord(this.m_vars_start+4);}
if((outtext.length+outtext2.length+1)>width){outtext2=' S:'+this.getUnsignedWord(this.m_vars_start+2)+' M:'+this.getUnsignedWord(this.m_vars_start+4);if((outtext.length+outtext2.length+1)>width){outtext2=' '+this.getUnsignedWord(this.m_vars_start+2)+'/'+this.getUnsignedWord(this.m_vars_start+4);}
if((outtext.length+outtext2.length+1)>width){outtext2='';}}
var spacebuffer='';while((outtext.length+outtext2.length+spacebuffer.length)<width){spacebuffer+=' ';}}
return outtext+spacebuffer+outtext2;},_initial_setup:function ge_initial_setup(){this.m_jit=[];this.m_compilation_running=0;this.m_gamestack=[];this.m_gamestack_callbreaks=[];this.m_call_stack=[];this.m_locals=[];this.m_locals_stack=[];this.m_param_counts=[];this.m_result_targets=[];this.m_goldenTrail=0;this.m_copperTrail=0;this.m_version=this.m_memory[0];this.m_himem=this.getUnsignedWord(0x4);this.m_pc=this.getUnsignedWord(0x6);this.m_dict_start=this.getUnsignedWord(0x8);this.m_objs_start=this.getUnsignedWord(0xA);this.m_vars_start=this.getUnsignedWord(0xC);this.m_stat_start=this.getUnsignedWord(0xE);this.m_abbr_start=this.getUnsignedWord(0x18);if(this.m_version>=4){this.m_alpha_start=this.getUnsignedWord(0x34);this.m_object_tree_start=this.m_objs_start+112;this.m_property_list_addr_start=this.m_object_tree_start+12;this.m_object_size=14;}else{this.m_alpha_start=0;this.m_object_tree_start=this.m_objs_start+53;this.m_property_list_addr_start=this.m_object_tree_start+7;this.m_object_size=9;}
this.m_hext_start=this.getUnsignedWord(0x36);this.m_original_memory=this.m_memory.slice();if(this.m_version<=3){this.m_pc_translate_for_routine=pc_translate_v123;this.m_pc_translate_for_string=pc_translate_v123;}else if(this.m_version<=5){this.m_pc_translate_for_routine=pc_translate_v45;this.m_pc_translate_for_string=pc_translate_v45;}else if(this.m_version<=7){this.m_routine_start=this.getUnsignedWord(0x28)*8;this.m_string_start=this.getUnsignedWord(0x2a)*8;this.m_pc_translate_for_routine=pc_translate_v67R;this.m_pc_translate_for_string=pc_translate_v67S;}else if(this.m_version==8){this.m_pc_translate_for_routine=pc_translate_v8;this.m_pc_translate_for_string=pc_translate_v8;}else{gnusto_error(170,'impossible: unknown z-version got this far');}
if(!(this.m_version in handlers_fixups)){gnusto_error(311,'unknown z-machine version');}
var fixups=handlers_fixups[this.m_version];switch(typeof(fixups)){case'undefined':gnusto_error(101,'z-machine version not implemented');break;case'string':this.m_handlers=handlers_v578;break;case'object':this.m_handlers={};for(var original in handlers_v578){this.m_handlers[original]=handlers_v578[original];}
for(var changed in fixups){if((typeof fixups[changed])=='function'){this.m_handlers[changed]=fixups[changed];}else{delete this.m_handlers[changed];}}
break;default:gnusto_error(170,'impossible: weird stuff in fixups table');}
this.m_separator_count=this.m_memory[this.m_dict_start];for(var i=0;i<this.m_separator_count;i++){this.m_separators[i]=this._zscii_char_to_ascii(this.m_memory[this.m_dict_start+i+1]);}
if(this.m_hext_start>0){this.m_unicode_start=this.getUnsignedWord(this.m_hext_start+6);if(this.m_unicode_start>0){this.m_custom_unicode_charcount=this.m_memory[this.m_unicode_start];this.m_unicode_start+=1;}}
this.m_rebound=0;this.m_rebound_args=[];this.m_output_to_console=1;this.m_streamthrees=[];this.m_output_to_script=0;this.m_console_buffer='';this.m_transcript_buffer='';this.m_zalphabet[0]='abcdefghijklmnopqrstuvwxyz';this.m_zalphabet[1]='ABCDEFGHIJKLMNOPQRSTUVWXYZ';if(this.m_version==1){this.m_zalphabet[2]='T0123456789.,!?_#\'"/\\<-:()';}else{this.m_zalphabet[2]='T\n0123456789.,!?_#\'"/\\-:()';}
var newchar;var newcharcode;if(this.m_alpha_start>0){for(var alpharow=0;alpharow<3;alpharow++){var alphaholder='';for(var alphacol=0;alphacol<26;alphacol++){newcharcode=this.m_memory[this.m_alpha_start+(alpharow*26)+alphacol];if((newcharcode>=155)&&(newcharcode<=251)){if(this.m_unicode_start==0){alphaholder+=String.fromCharCode(default_unicode_translation_table[newcharcode]);}else{if((newcharcode-154)<=this.m_custom_unicode_charcount)
alphaholder+=String.fromCharCode(this.getUnsignedWord(this.m_unicode_start+((newcharcode-155)*2)));else
alphaholder+=' ';}}else{newchar=String.fromCharCode(newcharcode);if(newchar=='^')newchar='\n';alphaholder+=newchar;}}
this.m_zalphabet[alpharow]=alphaholder;}}
for(var i=0;i<16;i++)this.m_locals[i]=0;this.m_printing_header_bits=0;this.m_leftovers='';},getByte:function ge_getbyte(address){if(address<0){address&=0xFFFF;}
return this.m_memory[address];},setByte:function ge_setByte(value,address){if(address<0){address&=0xFFFF;}
this.m_memory[address]=value;},getWord:function ge_getWord(address){if(address<0){address&=0xFFFF;}
return this._unsigned2signed((this.m_memory[address]<<8)|this.m_memory[address+1]);},_unsigned2signed:function ge_unsigned2signed(value){return((value&0x8000)?~0xFFFF:0)|value;},_signed2unsigned:function ge_signed2unsigned(value){return value&0xFFFF;},getUnsignedWord:function ge_getUnsignedWord(address){if(address<0){address&=0xFFFF;}
return(this.m_memory[address]<<8)|this.m_memory[address+1];},setWord:function ge_setWord(value,address){if(address<0){address&=0xFFFF;}
this.setByte((value>>8)&0xFF,address);this.setByte((value)&0xFF,address+1);},_handle_variable_parameters:function ge_handle_var_parameters(args,types,bytecount){var argcursor=0;if(bytecount==1){types=(types<<8)|0xFF;}
while(1){var current=types&0xC000;if(current==0xC000){return;}else if(current==0x0000){args[argcursor++]=this.getWord(this.m_pc);this.m_pc+=2;}else if(current==0x4000){args[argcursor++]=this.m_memory[this.m_pc++];}else if(current==0x8000){args[argcursor++]=this._code_for_varcode(this.m_memory[this.m_pc++]);}else{gnusto_error(171);}
types=(types<<2)|0x3;}},_compile:function ge_compile(){this.m_compilation_running=1;code='';var starting_pc=this.m_pc;do{var args=[];this_instr_pc=this.m_pc;code=code+'_touch('+this.m_pc+');';var instr=this.m_memory[this.m_pc++];if(instr==0){gnusto_error(201);}else if(instr==190){instr=1000+this.m_memory[this.m_pc++];this._handle_variable_parameters(args,this.m_memory[this.m_pc++],1);}else if(instr&0x80){if(instr&0x40){if(!(instr&0x20))
instr&=0x1F;if(instr==250||instr==236){var types=this.getUnsignedWord(this.m_pc);this.m_pc+=2;this._handle_variable_parameters(args,types,2);}else
this._handle_variable_parameters(args,this.m_memory[this.m_pc++],1);}else{switch(instr&0x30){case 0x00:args[0]=this.getWord(this.m_pc);this.m_pc+=2;instr=(instr&0x0F)|0x80;break;case 0x10:args[0]=this.m_memory[this.m_pc++];instr=(instr&0x0F)|0x80;break;case 0x20:args[0]=this._code_for_varcode(this.m_memory[this.m_pc++]);instr=(instr&0x0F)|0x80;break;case 0x30:instr=(instr&0x0F)|0xB0;break;}}}else{if(instr&0x40)
args[0]=this._code_for_varcode(this.m_memory[this.m_pc++]);else
args[0]=this.m_memory[this.m_pc++];if(instr&0x20)
args[1]=this._code_for_varcode(this.m_memory[this.m_pc++]);else
args[1]=this.m_memory[this.m_pc++];instr&=0x1F;}
if(this.m_handlers[instr]){code=code+this.m_handlers[instr](this,args)+';';}else if(instr>=1128&&instr<=1255&&"special_instruction_EXT"+(instr-1000)in this){code=code+
this["special_instruction_EXT"+(instr-1000)](args)+';';}else{gnusto_error(200,this.m_pc.toString(16));}}while(this.m_compilation_running);if(this.m_single_step||this.m_debug_mode){code=code+'m_pc='+this.m_pc;}
return'function J'+starting_pc.toString(16)+'(){'+code+'}';},_param_count:function ge_param_count(){return this.m_param_counts[0];},_set_output_stream:function ge_set_output_stream(target,address){if(target==0){}else if(target==1){this.m_output_to_console=1;}else if(target==2){this.m_memory[0x10]|=0x1;}else if(target==3){if(this.m_streamthrees.length>15){gnusto_error(202);}
this.m_streamthrees.unshift([address,address+2]);}else if(target==4){this.m_output_to_script=1;}else if(target==-1){this.m_output_to_console=0;}else if(target==-2){this.m_memory[0x10]&=~0x1;}else if(target==-3){if(this.m_streamthrees.length<1){gnusto_error(203);}
var latest=this.m_streamthrees.shift();this.setWord((latest[1]-latest[0])-2,latest[0]);}else if(target==-4){this.m_output_to_script=0;}else{gnusto_error(204,target);}},_trunc_divide:function ge_trunc_divide(over,under){var result;if(under==0){gnusto_error(701);return 0;}
result=over/under;if(result>0){return Math.floor(result);}else{return Math.ceil(result);}},_zscii_char_to_ascii:function ge_zscii_char_to_ascii(zscii_code){if(zscii_code<0||zscii_code>1023){gnusto_error(702,zscii_code);}
var result;if(zscii_code==13||zscii_code==10){result=10;}else if((zscii_code>=32&&zscii_code<=126)||zscii_code==0){result=zscii_code;}else if(zscii_code>=155&&zscii_code<=251){if(this.m_unicode_start==0)
return String.fromCharCode(default_unicode_translation_table[zscii_code]);else{if((zscii_code-154)<=this.m_custom_unicode_charcount)
return String.fromCharCode(this.getUnsignedWord(this.m_unicode_start+((zscii_code-155)*2)));else
gnusto_error(703,zscii_code);}}else{return"*";}
return String.fromCharCode(result);},_random_number:function ge_random_number(arg){if(arg==0){this.m_random_use_seed=this.m_random_use_sequence=0;return 0;}else if(arg<-999){this.m_random_state=Math.abs(arg);this.m_random_use_seed=1;this.m_random_use_sequence=0;return 0;}else if(arg<0){this.m_random_sequence_max=Math.abs(arg)-1;this.m_random_state=0;this.m_random_use_seed=0;this.m_random_use_sequence=1;return 0;}else{if(this.m_random_use_seed){this.m_random_state--;return 1+(Math.round(Math.abs(Math.tan(this.m_random_state))*8.71*arg)%arg);}else if(this.m_random_use_sequence){var previous=this.m_random_state;this.m_random_state=this.m_random_state+1;if(this.m_random_state>this.m_random_sequence_max){this.m_random_state=0;}
return 1+(previous%arg);}else{return 1+Math.round((arg-1)*Math.random());}}
gnusto_error(170,'random');},_func_gosub:function ge_gosub(to_address,actuals,from_address,result_target){this.m_call_stack.push(from_address);this.m_pc=to_address;var count=this.m_memory[this.m_pc++];if(this.m_version<5){var templocals=[];for(var i3=0;i3<count;i3++){if(i3<actuals.length){templocals.push(actuals[i3]);}else{templocals.push(this.getWord(this.m_pc));}
this.m_pc+=2;}
this.m_locals=templocals.concat(this.m_locals);}else{for(var i5=count;i5>0;i5--){if(i5<=actuals.length){this.m_locals.unshift(actuals[i5-1]);}else{this.m_locals.unshift(0);}}}
this.m_locals_stack.unshift(count);this.m_param_counts.unshift(actuals.length);this.m_result_targets.push(result_target);this.m_gamestack_callbreaks.push(this.m_gamestack.length);if(to_address==0){this._func_return(0);}},_func_interrupt:function ge_interrupt(to_address,on_return){this.m_interrupt_information.push({'on_return':on_return,'rebound':this.m_rebound,'rebound_args':this.m_rebound_args,'engine':this,'pc':this.m_pc,'effects':this.m_effects,});this._func_gosub(to_address,[],CALLED_FROM_INTERRUPT,-1);},_tokenise:function ge_tokenise(text_buffer,parse_buffer,dictionary,overwrite){var tokenised_word_count=0;var cursor=parse_buffer+2;var words_count_addr=parse_buffer+1;if(isNaN(dictionary))dictionary=0;if(isNaN(overwrite))overwrite=0;function look_up(engine,word,dict_addr){function compare(engine,typed,mem_addr){var j=0;var mem_char,typed_char;while(1){if(j==typed.length){return 0;}
mem_char=engine.m_memory[mem_addr+j];typed_char=typed.charCodeAt(j);if(mem_char==typed_char){j++;}else if(mem_char<typed_char){return-1;}else{return 1;}}}
var entry_length=engine.m_memory[dict_addr+engine.m_separator_count+1];var entries_count=engine.getWord(dict_addr+engine.m_separator_count+2);var entries_start=engine.m_dict_start+engine.m_separator_count+4;var is_sorted=1;if(entries_count<0){is_sorted=0;entries_count=-entries_count;}
var oldword=word;word=engine._into_zscii(word);if(is_sorted){var low=0,high=entries_count-1;var median;var median_address;var comparison;while(1){median=low+Math.round((high-low)/2);median_address=entries_start+median*entry_length;comparison=compare(engine,word,median_address);if(comparison<0){if(low==high){return 0;}
low=median+1;}else if(comparison>0){if(low==high){return 0;}
high=median-1;}else{return median_address;}
if(low>high){return 0;}}}else{for(var i=0;i<entries_count;i++){var address=entries_start+i*entry_length;if(compare(engine,word,address)==0){return address;}}}
return 0;}
function add_to_parse_table(engine,dictionary,curword,wordpos){var lexical=look_up(engine,curword,dictionary);if(!(overwrite&&lexical==0)){engine.setWord(lexical,cursor);cursor+=2;engine.setByte(curword.length,cursor++);engine.setByte(wordpos,cursor++);}else{cursor+=4;}
tokenised_word_count++;return 1;}
var max_chars=this.m_memory[text_buffer];var source='';if(dictionary==0){dictionary=this.m_dict_start;}
if(this.m_version<=4){max_chars++;var copycursor=text_buffer+1;while(1){var ch=this.m_memory[copycursor++];if(ch==0)break;source+=String.fromCharCode(ch);}}else{for(var i=0;i<this.m_memory[text_buffer+1];i++){source+=String.fromCharCode(this.m_memory[text_buffer+2+i]);}}
var words=[];var curword='';var wordindex=0;var wordpos_increment;if(this.m_version<=4){wordpos_increment=1;}else{wordpos_increment=2;}
for(var cpos=0;cpos<source.length;cpos++){if(source[cpos]==' '){if(curword!=''){words[wordindex]=curword;add_to_parse_table(this,dictionary,words[wordindex],(cpos-words[wordindex].length)+wordpos_increment);wordindex++;curword='';}}else{if(this._is_separator(source[cpos])){if(curword!=''){words[wordindex]=curword;add_to_parse_table(this,dictionary,words[wordindex],(cpos-words[wordindex].length)+wordpos_increment);wordindex++;}
words[wordindex]=source[cpos];add_to_parse_table(this,dictionary,words[wordindex],cpos+wordpos_increment);wordindex++;curword='';}else{curword+=source[cpos];}}}
if(curword!=''){words[wordindex]=curword;add_to_parse_table(this,dictionary,words[wordindex],(cpos-words[wordindex].length)+wordpos_increment);}
this.setByte(tokenised_word_count,words_count_addr);},_aread:function ge_aread(terminating_keypress,text_buffer,parse_buffer,entered){text_buffer&=0xFFFF;parse_buffer&=0xFFFF;var max_chars;var result;if(!entered){entered=' ';}
if(this.m_version<=4){max_chars=this.m_memory[text_buffer]+1;result=entered.substring(0,max_chars).toLowerCase();for(var i=0;i<result.length;i++){this.setByte(result.charCodeAt(i),text_buffer+1+i);}
this.setByte(0,text_buffer+1+result.length);}else{max_chars=this.m_memory[text_buffer];result=entered.substring(0,max_chars);this.setByte(result.length,text_buffer+1);for(var i=0;i<result.length;i++){this.setByte(result.charCodeAt(i),text_buffer+2+i);}}
if(parse_buffer!=0||this.m_version<5){this._tokenise(text_buffer,parse_buffer,0,0);}
if(terminating_keypress==13){return 10;}else{return terminating_keypress;}},_terminating_characters:function ge_terminating_characters(){if(this.m_version<5){return'\r';}else{var terms_address=this.getWord(0x2e);var result='\r';while(1){var ch=this.m_memory[terms_address++];if(ch==0){break;}else if((ch>=129&&ch<=154)||(ch>=252)){result+=String.fromCharCode(ch);}}
return result;}},_func_return:function ge_func_return(value){for(var i=this.m_locals_stack.shift();i>0;i--){this.m_locals.shift();}
this.m_param_counts.shift();this.m_pc=this.m_call_stack.pop();this.m_gamestack.length=this.m_gamestack_callbreaks.pop();var target=this.m_result_targets.pop();if(target!=-1&&value!=null){this._varcode_set(value,target);}
if(this.m_pc==CALLED_FROM_INTERRUPT){var interrupt_info=this.m_interrupt_information.pop();this.m_pc=interrupt_info.pc;interrupt_info.on_return(interrupt_info,value);}},_throw_stack_frame:function throw_stack_frame(cookie){if(cookie>this.m_call_stack.length||cookie<1){gnusto_error(207,cookie);}
while(this.m_call_stack.length>cookie-1){this._func_return(null);}},_get_prop_addr:function ge_get_prop_addr(object,property){if(object==0){return 0;}
var result=this._property_search(object,property,-1);if(result[2]){return result[0];}else{return 0;}},_get_prop_len:function ge_get_prop_len(address){address&=0xFFFF;if(this.m_version<4){return 1+(this.m_memory[address-1]>>5);}else{var value=this.m_memory[address-1];if(value&0x80){value=value&0x3F;if(value==0){return 64;}else{return value;}}else{if(value&0x40){return 2;}else{return 1;}}}
gnusto_error(170,'get_prop_len');},_get_next_prop:function ge_get_next_prop(object,property){if(object==0)return 0;var result=this._property_search(object,-1,property);if(result[2]){return result[3];}else{if(result[4]){return 0;}else{gnusto_error(205,property);}}
gnusto_error(173);},_get_prop:function ge_get_prop(object,property){if(object==0)return 0;var temp=this._property_search(object,property,-1);if(temp[1]==2){return this.getWord(temp[0]);}else if(temp[1]==1){return this.m_memory[temp[0]];}else{return this.getWord(temp[0]);}
gnusto_error(174);},_property_search:function ge_property_search(object,property,previous_property){var props_address=this.getUnsignedWord(this.m_property_list_addr_start+
object*this.m_object_size);props_address=props_address+this.m_memory[props_address]*2+1;var previous_prop=0;while(1){var len=1;var prop=this.m_memory[props_address++];if(this.m_version<4){len=(prop>>5)+1;prop=prop&0x1F;}else{if(prop&0x80){len=this.m_memory[props_address++]&0x3F;if(len==0)len=64;}else{if(prop&0x40)len=2;}
prop=prop&0x3F;}
if(prop==property||previous_prop==previous_property){return[props_address,len,1,prop,0];}else if(prop<property){if(property>0)
return[this.m_objs_start+(property-1)*2,2,0,property,0];else
return[-1,-1,0,property,previous_prop==property];}
props_address+=len;previous_prop=prop;}
gnusto_error(175);},_set_attr:function ge_set_attr(object,bit){if(object==0)return;var address=this.m_object_tree_start+object*this.m_object_size+(bit>>3);var value=this.m_memory[address];this.setByte(value|(128>>(bit%8)),address);},_clear_attr:function ge_clear_attr(object,bit){if(object==0)return;var address=this.m_object_tree_start+object*this.m_object_size+(bit>>3);var value=this.m_memory[address];this.setByte(value&~(128>>(bit%8)),address);},_test_attr:function ge_test_attr(object,bit){if(object==0)return 0;if((this.m_memory[this.m_object_tree_start+object*this.m_object_size+(bit>>3)]&(128>>(bit%8)))){return 1;}else{return 0;}},_put_prop:function put_prop(object,property,value){if(object==0)return;var address=this._property_search(object,property,-1);if(!address[2]){gnusto_error(704);}
if(address[1]==1){this.setByte(value&0xff,address[0]);}else if(address[1]==2){this.setWord(value&0xffff,address[0]);}else{gnusto_error(705);}},_get_older_sibling:function ge_get_older_sibling(object){if(object==0){return 0;}
var candidate=this._get_child(this._get_parent(object));if(object==candidate){return 0;}
while(candidate){next_along=this._get_sibling(candidate);if(next_along==object){return candidate;}
candidate=next_along;}
return 0;},_insert_obj:function ge_insert_obj(mover,new_parent){var old_parent=this._get_parent(mover);var older_sibling=this._get_older_sibling(mover);var younger_sibling=this._get_sibling(mover);if(old_parent&&this._get_child(old_parent)==mover){this._set_child(old_parent,younger_sibling);}
if(older_sibling){this._set_sibling(older_sibling,younger_sibling);}
this._set_parent(mover,new_parent);if(new_parent){this._set_sibling(mover,this._get_child(new_parent));this._set_child(new_parent,mover);}},_remove_obj:function ge_remove_obj(mover,new_parent){this._insert_obj(mover,0);},_get_family:function ge_get_family(from,relationship){if(from==0){return 0;}
if(this.m_version<4){return this.m_memory[this.m_object_tree_start+
4+relationship+
from*this.m_object_size];}else{return this.getUnsignedWord(this.m_object_tree_start+
6+relationship*2+
from*this.m_object_size);}
gnusto_error(170,'get_family');},_get_parent:function ge_get_parent(from)
{return this._get_family(from,PARENT_REC);},_get_child:function ge_get_child(from)
{return this._get_family(from,CHILD_REC);},_get_sibling:function ge_get_sibling(from)
{return this._get_family(from,SIBLING_REC);},_set_family:function ge_set_family(from,to,relationship){if(this.m_version<4){this.setByte(to,this.m_object_tree_start+
4+relationship+
from*this.m_object_size);}else{this.setWord(to,this.m_object_tree_start+
6+relationship*2+
from*this.m_object_size);}},_set_parent:function ge_set_parent(from,to)
{this._set_family(from,to,PARENT_REC);},_set_child:function ge_set_child(from,to)
{this._set_family(from,to,CHILD_REC);},_set_sibling:function ge_set_sibling(from,to)
{this._set_family(from,to,SIBLING_REC);},_obj_in:function ge_obj_in(child,parent)
{return this._get_parent(child)==parent;},_copy_table:function ge_copy_table(first,second,size){if(second==0){for(var i=0;i<size;i++){this.setByte(0,i+first);}}else{var copy_forwards=0;if(size<0){size=-size;copy_forwards=1;}else{if(first>second){copy_forwards=1;}else{copy_forwards=0;}}
if(copy_forwards){for(var i=0;i<size;i++){this.setByte(this.m_memory[first+i],second+i);}}else{for(var i=size-1;i>=0;i--){this.setByte(this.m_memory[first+i],second+i);}}}},_scan_table:function ge_scan_table(target_word,target_table,table_length,table_form)
{var jumpby=table_form&0x7F;var usewords=((table_form&0x80)==0x80);var lastlocation=target_table+(table_length*jumpby);if(usewords){while(target_table<lastlocation){if(((this.m_memory[0xFFFF&target_table]&0xFF)==((target_word>>8)&0xFF))&&((this.m_memory[0xFFFF&target_table+1]&0xFF)==(target_word&0xFF))){return target_table;}
target_table+=jumpby;}}else{while(target_table<lastlocation){if((this.m_memory[0xFFFF&target_table]&0xFF)==(target_word&0xFFFF)){return target_table;}
target_table+=jumpby;}}
return 0;},_print_table:function ge_print_table(address,width,height,skip){var lines=[];for(var y=0;y<height;y++){var s='';for(var x=0;x<width;x++){if(address<0){address&=0xFFFF;}
s=s+this._zscii_char_to_ascii(this.m_memory[address++]);}
lines.push(s);address+=skip;}
var result=['PT',lines.length];result=result.concat(lines);return result;},_zscii_from:function ge_zscii_from(address,max_length,tell_length){if(address in this.m_jit){if(tell_length)
return this.m_jit[address];else
return this.m_jit[address][0];}
var temp='';var running=1;var start_address=address;var home_alph=0;var alph=home_alph;var tenbit=-2;var abbreviation=0;if(!max_length)max_length=65535;var stopping_place=address+max_length;while(running){var word=this.getUnsignedWord(address);address+=2;running=((word&0x8000)==0)&&address<stopping_place;for(var j=2;j>=0;j--){var code=((word>>(j*5))&0x1f);if(abbreviation){temp=temp+this._zscii_from(this.getUnsignedWord((32*(abbreviation-1)+code)*2+this.m_abbr_start)*2);abbreviation=0;alph=home_alph;}else if(tenbit==-2){if(code>5){if(alph==2&&code==6)
tenbit=-1;else{temp=temp+this.m_zalphabet[alph][code-6];alph=home_alph;}}else{if(code==0){temp=temp+' ';alph=home_alph;}
else if(code<4){if(this.getByte(0)>2){abbreviation=code;}
else{if(code==2){alph+=1;if(alph>2){alph=0;}}else if(code==3){alph-=1;if(alph<0){alph=2;}}
else{if(this.getByte(0)==2){abbreviation=1;}
else{temp=temp+'\n';alph=home_alph;}}}}
else{if(this.getByte(0)>2){alph=code-3;}
else{if(code==4){home_alph+=1;if(home_alph>2){home_alph=0;}}else{home_alph-=1;if(home_alph<0){home_alph=2;}}
alph=home_alph;}}}}else if(tenbit==-1){tenbit=code;}else{temp=temp+this._zscii_char_to_ascii((tenbit<<5)+code);tenbit=-2;alph=home_alph;}}}
if(start_address>=this.m_stat_start){this.m_jit[start_address]=[temp,address];}
if(tell_length){return[temp,address];}else{return temp;}},_encode_text:function ge_encode_text(zscii_text,length,from,coded_text){zscii_text=(zscii_text+from)&0xFFFF;var source='';while(length>0){var b=this.m_memory[zscii_text];if(b==0)break;source=source+this._zscii_char_to_ascii(b);zscii_text++;length--;}
var result=this._into_zscii(source);for(var i=0;i<result.length;i++){var c=result[i].charCodeAt(0);this.setByte(c,coded_text++);}},_into_zscii:function ge_into_zscii(str){var result='';var buffer=[];var dictionary_entry_length;if(this.m_version<4){dictionary_entry_length=4;}else{dictionary_entry_length=6;}
function emit(value){buffer.push(value);if(buffer.length==3){var temp=(buffer[0]<<10|buffer[1]<<5|buffer[2]);if(result.length==dictionary_entry_length-2){temp|=0x8000;}
result=result+
String.fromCharCode(temp>>8)+
String.fromCharCode(temp&0xFF);buffer=[];}}
var cursor=0;while(cursor<str.length&&result.length<6){var ch=str.charCodeAt(cursor++);if(ch>=65&&ch<=90){emit(ch-59);}else if(ch>=97&&ch<=122){emit(ch-91);}else{var z2=this.m_zalphabet[2].indexOf(String.fromCharCode(ch));if(z2!=-1){if(this.getByte(0)>2){emit(5);}else{emit(3);}
emit(z2+6);}else{if(this.getByte(0)>2){emit(5);}else{emit(3);}
emit(6);emit(ch>>5);emit(ch&0x1F);}}}
while(result.length<dictionary_entry_length){emit(5);}
return result.substring(0,dictionary_entry_length);},_name_of_object:function ge_name_of_object(object){if(object==0){return"<void>";}else{var aa=this.m_property_list_addr_start+object*this.m_object_size;return this._zscii_from(this.getUnsignedWord(aa)+1);}},_print_leftovers:function ge_print_leftovers(){this._zOut(this.m_leftovers);this.m_leftovers='';},_zOut:function ge_zOut(text){if(this.m_streamthrees.length){var current=this.m_streamthrees[0];var address=this.m_streamthrees[0][1];for(var i=0;i<text.length;i++){this.setByte(text.charCodeAt(i),address++);}
this.m_streamthrees[0][1]=address;}else{var bits=this.m_memory[0x10]&0x03;var changed=bits!=this.m_printing_header_bits;effect_parameters=this.m_printing_header_bits;this.m_printing_header_bits=bits;if(changed){this.m_leftovers=text;this.m_rebound=this._print_leftovers;return 1;}else{if(this.m_output_to_console){this.m_console_buffer=this.m_console_buffer+text;}
if(bits&1){this.m_transcript_buffer=this.m_transcript_buffer+text;}}}
return 0;},consoleText:function ge_console_text(){var temp=this.m_console_buffer.replace('\x00','','g');this.m_console_buffer='';return temp;},_transcript_text:function ge_transcript_text(){var temp=this.m_transcript_buffer.replace('\x00','','g');this.m_transcript_buffer='';return temp;},_is_separator:function ge_IsSeparator(value){for(var sepindex=0;sepindex<this.m_separator_count;sepindex++){if(value==this.m_separators[sepindex])return 1;}
return 0;},_code_for_varcode:function ge_code_for_varcode(varcode){if(varcode==0){return'm_gamestack.pop()';}else if(varcode<0x10){return'm_locals['+(varcode-1)+']';}else{return'getWord('+(this.m_vars_start+(varcode-16)*2)+')';}
gnusto_error(170,'code_for_varcode');},_varcode_get:function ge_varcode_get(varcode){if(varcode==0){return this.m_gamestack.pop();}else if(varcode<0x10){return this.m_locals[(varcode-1)];}else{return this.getWord(this.m_vars_start+(varcode-16)*2);}
gnusto_error(170,'varcode_get');},_varcode_set:function ge_varcode_set(value,varcode){if(varcode==0){this.m_gamestack.push(value);}else if(varcode<0x10){this.m_locals[varcode-1]=value;}else{this.setWord(value,this.m_vars_start+(varcode-16)*2);}},_brancher:function ge_brancher(condition){var inverted=1;var temp=this.m_memory[this.m_pc++];var target_address=temp&0x3F;if(temp&0x80){inverted=0;}
if(!(temp&0x40)){target_address=(target_address<<8)|this.m_memory[this.m_pc++];if(target_address&0x2000){target_address=(~0x1FFF)|(target_address&0x1FFF);}}
var if_statement=condition;if(inverted){if_statement='if(!('+if_statement+'))';}else{if_statement='if('+if_statement+')';}
if(target_address==0){return if_statement+'{_func_return(0);return;}';}
if(target_address==1){return if_statement+'{_func_return(1);return;}';}
target_address=(this.m_pc+target_address)-2;return if_statement+'{m_pc='+(target_address)+';return;}';},_storer:function ge_storer(rvalue){var lvalue_varcode=this.m_memory[this.m_pc++];if(rvalue.substring&&rvalue.substring(0,11)=='_func_gosub'){this.m_compilation_running=0;if(rvalue.substring(rvalue.length-4)!=',-1)'){gnusto_error(100,rvalue);}
return rvalue.substring(0,rvalue.length-3)+
lvalue_varcode+')';}else if(lvalue_varcode==0){return'm_gamestack.push('+rvalue+')';}else if(lvalue_varcode<0x10){return'm_locals['+(lvalue_varcode-1)+']='+rvalue;}else{return'setWord('+rvalue+','+(this.m_vars_start+(lvalue_varcode-16)*2)+')';}
gnusto_error(170,'storer');},_generate_gosub:function call_vn(target,arguments,get_varcode){this.m_compilation_running=0;var varcode=-1;if(get_varcode){varcode=this.m_memory[this.m_pc++];}
return'_func_gosub('+
this.m_pc_translate_for_routine(target)+','+'['+arguments.toString()+'],'+
this.m_pc+','+
varcode+')';},_handler_zOut:function ge_handler_zOut(text,is_return){var setter;if(is_return){setter='_func_return(1)';}else{setter='m_pc=0x'+this.m_pc.toString(16);}
return'if(_zOut('+text+')){'+setter+';m_effects=['+GNUSTO_EFFECT_FLAGS_CHANGED+'];return 1}';},_handler_print:function ge_handler_print(suffix,is_return){var zf=this._zscii_from(this.m_pc,65535,1);var message=zf[0];if(suffix)message=message+suffix;message=message.replace('\\','\\\\','g').replace('"','\\"','g').replace('\n','\\n','g');this.m_pc=zf[1];return this._handler_zOut('"'+message+'"',is_return);},_log_shift:function ge_log_shift(value,shiftbits){if(shiftbits<0){return(value>>>(-1*shiftbits))&0x7FFF;}else{return(value<<shiftbits)&0x7FFF;}},_art_shift:function ge_art_shift(value,shiftbits){if(shiftbits<0){return(value>>(-1*shiftbits))&0x7FFF;}else{return(value<<shiftbits)&0x7FFF;}},_touch:function ge_touch(address){if(this.m_goldenTrail){burin("pc : "+address.toString(16));}
this.m_pc=address;},_save_undo:function ge_save_undo(varcode_offset){this.m_undo=this._saveable_state(varcode_offset);return 1;},_restore_undo:function ge_restore_undo(){if(typeof this.m_undo!='object'){return 0;}
this.m_call_stack=this.m_undo.m_call_stack;this.m_locals=this.m_undo.m_locals;this.m_locals_stack=this.m_undo.m_locals_stack;this.m_param_counts=this.m_undo.m_param_counts;this.m_result_targets=this.m_undo.m_result_targets;this.m_gamestack=this.m_undo.m_gamestack;var mem=this.m_undo.m_memory;this.m_memory=mem.concat(this.m_memory.slice(mem.length));this._varcode_set(2,this.m_memory[this.m_undo.m_pc]);this.m_pc=this.m_undo.m_pc+1;this.undo=0;return 1;},_saveable_state:function ge_saveable_state(varcode_offset){var result={'m_memory':this.m_memory.slice(0,this.m_stat_start),'m_pc':this.m_pc+varcode_offset,'m_call_stack':this.m_call_stack,'m_locals':this.m_locals,'m_locals_stack':this.m_locals_stack,'m_param_counts':this.m_param_counts,'m_result_targets':this.m_result_targets,'m_gamestack':this.m_gamestack,};return result;},_verify:function ge_verify(){var total=0;var checksum=(this.m_original_memory[0x1c]<<8|this.m_original_memory[0x1d]);for(var i=0x40;i<this.m_original_memory.length;i++){total+=this.m_original_memory[i];}
return(total&0xFFFF)==checksum;},m_local_game_file:0,m_memory:[],m_handlers:0,m_jit:[],m_goldenTrail:0,m_copperTrail:0,m_compilation_running:0,m_gamestack:0,m_gamestack_callbreaks:[],m_himem:0,m_pc:0,m_this_instr_pc:0,m_dict_start:0,m_objs_start:0,m_vars_start:0,m_stat_start:0,m_abbr_start:0,m_hext_start:0,m_alpha_start:0,m_zalphabet:[],m_string_start:0,m_routine_start:0,m_unicode_start:0,m_custom_unicode_charcount:0,m_separator_count:0,m_separators:[],m_version:0,m_call_stack:0,m_locals:[],m_locals_stack:0,m_param_counts:0,m_result_targets:[],m_rebound:0,m_rebound_args:[],m_output_to_console:0,m_streamthrees:[],m_output_to_script:0,m_single_step:0,m_debug_mode:0,m_parser_debugging:0,m_breakpoints:{},m_console_buffer:'',m_transcript_buffer:'',m_effects:[],m_answers:[],m_random_state:0,m_random_use_seed:0,m_random_use_sequence:0,m_random_sequence_max:0,m_printing_header_bits:0,m_leftovers:'',m_pc_translate_for_routine:pc_translate_v45,m_pc_translate_for_string:pc_translate_v45,m_undo:0,m_state_to_save:0,m_quetzal_image:0,m_original_memory:[],m_compress_save_files:1,m_object_tree_start:0,m_property_list_addr_start:0,m_object_size:14,m_interrupt_information:[],};