1 
     2 
     3 /*
     
4 
     5 TODO: runtime needs for the "location" var to mean the current location
     
6 so that the engine can always display a clickable with the location name
     
7 as a clickable title in the game display
     
8 
     9 ALSO: allow location to be set to something invalid (like NOWHERE) which
    
10 will not display the location at all
    
11 
    12 
    13 */
    
14 
    15 
    16 
    17 function rungame(tree, outputarea){
    
18 	var gamevars = [];
    
19 	var upper = false;
    
20 
    21 	// the first element in the tree will be array of the rest of the tree
    
22 	tree = tree[0];
    
23 
    24 	outputarea.empty();
    
25 	runfunc('start');
    
26 
    27 	function runfunc(funcname){
    
28 		thefunc = findfunc(funcname);
    
29 		if(!thefunc){ alert("Sorry, your sorry can't continue because there is no \""+funcname+"\" thing defined."); return; }
    
30 		// console.log("running function "+thefunc[1][1]);
    
31 		expressions(thefunc, 2);
    
32 	}
    
33 
    34 	function findfunc(funcname){
    
35 		for(s in tree){
    
36 			if(tree[s][1][1] == funcname){ 
    
37 				return tree[s];
    
38 			}
    
39 		}
    
40 		return null;
    
41 	}
    
42 
    43 	function expression(expr){
    
44 		switch(expr[0]){
    
45 			case 'assign':
    
46 				// console.log("assigning "+expr[1][1]+" to "+expr[2][1]);
    
47 			 gamevars[expr[1][1]] = expr[2][1]; 
    
48 
    49 			for(v in gamevars){
    
50 				// console.log(gamevars[v]);
    
51 			}
    
52 
    53 			 break;
    
54 			case 'print':  print(expr); break;
    
55 			case 'ifseq':  ifsequence(expr); break;
    
56 			case 'runme':  runfunc(expr[1][1]); break;
    
57 			case 'decr':   gamevars[expr[1][1]]--; break;
    
58 			case 'incr':   gamevars[expr[1][1]]++; break;
    
59 			case 'elseseq': break; // do nothing, this will run if needed
    
60 			default: alert("Sorry, '"+expr[0]+"' not (yet) supported!");
    
61 		}
    
62 	}
    
63 
    64 	function expressions(list, startpos){
    
65 		// run multiple expressions from a list, starting from startpos
    
66 		for(var e=startpos; e<list.length; e++){
    
67 			expression(list[e]);
    
68 		}
    
69 	}
    
70 
    71 	function ifsequence(tree){
    
72 		var val1 = tree[1][1];
    
73 		var test_opr = tree[2][1];
    
74 		var val2 = tree[3][1];
    
75 
    76 		// console.log("Test: "+val1+" "+test_opr+" "+val2);
    
77 
    78 		if(tree[1][0] == "name"){ val1=gamevars[val1]; }
    
79 		if(tree[3][0] == "name"){ val2=gamevars[val2]; }
    
80 
    81 		// console.log("translates to: "+val1+" "+test_opr+" "+val2);
    
82 
    83 
    84 		if( (test_opr == "equals"           && val1 == val2) ||
    
85 			(test_opr == "less than"         && val1 <  val2) ||
    
86 			(test_opr == "greater than"      && val1 >  val2) ||
    
87 			(test_opr == "doesn't equal"        && val1 != val2) ){
    
88 			// console.log("true");
    
89 			expressions(tree,4);
    
90 		}
    
91 		else{
    
92 			// console.log("false");
    
93 			// see if there's an else to run
    
94 			for(e in tree){
    
95 				if(tree[e][0] == "elseseq"){
    
96 					expressions(tree[e],1);
    
97 				}
    
98 			}
    
99 		}
   
100 	}
   
101 
   102 	function print(printables){
   
103 		for(var p = 1; p<printables.length; p++){
   
104 			type = printables[p][0]; // the type of printable item
   
105 			body = printables[p][1]; // the body of the printable
   
106 			// console.log("printing "+type+": "+body);
   
107 			switch(type){
   
108 				case 'string' : printstr(body); break;
   
109 				case 'strname'   : printname(body); break;
   
110 				case 'upname' : upper = true; printname(body); break;
   
111 				case 'link'   : printlink(body); break;
   
112 				case 'break'  : printbreak(); break;
   
113 				default: alert("Sorry, printing '"+type+"' not (yet) supported.");
   
114 			}
   
115 		}
   
116 	}
   
117 
   118 	function printname(name){
   
119 		if(name in gamevars){
   
120 			printstr(gamevars[name]);
   
121 			return;
   
122 		}
   
123 		if(findfunc(name)){
   
124 			runfunc(name);
   
125 			return;
   
126 		}
   
127 		alert("Sorry, couldn't find anything called '"+name+"' to display.");
   
128 	}
   
129 
   130 	function printstr(str){
   
131 		str = String(str);
   
132 		if(upper){
   
133 			upper = false; // we've done it, don't do it again until requested
   
134 			printstr(str.charAt(0).toUpperCase()+str.slice(1));
   
135 			return;
   
136 		}
   
137 		outputarea.append("<span>"+str+"</span>");
   
138 	}
   
139 
   140 	function printlink(funcname){
   
141 		outputarea.append($("<a href=\"#\">"+body+"</a>").click(function(){
   
142 			outputarea.empty();
   
143 			runfunc(funcname);
   
144 			return false;
   
145 		}));
   
146 	}
   
147 
   148 	function printbreak(){
   
149 		outputarea.append("<hr>");
   
150 	}
   
151 }