1package { 2 import bigroom.input.KeyPoll; 3 import flash.display.*; 4 import flash.geom.*; 5 import flash.events.*; 6 import flash.net.*; 7 8 public class entityclass extends Sprite { 9 static public var BLOCK:Number = 0; 10 static public var TRIGGER:Number = 1; 11 static public var DAMAGE:Number = 2; 12 static public var DIRECTIONAL:Number = 3; 13 static public var SAFE:Number = 4; 14 static public var ACTIVITY:Number = 5; 15 16 public var opt_useblock:Boolean; 17 public var opt_usetrigger:Boolean; 18 public var opt_usedamage:Boolean; 19 public var opt_usedirectional:Boolean; 20 public var opt_usesafe:Boolean; 21 public var opt_useactivity:Boolean; 22 23 public function init():void { 24 nentity = 0; 25 nblocks = 0; 26 temprect = new Rectangle(); 27 temprect2 = new Rectangle(); 28 colpoint1 = new Point; colpoint2 = new Point; 29 30 skipdirblocks = false; 31 customplatformtile=0; 32 platformtile = 0; vertplatforms = false; horplatforms = false; 33 34 nearelephant = false; 35 upsetmode = false; upset = 0; 36 37 trophytext = 0 ; trophytype = 0; 38 altstates = 0; 39 40 for (var i:int = 0; i < 6; i++) { 41 customcrewmoods.push(1); 42 } 43 44 for (i = 0; i < 100; i++) { 45 var t:int = 0; flags.push(t); 46 } 47 48 for (i = 0; i < 500; i++) { 49 var block:blockclass = new blockclass; 50 blocks.push(block); 51 } 52 53 for (var z:Number = 0; z < 200; z++) { 54 var entity:entclass = new entclass; 55 entities.push(entity); 56 } 57 58 for (i = 0; i < 20; i++) { 59 var lcross:entclass = new entclass; 60 linecrosskludge.push(lcross); 61 collect.push(new int); 62 customcollect.push(new int(0)); 63 } 64 nlinecrosskludge = 0; 65 } 66 67 public function resetallflags():void { 68 for (var i:Number = 0; i < 100; i++) { 69 flags[i] = 0; 70 } 71 } 72 73 public function resetflags():void { 74 for (var i:Number = 0; i < 100; i++) { 75 if (flags[i] == 2) flags[i] = 0; 76 } 77 } 78 79 public function confirmflags():void { 80 for (var i:Number = 0; i < 100; i++) { 81 if (flags[i] == 2) flags[i] = 1; 82 } 83 } 84 85 public function changecollect(t:int, s:int):void { 86 collect[t] = s; 87 } 88 89 public function changecustomcollect(t:int, s:int):void { 90 customcollect[t] = s; 91 } 92 93 public function changeflag(t:int, s:int):void { 94 flags[t] = s; 95 } 96 97 public function fatal_top():void { createblock(DAMAGE, -8, -8, 384, 16); } 98 public function fatal_bottom():void { createblock(DAMAGE, -8, 224, 384, 16); } 99 public function fatal_left():void { createblock(DAMAGE, -8, -8, 16, 260); } 100 public function fatal_right():void { createblock(DAMAGE, 312, -8, 16, 260); } 101 102 public function setblockcolour(t:int, col:String):void { 103 if (col == "cyan") { blocks[t].r = 164; blocks[t].g = 164; blocks[t].b = 255; 104 }else if (col == "red") { blocks[t].r = 255; blocks[t].g = 60; blocks[t].b = 60; 105 }else if (col == "green") { blocks[t].r = 144; blocks[t].g = 255; blocks[t].b = 144; 106 }else if (col == "yellow") { blocks[t].r = 255; blocks[t].g = 255; blocks[t].b = 134; 107 }else if (col == "blue") { blocks[t].r = 95; blocks[t].g = 95; blocks[t].b = 255; 108 }else if (col == "purple") { blocks[t].r = 255; blocks[t].g = 134; blocks[t].b = 255; 109 }else if (col == "white") { blocks[t].r = 244; blocks[t].g = 244; blocks[t].b = 244; 110 }else if (col == "gray") { blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174; 111 }else if (col == "orange") { blocks[t].r = 255; blocks[t].g = 130; blocks[t].b = 20; 112 }else { 113 //use a gray 114 blocks[t].r = 174; blocks[t].g = 174; blocks[t].b = 174; 115 } 116 } 117 118 public function swncolour(t:int):int { 119 //given colour t, return colour in setcol 120 if (t == 0) return 11; 121 if (t == 1) return 6; 122 if (t == 2) return 8; 123 if (t == 3) return 12; 124 if (t == 4) return 9; 125 if (t == 5) return 7; 126 return 0; 127 } 128 129 public function swnenemiescol(t:int):void { 130 //change the colour of all SWN enemies to the current one 131 for (i = 0; i < nentity; i++) { 132 if (entities[i].active) { 133 if (entities[i].type == 23) { 134 entities[i].colour = swncolour(t); 135 } 136 } 137 } 138 } 139 140 public function gravcreate(game:gameclass, ypos:int, dir:int, xoff:int = 0, yoff:int = 0):void { 141 if (dir == 0) { 142 createentity(game, -150 - xoff, 58 + (ypos * 20)+yoff, 23, 0, 0); 143 }else{ 144 createentity(game, 320+150 + xoff, 58 + (ypos * 20)+yoff, 23, 1, 0); 145 } 146 } 147 148 public function generateswnwave(game:gameclass, help:helpclass, t:int):void { 149 //generate a wave for the SWN game 150 if(game.swndelay<=0){ 151 if (t == 0) { //game 0, survive for 30 seconds 152 switch(game.swnstate) { 153 case 0: 154 //Decide on a wave here 155 //default case 156 game.swnstate = 1; game.swndelay = 5; 157 158 if (game.swntimer <= 150) { //less than 5 seconds 159 game.swnstate = 9; game.swndelay = 8; 160 }else if (game.swntimer <= 300) { //less than 10 seconds 161 game.swnstate = 6; game.swndelay = 12; 162 }else if (game.swntimer <= 360) { //less than 12 seconds 163 game.swnstate = 5+game.swnstate2; game.swndelay = 15; 164 }else if (game.swntimer <= 420) { //less than 14 seconds 165 game.swnstate = 7+game.swnstate2; game.swndelay = 15; 166 }else if (game.swntimer <= 480) { //less than 16 seconds 167 game.swnstate = 5+game.swnstate2; game.swndelay = 15; 168 }else if (game.swntimer <= 540) { //less than 18 seconds 169 game.swnstate = 7+game.swnstate2; game.swndelay = 15; 170 }else if (game.swntimer <= 600) { //less than 20 seconds 171 game.swnstate = 5+game.swnstate2; game.swndelay = 15; 172 }else if (game.swntimer <= 900) { //less than 30 seconds 173 game.swnstate = 4; game.swndelay = 20; 174 }else if (game.swntimer <= 1050) { //less than 35 seconds 175 game.swnstate = 3; game.swndelay = 10; 176 }else if (game.swntimer <= 1200) { //less than 40 seconds 177 game.swnstate = 3; game.swndelay = 20; 178 }else if (game.swntimer <= 1500) { //less than 50 seconds 179 game.swnstate = 2; game.swndelay = 10; 180 }else if (game.swntimer <= 1650) { //less than 55 seconds 181 game.swnstate = 1; game.swndelay = 15; 182 }else if (game.swntimer <= 1800) { //less than 60 seconds 183 game.swnstate = 1; game.swndelay = 25; 184 } 185 186 if (game.deathcounts - game.swndeaths > 7) game.swndelay += 2; 187 if (game.deathcounts - game.swndeaths > 15) game.swndelay += 2; 188 if (game.deathcounts - game.swndeaths > 25) game.swndelay += 4; 189 break; 190 case 1: 191 createentity(game, -150, 58 + (int(Math.random() * 6) * 20), 23, 0, 0); 192 game.swnstate = 0; game.swndelay = 0; //return to decision state 193 break; 194 case 2: 195 if(game.swnstate3==0){ 196 game.swnstate2++; 197 if (game.swnstate2 >= 6) { 198 game.swnstate3 = 1; 199 game.swnstate2--; 200 } 201 }else { 202 game.swnstate2--; 203 if (game.swnstate2 < 0) { 204 game.swnstate3 = 0; 205 game.swnstate2++; 206 } 207 } 208 createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0); 209 game.swnstate = 0; game.swndelay = 0; //return to decision state 210 break; 211 case 3: 212 createentity(game, 320+150, 58 + (int(Math.random() * 6) * 20), 23, 1, 0); 213 game.swnstate = 0; game.swndelay = 0; //return to decision state 214 break; 215 case 4: 216 //left and right compliments 217 game.swnstate2 = int(Math.random() * 6); 218 createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); 219 createentity(game, 320+150, 58 + ((5-game.swnstate2) * 20), 23, 1, 0); 220 game.swnstate = 0; game.swndelay = 0; //return to decision state 221 game.swnstate2 = 0; 222 break; 223 case 5: 224 //Top and bottom 225 createentity(game, -150, 58, 23, 0, 0); 226 createentity(game, -150, 58 + (5 * 20), 23, 0, 0); 227 game.swnstate = 0; game.swndelay = 0; //return to decision state 228 game.swnstate2 = 1; 229 break; 230 case 6: 231 //Middle 232 createentity(game, -150, 58 + (2 * 20), 23, 0, 0); 233 createentity(game, -150, 58 + (3 * 20), 23, 0, 0); 234 game.swnstate = 0; game.swndelay = 0; //return to decision state 235 game.swnstate2 = 0; 236 break; 237 case 7: 238 //Top and bottom 239 createentity(game, 320+150, 58, 23, 1, 0); 240 createentity(game, 320+150, 58 + (5 * 20), 23, 1, 0); 241 game.swnstate = 0; game.swndelay = 0; //return to decision state 242 game.swnstate2 = 1; 243 break; 244 case 8: 245 //Middle 246 createentity(game, 320+150, 58 + (2 * 20), 23, 1, 0); 247 createentity(game, 320+150, 58 + (3 * 20), 23, 1, 0); 248 game.swnstate = 0; game.swndelay = 0; //return to decision state 249 game.swnstate2 = 0; 250 break; 251 case 9: 252 if(game.swnstate3==0){ 253 game.swnstate2++; 254 if (game.swnstate2 >= 6) { 255 game.swnstate3 = 1; 256 game.swnstate2--; 257 } 258 }else { 259 game.swnstate2--; 260 if (game.swnstate2 < 0) { 261 game.swnstate3 = 0; 262 game.swnstate2++; 263 } 264 } 265 createentity(game, 320 + 150, 58 + (int(game.swnstate2) * 20), 23, 1, 0); 266 game.swnstate = 0; game.swndelay = 0; //return to decision state 267 break; 268 } 269 }else if (t == 1) { 270 //Game 2, super gravitron 271 switch(game.swnstate) { 272 case 0: 273 //Choose either simple or filler 274 game.swnstate2 = 0; game.swnstate3 = 0; game.swnstate4 = 0; 275 276 game.swnstate2 = int(Math.random() * 100); 277 if (game.swnstate2 < 25) { 278 //simple 279 game.swnstate = 2; game.swndelay = 0; 280 }else { 281 //filler 282 game.swnstate = 4; game.swndelay = 0; 283 } 284 game.swnstate2 = 0; 285 break; 286 case 1: 287 //complex chain 288 game.swnstate2 = int(Math.random() * 8); 289 if (game.swnstate2 == 0) { game.swnstate = 10; game.swndelay = 0; 290 }else if (game.swnstate2 == 1) { game.swnstate = 12; game.swndelay = 0; 291 }else if (game.swnstate2 == 2) { game.swnstate = 14; game.swndelay = 0; 292 }else if (game.swnstate2 == 3) { game.swnstate = 20; game.swndelay = 0; 293 }else if (game.swnstate2 == 4) { game.swnstate = 21; game.swndelay = 0; 294 }else if (game.swnstate2 == 5) { game.swnstate = 22; game.swndelay = 0; 295 }else if (game.swnstate2 == 6) { game.swnstate = 22; game.swndelay = 0; 296 }else if (game.swnstate2 == 7) { game.swnstate = 14; game.swndelay = 0; 297 } 298 299 game.swnstate2 = 0; 300 break; 301 case 2: 302 //simple chain 303 game.swnstate2 = int(Math.random() * 6); 304 if (game.swnstate2 == 0) { game.swnstate = 23; game.swndelay = 0; 305 }else if (game.swnstate2 == 1) { game.swnstate = 24; game.swndelay = 0; 306 }else if (game.swnstate2 == 2) { game.swnstate = 25; game.swndelay = 0; 307 }else if (game.swnstate2 == 3) { game.swnstate = 26; game.swndelay = 0; 308 }else if (game.swnstate2 == 4) { game.swnstate = 27; game.swndelay = 0; 309 }else if (game.swnstate2 == 5) { game.swnstate = 14; game.swndelay = 0; 310 } 311 312 game.swnstate2 = 0; 313 break; 314 case 3: 315 //Choose a major action 316 game.swnstate2 = int(Math.random() * 100); 317 if (game.swnstate2 < 25) { 318 //complex 319 game.swnstate = 1; game.swndelay = 0; 320 }else { 321 //simple 322 game.swnstate = 2; game.swndelay = 0; 323 } 324 break; 325 case 4: 326 //filler chain 327 game.swnstate2 = int(Math.random() * 6); 328 if (game.swnstate2 == 0) { game.swnstate = 28; game.swndelay = 0; 329 }else if (game.swnstate2 == 1) { game.swnstate = 29; game.swndelay = 0; 330 }else if (game.swnstate2 == 2) { game.swnstate = 28; game.swndelay = 0; 331 }else if (game.swnstate2 == 3) { game.swnstate = 29; game.swndelay = 0; 332 }else if (game.swnstate2 == 4) { game.swnstate = 30; game.swndelay = 0; 333 }else if (game.swnstate2 == 5) { game.swnstate = 31; game.swndelay = 0; 334 } 335 336 game.swnstate2 = 0; 337 break; 338 case 10: 339 gravcreate(game, 0, 0); 340 gravcreate(game, 1, 0); 341 gravcreate(game, 2, 0); 342 game.swnstate++; game.swndelay = 10; //return to decision state 343 break; 344 case 11: 345 gravcreate(game, 3, 0); 346 gravcreate(game, 4, 0); 347 gravcreate(game, 5, 0); 348 game.swnstate2++; 349 if(game.swnstate2==3){ 350 game.swnstate = 0; game.swndelay = 30; //return to decision state 351 }else { 352 game.swnstate--; game.swndelay = 10; //return to decision state 353 } 354 break; 355 case 12: 356 gravcreate(game, 0, 1); 357 gravcreate(game, 1, 1); 358 gravcreate(game, 2, 1); 359 game.swnstate++; game.swndelay = 10; //return to decision state 360 break; 361 case 13: 362 gravcreate(game, 3, 1); 363 gravcreate(game, 4, 1); 364 gravcreate(game, 5, 1); 365 game.swnstate2++; 366 if(game.swnstate2==3){ 367 game.swnstate = 0; game.swndelay = 30; //return to decision state 368 }else { 369 game.swnstate--; game.swndelay = 10; //return to decision state 370 } 371 break; 372 case 14: 373 gravcreate(game, 0, 0, 0); 374 gravcreate(game, 5, 1, 0); 375 376 game.swnstate++; game.swndelay = 20; //return to decision state 377 break; 378 case 15: 379 gravcreate(game, 1, 0); 380 gravcreate(game, 4, 1); 381 382 game.swnstate++; game.swndelay = 20; //return to decision state 383 break; 384 case 16: 385 gravcreate(game, 2, 0); 386 gravcreate(game, 3, 1); 387 388 game.swnstate++; game.swndelay = 20; //return to decision state 389 break; 390 case 17: 391 gravcreate(game, 3, 0); 392 gravcreate(game, 2, 1); 393 394 game.swnstate++; game.swndelay = 20; //return to decision state 395 break; 396 case 18: 397 gravcreate(game, 4, 0); 398 gravcreate(game, 1, 1); 399 400 game.swnstate++; game.swndelay = 20; //return to decision state 401 break; 402 case 19: 403 gravcreate(game, 5, 0); 404 gravcreate(game, 0, 1); 405 406 game.swnstate=0; game.swndelay = 20; //return to decision state 407 break; 408 case 20: 409 game.swnstate4++; 410 if(game.swnstate3==0){ 411 game.swnstate2++; 412 if (game.swnstate2 >= 6) { 413 game.swnstate3 = 1; 414 game.swnstate2--; 415 } 416 }else { 417 game.swnstate2--; 418 if (game.swnstate2 < 0) { 419 game.swnstate3 = 0; 420 game.swnstate2++; 421 } 422 } 423 createentity(game, -150, 58 + (int(game.swnstate2) * 20), 23, 0, 0); 424 if(game.swnstate4<=6){ 425 game.swnstate = 20; game.swndelay = 10; //return to decision state 426 }else { 427 game.swnstate = 0; game.swndelay = 10; //return to decision state 428 } 429 break; 430 case 21: 431 game.swnstate4++; 432 if(game.swnstate3==0){ 433 game.swnstate2++; 434 if (game.swnstate2 >= 6) { 435 game.swnstate3 = 1; 436 game.swnstate2--; 437 } 438 }else { 439 game.swnstate2--; 440 if (game.swnstate2 < 0) { 441 game.swnstate3 = 0; 442 game.swnstate2++; 443 } 444 } 445 createentity(game, 320+150, 58 + (int(game.swnstate2) * 20), 23, 1, 0); 446 if(game.swnstate4<=6){ 447 game.swnstate = 21; game.swndelay = 10; //return to decision state 448 }else { 449 game.swnstate = 0; game.swndelay = 10; //return to decision state 450 } 451 break; 452 case 22: 453 game.swnstate4++; 454 //left and right compliments 455 game.swnstate2 = int(Math.random() * 6); 456 createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); 457 createentity(game, 320 + 150, 58 + ((5 - game.swnstate2) * 20), 23, 1, 0); 458 if(game.swnstate4<=12){ 459 game.swnstate = 22; game.swndelay = 18; //return to decision state 460 }else { 461 game.swnstate = 0; game.swndelay = 18; //return to decision state 462 } 463 game.swnstate2 = 0; 464 break; 465 case 23: 466 gravcreate(game, 1, 0); 467 gravcreate(game, 2, 0, 15); 468 gravcreate(game, 2, 0, -15); 469 gravcreate(game, 3, 0, 15); 470 gravcreate(game, 3, 0, -15); 471 gravcreate(game, 4, 0); 472 game.swnstate = 0; game.swndelay = 15; //return to decision state 473 break; 474 case 24: 475 gravcreate(game, 1, 1); 476 gravcreate(game, 2, 1, 15); 477 gravcreate(game, 2, 1, -15); 478 gravcreate(game, 3, 1, 15); 479 gravcreate(game, 3, 1, -15); 480 gravcreate(game, 4, 1); 481 game.swnstate = 0; game.swndelay = 15; //return to decision state 482 break; 483 case 25: 484 gravcreate(game, 0, 0); 485 gravcreate(game, 1, 1,0,10); 486 gravcreate(game, 4, 1,0,-10); 487 gravcreate(game, 5, 0); 488 game.swnstate = 0; game.swndelay = 20; //return to decision state 489 break; 490 case 26: 491 gravcreate(game, 0, 1, 0); 492 gravcreate(game, 1, 1, 10); 493 gravcreate(game, 4, 1, 40); 494 gravcreate(game, 5, 1, 50); 495 game.swnstate = 0; game.swndelay = 20; //return to decision state 496 break; 497 case 27: 498 gravcreate(game, 0, 0, 0); 499 gravcreate(game, 1, 0, 10); 500 gravcreate(game, 4, 0, 40); 501 gravcreate(game, 5, 0, 50); 502 game.swnstate = 0; game.swndelay = 20; //return to decision state 503 break; 504 case 28: 505 game.swnstate4++; 506 game.swnstate2 = int(Math.random() * 6); 507 createentity(game, -150, 58 + (game.swnstate2 * 20), 23, 0, 0); 508 if(game.swnstate4<=6){ 509 game.swnstate = 28; game.swndelay = 8; //return to decision state 510 }else { 511 game.swnstate = 3; game.swndelay = 15; //return to decision state 512 } 513 game.swnstate2 = 0; 514 break; 515 case 29: 516 game.swnstate4++; 517 game.swnstate2 = int(Math.random() * 6); 518 gravcreate(game, game.swnstate2, 1); 519 if(game.swnstate4<=6){ 520 game.swnstate = 29; game.swndelay = 8; //return to decision state 521 }else { 522 game.swnstate = 3; game.swndelay = 15; //return to decision state 523 } 524 game.swnstate2 = 0; 525 break; 526 case 30: 527 game.swnstate4++; 528 game.swnstate2 = int(Math.random() * 3); 529 gravcreate(game, game.swnstate2, 0); 530 gravcreate(game, 5-game.swnstate2, 0); 531 if(game.swnstate4<=2){ 532 game.swnstate = 30; game.swndelay = 14; //return to decision state 533 }else { 534 game.swnstate = 3; game.swndelay = 15; //return to decision state 535 } 536 game.swnstate2 = 0; 537 break; 538 case 31: 539 game.swnstate4++; 540 game.swnstate2 = int(Math.random() * 3); 541 gravcreate(game, game.swnstate2, 1); 542 gravcreate(game, 5-game.swnstate2, 1); 543 if(game.swnstate4<=2){ 544 game.swnstate = 31; game.swndelay = 14; //return to decision state 545 }else { 546 game.swnstate = 3; game.swndelay = 15; //return to decision state 547 } 548 game.swnstate2 = 0; 549 break; 550 } 551 } 552 }else { 553 game.swndelay--; 554 } 555 } 556 557 public function createblock(t:int, xp:int=0, yp:int=0, w:int=0, h:int=0, trig:int=0):void{ 558 if(nblocks == 0) { 559 //If there are no active blocks, Z=0; 560 k = 0; nblocks++; 561 }else { 562 i = 0; k = -1; 563 while (i < nblocks) { 564 if (!blocks[i].active) { 565 k = i; i = nblocks; 566 } 567 i++; 568 } 569 if (k == -1) { 570 k = nblocks; 571 nblocks++; 572 } 573 } 574 575 blocks[k].clear(); 576 blocks[k].active = true; 577 switch(t) { 578 case BLOCK: //Block 579 blocks[k].type = BLOCK; 580 blocks[k].xp = xp; 581 blocks[k].yp = yp; 582 blocks[k].wp = w; 583 blocks[k].hp = h; 584 blocks[k].rectset(xp, yp, w, h); 585 586 opt_useblock = true; 587 break; 588 case TRIGGER: //Trigger 589 blocks[k].type = TRIGGER; 590 blocks[k].x = xp; 591 blocks[k].y = yp; 592 blocks[k].wp = w; 593 blocks[k].hp = h; 594 blocks[k].rectset(xp, yp, w, h); 595 blocks[k].trigger = trig; 596 597 opt_usetrigger = true; 598 break; 599 case DAMAGE: //Damage 600 blocks[k].type = DAMAGE; 601 blocks[k].x = xp; 602 blocks[k].y = yp; 603 blocks[k].wp = w; 604 blocks[k].hp = h; 605 blocks[k].rectset(xp, yp, w, h); 606 607 opt_usedamage = true; 608 break; 609 case DIRECTIONAL: //Directional 610 blocks[k].type = DIRECTIONAL; 611 blocks[k].x = xp; 612 blocks[k].y = yp; 613 blocks[k].wp = w; 614 blocks[k].hp = h; 615 blocks[k].rectset(xp, yp, w, h); 616 blocks[k].trigger = trig; 617 618 opt_usedirectional = true; 619 break; 620 case SAFE: //Safe block 621 blocks[k].type = SAFE; 622 blocks[k].xp = xp; 623 blocks[k].yp = yp; 624 blocks[k].wp = w; 625 blocks[k].hp = h; 626 blocks[k].rectset(xp, yp, w, h); 627 628 opt_usesafe = true; 629 break; 630 case ACTIVITY: //Activity Zone 631 blocks[k].type = ACTIVITY; 632 blocks[k].x = xp; 633 blocks[k].y = yp; 634 blocks[k].wp = w; 635 blocks[k].hp = h; 636 blocks[k].rectset(xp, yp, w, h); 637 638 opt_useactivity = true; 639 640 //Ok, each and every activity zone in the game is initilised here. "Trig" in this case is a variable that 641 //assigns all the details. 642 switch(trig) { 643 case 0: //testing zone 644 blocks[k].prompt = "Press ENTER to explode"; 645 if(mobilemenus) blocks[k].prompt = "Explode"; 646 blocks[k].script = "intro"; 647 setblockcolour(k, "orange"); 648 trig=1; 649 break; 650 case 1: 651 blocks[k].prompt = "Press ENTER to talk to Violet"; 652 if(mobilemenus) blocks[k].prompt = "Talk to Violet"; 653 blocks[k].script = "talkpurple"; 654 setblockcolour(k, "purple"); 655 trig=0; 656 break; 657 case 2: 658 blocks[k].prompt = "Press ENTER to talk to Vitellary"; 659 if(mobilemenus) blocks[k].prompt = "Talk to Vitellary"; 660 blocks[k].script = "talkyellow"; 661 setblockcolour(k, "yellow"); 662 trig=0; 663 break; 664 case 3: 665 blocks[k].prompt = "Press ENTER to talk to Vermilion"; 666 if(mobilemenus) blocks[k].prompt = "Talk to Vermilion"; 667 blocks[k].script = "talkred"; 668 setblockcolour(k, "red"); 669 trig=0; 670 break; 671 case 4: 672 blocks[k].prompt = "Press ENTER to talk to Verdigris"; 673 if(mobilemenus) blocks[k].prompt = "Talk to Verdigris"; 674 blocks[k].script = "talkgreen"; 675 setblockcolour(k, "green"); 676 trig=0; 677 break; 678 case 5: 679 blocks[k].prompt = "Press ENTER to talk to Victoria"; 680 if(mobilemenus) blocks[k].prompt = "Talk to Victoria"; 681 blocks[k].script = "talkblue"; 682 setblockcolour(k, "blue"); 683 trig=0; 684 break; 685 case 6: 686 blocks[k].prompt = "Press ENTER to activate terminal"; 687 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 688 blocks[k].script = "terminal_station_1"; 689 setblockcolour(k, "orange"); 690 trig=0; 691 break; 692 case 7: 693 blocks[k].prompt = "Press ENTER to activate terminal"; 694 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 695 blocks[k].script = "terminal_outside_1"; 696 setblockcolour(k, "orange"); 697 trig=0; 698 break; 699 case 8: 700 blocks[k].prompt = "Press ENTER to activate terminal"; 701 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 702 blocks[k].script = "terminal_outside_2"; 703 setblockcolour(k, "orange"); 704 trig=0; 705 break; 706 case 9: 707 blocks[k].prompt = "Press ENTER to activate terminal"; 708 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 709 blocks[k].script = "terminal_outside_3"; 710 setblockcolour(k, "orange"); 711 trig=0; 712 break; 713 case 10: 714 blocks[k].prompt = "Press ENTER to activate terminal"; 715 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 716 blocks[k].script = "terminal_outside_4"; 717 setblockcolour(k, "orange"); 718 trig=0; 719 break; 720 case 11: 721 blocks[k].prompt = "Press ENTER to activate terminal"; 722 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 723 blocks[k].script = "terminal_outside_5"; 724 setblockcolour(k, "orange"); 725 trig=0; 726 break; 727 case 12: 728 blocks[k].prompt = "Press ENTER to activate terminal"; 729 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 730 blocks[k].script = "terminal_outside_6"; 731 setblockcolour(k, "orange"); 732 trig=0; 733 break; 734 case 13: 735 blocks[k].prompt = "Press ENTER to activate terminal"; 736 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 737 blocks[k].script = "terminal_finallevel"; 738 setblockcolour(k, "orange"); 739 trig=0; 740 break; 741 case 14: 742 blocks[k].prompt = "Press ENTER to activate terminal"; 743 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 744 blocks[k].script = "terminal_station_2"; 745 setblockcolour(k, "orange"); 746 trig=0; 747 break; 748 case 15: 749 blocks[k].prompt = "Press ENTER to activate terminal"; 750 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 751 blocks[k].script = "terminal_station_3"; 752 setblockcolour(k, "orange"); 753 trig=0; 754 break; 755 case 16: 756 blocks[k].prompt = "Press ENTER to activate terminal"; 757 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 758 blocks[k].script = "terminal_station_4"; 759 setblockcolour(k, "orange"); 760 trig=0; 761 break; 762 case 17: 763 blocks[k].prompt = "Press ENTER to activate terminal"; 764 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 765 blocks[k].script = "terminal_warp_1"; 766 setblockcolour(k, "orange"); 767 trig=0; 768 break; 769 case 18: 770 blocks[k].prompt = "Press ENTER to activate terminal"; 771 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 772 blocks[k].script = "terminal_warp_2"; 773 setblockcolour(k, "orange"); 774 trig=0; 775 break; 776 case 19: 777 blocks[k].prompt = "Press ENTER to activate terminal"; 778 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 779 blocks[k].script = "terminal_lab_1"; 780 setblockcolour(k, "orange"); 781 trig=0; 782 break; 783 case 20: 784 blocks[k].prompt = "Press ENTER to activate terminal"; 785 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 786 blocks[k].script = "terminal_lab_2"; 787 setblockcolour(k, "orange"); 788 trig=0; 789 break; 790 case 21: 791 blocks[k].prompt = "Press ENTER to activate terminal"; 792 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 793 blocks[k].script = "terminal_secretlab"; 794 setblockcolour(k, "orange"); 795 trig=0; 796 break; 797 case 22: 798 blocks[k].prompt = "Press ENTER to activate terminal"; 799 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 800 blocks[k].script = "terminal_shipcomputer"; 801 setblockcolour(k, "orange"); 802 trig=0; 803 break; 804 case 23: 805 blocks[k].prompt = "Press ENTER to activate terminals"; 806 if(mobilemenus) blocks[k].prompt = "Activate terminals"; 807 blocks[k].script = "terminal_radio"; 808 setblockcolour(k, "orange"); 809 trig=0; 810 break; 811 case 24: 812 blocks[k].prompt = "Press ENTER to activate terminal"; 813 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 814 blocks[k].script = "terminal_jukebox"; 815 setblockcolour(k, "orange"); 816 trig=0; 817 break; 818 case 25: 819 blocks[k].prompt = "Passion for exploring"; 820 blocks[k].script = "terminal_juke1"; 821 setblockcolour(k, "orange"); 822 trig=0; 823 break; 824 case 26: 825 blocks[k].prompt = "Pushing onwards"; 826 blocks[k].script = "terminal_juke2"; 827 setblockcolour(k, "orange"); 828 trig=0; 829 break; 830 case 27: 831 blocks[k].prompt = "Positive force"; 832 blocks[k].script = "terminal_juke3"; 833 setblockcolour(k, "orange"); 834 trig=0; 835 break; 836 case 28: 837 blocks[k].prompt = "Presenting VVVVVV"; 838 blocks[k].script = "terminal_juke4"; 839 setblockcolour(k, "orange"); 840 trig=0; 841 break; 842 case 29: 843 blocks[k].prompt = "Potential for anything"; 844 blocks[k].script = "terminal_juke5"; 845 setblockcolour(k, "orange"); 846 trig=0; 847 break; 848 case 30: 849 blocks[k].prompt = "Predestined fate"; 850 blocks[k].script = "terminal_juke6"; 851 setblockcolour(k, "orange"); 852 trig=0; 853 break; 854 case 31: 855 blocks[k].prompt = "Pipe Dream"; 856 blocks[k].script = "terminal_juke7"; 857 setblockcolour(k, "orange"); 858 trig=0; 859 break; 860 case 32: 861 blocks[k].prompt = "Popular Potpourri"; 862 blocks[k].script = "terminal_juke8"; 863 setblockcolour(k, "orange"); 864 trig=0; 865 break; 866 case 33: 867 blocks[k].prompt = "Pressure Cooker"; 868 blocks[k].script = "terminal_juke9"; 869 setblockcolour(k, "orange"); 870 trig=0; 871 break; 872 case 34: 873 blocks[k].prompt = "ecrof evitisoP"; 874 blocks[k].script = "terminal_juke10"; 875 setblockcolour(k, "orange"); 876 trig=0; 877 break; 878 case 35: 879 blocks[k].prompt = "Press ENTER to activate terminal"; 880 if(mobilemenus) blocks[k].prompt = "Activate terminal"; 881 blocks[k].script = "custom_"+customscript; 882 setblockcolour(k, "orange"); 883 trig=0; 884 break; 885 } 886 break; 887 } 888 } 889 890 public function removeallblocks():void{ 891 for(i=0; i<nblocks; i++) blocks[i].clear(); 892 nblocks=0; 893 } 894 895 public function removeblock(t:int):void { 896 blocks[t].clear(); 897 } 898 899 public function removeblockat(x:int, y:int):void{ 900 for (i = 0; i < nblocks; i++) { 901 if(blocks[i].xp == int(x) && blocks[i].yp == int(y)) removeblock(i); 902 } 903 } 904 905 public function removetrigger(t:int):void{ 906 for(i=0; i<nblocks; i++){ 907 if(blocks[i].type == TRIGGER) { 908 if (blocks[i].trigger == t) { 909 blocks[i].active = false; 910 removeblock(i); 911 } 912 } 913 } 914 } 915 916 public function copylinecross(t:int):void { 917 //Copy entity t into the first free linecrosskludge entity 918 linecrosskludge[nlinecrosskludge].clear(); 919 linecrosskludge[nlinecrosskludge].xp = entities[t].xp; 920 linecrosskludge[nlinecrosskludge].yp = entities[t].yp; 921 linecrosskludge[nlinecrosskludge].w = entities[t].w; 922 linecrosskludge[nlinecrosskludge].onentity = entities[t].onentity; 923 linecrosskludge[nlinecrosskludge].state = entities[t].state; 924 linecrosskludge[nlinecrosskludge].life = entities[t].life; 925 nlinecrosskludge++; 926 } 927 928 public function revertlinecross(t:int, s:int):void { 929 //Restore entity t info from linecrossing s 930 entities[t].onentity = linecrosskludge[s].onentity; 931 entities[t].state = linecrosskludge[s].state; 932 entities[t].life = linecrosskludge[s].life; 933 } 934 935 public function gridmatch(p1:int, p2:int, p3:int, p4:int, p11:int, p21:int, p31:int, p41:int):Boolean { 936 if (p1 == p11 && p2 == p21 && p3 == p31 && p4 == p41) return true; 937 return false; 938 } 939 940 public function crewcolour(t:int):int { 941 //Return the colour of the indexed crewmate 942 switch(t) { 943 case 0: return 0; break; 944 case 1: return 20; break; 945 case 2: return 14; break; 946 case 3: return 15; break; 947 case 4: return 13; break; 948 case 5: return 16; break; 949 } 950 return 0; 951 } 952 953 954 public function setenemyroom(t:int, rx:int, ry:int):void { 955 //Simple function to initilise simple enemies 956 rx -= 100; ry -= 100; 957 switch(rn(rx, ry)) { 958 //Space Station 1 959 case rn(12, 3): //Security Drone 960 entities[t].tile = 36; entities[t].colour = 8; entities[t].animate = 1; 961 break; 962 case rn(13, 3): //Wavelengths 963 entities[t].tile = 32; entities[t].colour = 7; entities[t].animate = 1; 964 entities[t].w = 32; 965 break; 966 case rn(15, 3): //Traffic 967 entities[t].tile = 28; entities[t].colour = 6; entities[t].animate = 1; 968 entities[t].w = 22; entities[t].h = 32; 969 break; 970 case rn(12, 5): //The Yes Men 971 entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1; 972 entities[t].w = 20; entities[t].h = 20; 973 break; 974 case rn(13, 6): //Hunchbacked Guards 975 entities[t].tile = 44; entities[t].colour = 8; entities[t].animate = 1; 976 entities[t].w = 16; entities[t].h = 20; 977 break; 978 case rn(13, 4): //Communication Station 979 entities[t].harmful = false; 980 if (entities[t].xp == 256) { 981 //transmittor 982 entities[t].tile = 104; entities[t].colour = 4; entities[t].animate = 7; 983 entities[t].w = 16; entities[t].h = 16; 984 entities[t].xp -= 24; entities[t].yp -= 16; 985 }else { 986 //radar dish 987 entities[t].tile =124; entities[t].colour = 4; entities[t].animate = 6; 988 entities[t].w = 32; entities[t].h = 32; entities[t].cx = 4; entities[t].size = 9; 989 entities[t].xp -= 4; entities[t].yp -= 32; 990 } 991 992 break; 993 //The Lab 994 case rn(4, 0): 995 entities[t].tile = 78; entities[t].colour = 7; entities[t].animate = 1; 996 entities[t].w = 16; entities[t].h = 16; 997 break; 998 case rn(2, 0): 999 entities[t].tile = 88; entities[t].colour = 11; entities[t].animate = 1; 1000 entities[t].w = 16; entities[t].h = 16; 1001 break; 1002 //Space Station 2 1003 case rn(14, 11): entities[t].colour = 17; break; //Lies 1004 case rn(16, 11): entities[t].colour = 8; break; //Lies 1005 case rn(13, 10): entities[t].colour = 11; break; //Factory 1006 case rn(13, 9): entities[t].colour = 9; break; //Factory 1007 case rn(13, 8): entities[t].colour = 8; break; //Factory 1008 case rn(11, 13): //Truth 1009 entities[t].tile = 64; entities[t].colour = 7; entities[t].animate = 100; 1010 entities[t].w = 44; entities[t].h = 10; entities[t].size = 10; 1011 break; 1012 case rn(17, 7): //Brass sent us under the top 1013 entities[t].tile =82; entities[t].colour = 8; entities[t].animate = 5; 1014 entities[t].w = 28; entities[t].h = 32; entities[t].cx = 4; 1015 break; 1016 case rn(10, 7): // (deception) 1017 entities[t].tile = 92; entities[t].colour = 6; entities[t].animate = 1; 1018 entities[t].w = 16; entities[t].h = 16; 1019 break; 1020 case rn(14, 13): // (chose poorly) 1021 entities[t].tile = 56; entities[t].colour = 6; entities[t].animate = 1; 1022 entities[t].w = 15; entities[t].h = 24; 1023 break; 1024 case rn(13, 12): // (backsliders) 1025 entities[t].tile = 164; entities[t].colour = 7; entities[t].animate = 1; 1026 entities[t].w = 16; entities[t].h = 16; 1027 break; 1028 case rn(14, 8): // (wheel of fortune room) 1029 entities[t].tile = 116; entities[t].colour = 12; entities[t].animate = 1; 1030 entities[t].w = 32; entities[t].h = 32; 1031 break; 1032 case rn(16, 9): // (seeing dollar signs) 1033 entities[t].tile = 68; entities[t].colour = 7; entities[t].animate = 1; 1034 entities[t].w = 16; entities[t].h = 16; 1035 break; 1036 case rn(16, 7): // (tomb of mad carew) 1037 entities[t].tile = 106; entities[t].colour = 7; entities[t].animate = 2; 1038 entities[t].w = 24; entities[t].h = 25; 1039 break; 1040 //Warp Zone 1041 case rn(15, 2): // (numbers) 1042 entities[t].tile = 100; entities[t].colour = 6; entities[t].animate = 1; 1043 entities[t].w = 32; entities[t].h = 14; entities[t].yp += 1; 1044 break; 1045 case rn(16, 2): // (Manequins) 1046 entities[t].tile = 52; entities[t].colour = 7; entities[t].animate = 5; 1047 entities[t].w = 16; entities[t].h = 25; entities[t].yp -= 4; 1048 break; 1049 case rn(18, 0): // (Obey) 1050 entities[t].tile = 51; entities[t].colour = 11; entities[t].animate = 100; 1051 entities[t].w = 30; entities[t].h = 14; 1052 break; 1053 case rn(19, 1): // Ascending and Descending 1054 entities[t].tile = 48; entities[t].colour = 9; entities[t].animate = 5; 1055 entities[t].w = 16; entities[t].h = 16; 1056 break; 1057 case rn(19, 2): // Shockwave Rider 1058 entities[t].tile = 176; entities[t].colour = 6; entities[t].animate = 1; 1059 entities[t].w = 16; entities[t].h = 16; 1060 break; 1061 case rn(18, 3): // Mind the gap 1062 entities[t].tile = 168; entities[t].colour = 7; entities[t].animate = 1; 1063 entities[t].w = 16; entities[t].h = 16; 1064 break; 1065 case rn(17, 3): // Edge Games 1066 if (entities[t].yp ==96) { 1067 entities[t].tile = 160; entities[t].colour = 8; entities[t].animate = 1; 1068 entities[t].w = 16; entities[t].h = 16; 1069 }else { 1070 entities[t].tile = 156; entities[t].colour = 8; entities[t].animate = 1; 1071 entities[t].w = 16; entities[t].h = 16; 1072 } 1073 break; 1074 case rn(16, 0): // I love you 1075 entities[t].tile = 112; entities[t].colour = 8; entities[t].animate = 5; 1076 entities[t].w = 16; entities[t].h = 16; 1077 break; 1078 case rn(14, 2): // That's why I have to kill you 1079 entities[t].tile = 114; entities[t].colour = 6; entities[t].animate = 5; 1080 entities[t].w = 16; entities[t].h = 16; 1081 break; 1082 case rn(18, 2): // Thinking with Portals 1083 //depends on direction 1084 if (entities[t].xp ==88) { 1085 entities[t].tile = 54+12; entities[t].colour = 12; entities[t].animate = 100; 1086 entities[t].w = 60; entities[t].h = 16; entities[t].size = 10; 1087 }else{ 1088 entities[t].tile = 54; entities[t].colour = 12; entities[t].animate = 100; 1089 entities[t].w = 60; entities[t].h = 16; entities[t].size = 10; 1090 } 1091 break; 1092 //Final level 1093 case rn(50-100, 53-100): //The Yes Men 1094 entities[t].tile = 40; entities[t].colour = 9; entities[t].animate = 1; 1095 entities[t].w = 20; entities[t].h = 20; 1096 break; 1097 case rn(48-100, 51-100): //Wavelengths 1098 entities[t].tile = 32; entities[t].colour = 7; entities[t].animate = 1; 1099 entities[t].w = 32; 1100 break; 1101 case rn(43-100,52-100): // Ascending and Descending 1102 entities[t].tile = 48; entities[t].colour = 9; entities[t].animate = 5; 1103 entities[t].w = 16; entities[t].h = 16; 1104 break; 1105 case rn(46-100,51-100): //kids his age 1106 entities[t].tile = 88; entities[t].colour = 11; entities[t].animate = 1; 1107 entities[t].w = 16; entities[t].h = 16; 1108 break; 1109 case rn(43-100,51-100): // Mind the gap 1110 entities[t].tile = 168; entities[t].colour = 7; entities[t].animate = 1; 1111 entities[t].w = 16; entities[t].h = 16; 1112 break; 1113 case rn(44-100,51-100): // vertigo? 1114 entities[t].tile = 172; entities[t].colour = 7; entities[t].animate = 100; 1115 entities[t].w = 32; entities[t].h = 32; 1116 break; 1117 case rn(44-100,52-100): // (backsliders) 1118 entities[t].tile = 164; entities[t].colour = 7; entities[t].animate = 1; 1119 entities[t].w = 16; entities[t].h = 16; 1120 break; 1121 case rn(43-100, 56-100): //Intermission 1 1122 entities[t].tile = 88; entities[t].colour = 21; entities[t].animate = 1; 1123 entities[t].w = 16; entities[t].h = 16; 1124 break; 1125 case rn(45-100, 56-100): //Intermission 1 1126 entities[t].tile = 88; entities[t].colour = 21; entities[t].animate = 1; 1127 entities[t].w = 16; entities[t].h = 16; 1128 break; 1129 //The elephant 1130 case rn(11, 9): case rn(12, 9): case rn(11, 8): case rn(12, 8): 1131 entities[t].tile = 0; entities[t].colour = 102; entities[t].animate = 0; 1132 entities[t].w = 464; entities[t].h = 320; entities[t].size = 11; 1133 entities[t].harmful = false; 1134 break; 1135 } 1136 } 1137 1138 public function setenemy(t:int, r:int):void { 1139 switch(t) { 1140 case 0: 1141 //lies emitter 1142 if(entities[r].para==0){ 1143 entities[r].tile = 60; entities[r].animate = 2; 1144 entities[r].colour = 6; entities[r].behave = 10; 1145 entities[r].w = 32; entities[r].h = 32; 1146 entities[r].x1 = -200; 1147 }else if (entities[r].para == 1) { 1148 entities[r].yp += 10; 1149 entities[r].tile = 63; entities[r].animate = 100; //LIES 1150 entities[r].colour = 6; 1151 entities[r].behave = 11; entities[r].para = 9; //destroyed when outside 1152 entities[r].x1 = -200; entities[r].x2 = 400; 1153 entities[r].w = 26; entities[r].h = 10; 1154 entities[r].cx = 1; entities[r].cy = 1; 1155 }else if (entities[r].para == 2) { 1156 entities[r].tile = 62; entities[r].animate = 100; 1157 entities[r].colour = 6; entities[r].behave = -1; 1158 entities[r].w = 32; entities[r].h = 32; 1159 } 1160 break; 1161 case 1: 1162 //FACTORY emitter 1163 if(entities[r].para==0){ 1164 entities[r].tile = 72; entities[r].animate = 3; entities[r].size = 9; 1165 entities[r].colour = 6; entities[r].behave = 12; 1166 entities[r].w = 64; entities[r].h = 40; 1167 entities[r].cx = 0; entities[r].cy = 24; 1168 }else if (entities[r].para == 1) { 1169 entities[r].xp += 4; entities[r].yp -= 4; 1170 entities[r].tile = 76; entities[r].animate = 100; // Clouds 1171 entities[r].colour = 6; 1172 entities[r].behave = 13; entities[r].para = -6; //destroyed when outside 1173 entities[r].x2 = 400; 1174 entities[r].w = 32; entities[r].h = 12; 1175 entities[r].cx = 0; entities[r].cy = 6; 1176 }else if (entities[r].para == 2) { 1177 entities[r].tile = 77; entities[r].animate = 100; 1178 entities[r].colour = 6; entities[r].behave = -1; 1179 entities[r].w = 32; entities[r].h = 16; 1180 } 1181 break; 1182 default: 1183 break; 1184 } 1185 } 1186 1187 1188 public function rn(rx:int, ry:int):int { 1189 return rx + (ry * 100); 1190 } 1191 1192 public function settreadmillcolour(t:int, rx:int, ry:int):void { 1193 rx -= 100; ry -= 100; 1194 rx += 50 - 12; ry += 50 - 14; //Space Station 1195 1196 entities[t].tile = 20; //default as blue 1197 switch(rn(rx, ry)) { 1198 case rn(52, 48): entities[t].tile = 791; break; //Cyan 1199 1200 case rn(49, 47): entities[t].tile = 24; break; //Yellow 1201 case rn(56, 44): entities[t].tile = 24; break; //Yellow 1202 case rn(54, 49): entities[t].tile = 24; break; //Yellow 1203 1204 case rn(49, 49): entities[t].tile = 36; break; //Green 1205 case rn(55, 44): entities[t].tile = 36; break; //Green 1206 case rn(54, 43): entities[t].tile = 36; break; //Green 1207 case rn(53, 49): entities[t].tile = 36; break; //Green 1208 case rn(54, 45): entities[t].tile = 711; break; //Green (special) 1209 case rn(51, 48): entities[t].tile = 711; break; //Green (special) 1210 1211 case rn(50, 49): entities[t].tile = 28; break; //Purple 1212 case rn(54, 44): entities[t].tile = 28; break; //Purple 1213 case rn(49, 42): entities[t].tile = 28; break; //Purple 1214 case rn(55, 43): entities[t].tile = 28; break; //Purple 1215 case rn(54, 47): entities[t].tile = 28; break; //Purple 1216 case rn(53, 48): entities[t].tile = 28; break; //Purple 1217 1218 case rn(51, 47): entities[t].tile = 32; break; //Red 1219 case rn(52, 49): entities[t].tile = 32; break; //Red 1220 case rn(48, 43): entities[t].tile = 32; break; //Red 1221 case rn(55, 47): entities[t].tile = 32; break; //Red 1222 case rn(54, 48): entities[t].tile = 32; break; //Red 1223 } 1224 } 1225 1226 public function createentity(game:gameclass, xp:Number, yp:Number, t:int, vx:Number = 0, vy:Number = 0, 1227 p1:int = 0, p2:int = 0, p3:int = 320, p4:int = 240 ):void { 1228 //Find the first inactive case z that we can use to index the new entity 1229 if (nentity == 0) { 1230 //If there are no active entities, Z=0; 1231 k = 0; nentity++; 1232 }else { 1233 i = 0; k = -1; 1234 while (i < nentity) { 1235 if (!entities[i].active) { 1236 k = i; i = nentity; 1237 } 1238 i++; 1239 } 1240 if (k == -1) { 1241 k = nentity; 1242 nentity++; 1243 } 1244 } 1245 1246 //Size 0 is a sprite 1247 //Size 1 is a tile 1248 //Beyond that are special cases (to do) 1249 //Size 2 is a moving platform of width 4 (32) 1250 //Size 3 is apparently a "bug chunky pixel" 1251 //Size 4 is a coin/small pickup 1252 //Size 5 is a horizontal line, 6 is vertical 1253 1254 //Rule 0 is the playable character 1255 //Rule 1 is anything harmful 1256 //Rule 2 is anything decorative (no collisions) 1257 //Rule 3 is anything that results in an entity to entity collision and state change 1258 //Rule 4 is a horizontal line, 5 is vertical 1259 //Rule 6 is a crew member 1260 1261 //trace("creating entity type ", t, xp, yp); 1262 1263 entities[k].clear(); 1264 entities[k].active = true; 1265 entities[k].type = t; 1266 switch(t) { 1267 case 0: //Player 1268 entities[k].rule = 0; //Playable character 1269 entities[k].tile = 0; entities[k].colour = 0; 1270 entities[k].xp = xp; entities[k].yp = yp; 1271 entities[k].cx = 6; entities[k].cy = 2; 1272 entities[k].w = 12; entities[k].h = 21; 1273 entities[k].dir = 1; 1274 1275 if(vx==1) entities[k].invis = true; 1276 1277 entities[k].gravity = true; 1278 break; 1279 case 1: //Simple enemy, bouncing about like a spastic 1280 entities[k].rule = 1; 1281 entities[k].xp = xp; entities[k].yp = yp; 1282 entities[k].behave = vx; entities[k].para = vy; 1283 entities[k].w = 16; entities[k].h = 16; 1284 entities[k].cx = 0; entities[k].cy = 0; 1285 1286 entities[k].x1 = p1; entities[k].y1 = p2; 1287 entities[k].x2 = p3; entities[k].y2 = p4; 1288 1289 entities[k].harmful = true; 1290 //Exact appearance depends entirely on location, assigned here: 1291 /* 1292 }else if (game.roomx == 50 && game.roomy == 52) { 1293 entities[k].tile = 48; entities[k].colour = 6; 1294 entities[k].w = 32; entities[k].h = 27; 1295 entities[k].animate = 1; 1296 //ok, for space station 2 1297 */ 1298 entities[k].tile = 24; 1299 entities[k].animate = 0; 1300 entities[k].colour = 8; 1301 1302 1303 if (game.roomy == 111 && (game.roomx >= 113 && game.roomx <= 117)) { 1304 setenemy(0, k); 1305 setenemyroom(k, game.roomx, game.roomy); //For colour 1306 }else if (game.roomx == 113 && (game.roomy <= 110 && game.roomy >= 108)) { 1307 setenemy(1, k); 1308 setenemyroom(k, game.roomx, game.roomy); //For colour 1309 }else if (game.roomx == 113 && game.roomy == 107) { 1310 //MAVVERRRICK 1311 entities[k].tile = 96; entities[k].colour = 6; entities[k].size = 9; 1312 entities[k].w = 64; entities[k].h = 44; 1313 entities[k].animate = 4; 1314 }else { 1315 setenemyroom(k, game.roomx, game.roomy); 1316 } 1317 1318 1319 //}else{*/ 1320 /* 1321 entities[k].tile = 24; 1322 entities[k].animate = 0; 1323 entities[k].colour = 8; 1324 //for warpzone: 1325 if (game.roomx == 51 && game.roomy == 51) entities[k].colour = 6; 1326 if (game.roomx == 52 && game.roomy == 51) entities[k].colour = 7; 1327 if (game.roomx == 54 && game.roomy == 49) entities[k].colour = 11; 1328 if (game.roomx == 55 && game.roomy == 50) entities[k].colour = 9; 1329 if (game.roomx == 55 && game.roomy == 51) entities[k].colour = 6; 1330 if (game.roomx == 54 && game.roomy == 51) entities[k].colour = 12; 1331 if (game.roomx == 54 && game.roomy == 52) entities[k].colour = 7; 1332 if (game.roomx == 53 && game.roomy == 52) entities[k].colour = 8; 1333 if (game.roomx == 51 && game.roomy == 52) entities[k].colour = 6; 1334 if (game.roomx == 52 && game.roomy == 49) entities[k].colour = 8; 1335 //} 1336 */ 1337 break; 1338 case 2: //A moving platform 1339 entities[k].rule = 2; entities[k].type = 1; 1340 entities[k].size = 2; entities[k].tile = 1; 1341 1342 if (customplatformtile > 0){ 1343 entities[k].tile = customplatformtile; 1344 }else if (platformtile > 0) { 1345 entities[k].tile = platformtile; 1346 }else{ 1347 //appearance again depends on location 1348 if (gridmatch(p1, p2, p3, p4, 100, 70, 320, 160)) entities[k].tile = 616; 1349 if (gridmatch(p1, p2, p3, p4, 72, 0, 248, 240)) entities[k].tile = 610; 1350 if (gridmatch(p1, p2, p3, p4, -20, 0, 320, 240)) entities[k].tile = 413; 1351 1352 if (gridmatch(p1, p2, p3, p4, -96, -72, 400, 312)) entities[k].tile = 26; 1353 if (gridmatch(p1, p2, p3, p4, -32, -40, 352, 264)) entities[k].tile = 27; 1354 } 1355 1356 entities[k].xp = xp; entities[k].yp = yp; 1357 entities[k].w = 32; entities[k].h = 8; 1358 1359 if (vx <= 1) vertplatforms = true; 1360 if (vx >= 2 && vx <= 5) horplatforms = true; 1361 if (vx == 14 || vx == 15) horplatforms = true; //special case for last part of Space Station 1362 if (vx >= 6 && vx <= 7) vertplatforms = true; 1363 1364 if (vx >= 10 && vx <= 11) { 1365 //Double sized threadmills 1366 entities[k].w = 64; entities[k].h = 8; 1367 vx -= 2; entities[k].size = 8; 1368 } 1369 1370 entities[k].behave = vx; entities[k].para = vy; 1371 1372 if (vx >= 8 && vx <= 9) { 1373 horplatforms = true; //threadmill! 1374 entities[k].animate = 10; 1375 if(customplatformtile>0){ 1376 entities[k].tile = customplatformtile+4; 1377 if (vx == 8) entities[k].tile += 4; 1378 if (vx == 9) entities[k].animate = 11; 1379 }else{ 1380 settreadmillcolour(k, game.roomx, game.roomy); 1381 if (vx == 8) entities[k].tile += 40; 1382 if (vx == 9) entities[k].animate = 11; 1383 } 1384 1385 }else { 1386 entities[k].animate = 100; 1387 } 1388 1389 entities[k].x1 = p1; entities[k].y1 = p2; 1390 entities[k].x2 = p3; entities[k].y2 = p4; 1391 1392 entities[k].isplatform = true; 1393 1394 createblock(0, xp, yp, 32, 8); 1395 break; 1396 case 3: //Disappearing platforms 1397 entities[k].rule = 3; entities[k].type = 2; 1398 entities[k].size = 2; 1399 entities[k].tile = 2; 1400 //appearance again depends on location 1401 if(customplatformtile>0){ 1402 entities[k].tile=customplatformtile; 1403 }else if (vx > 0) { 1404 entities[k].tile = int(vx); 1405 }else{ 1406 if(game.roomx==49 && game.roomy==52) entities[k].tile = 18; 1407 if (game.roomx == 50 && game.roomy == 52) entities[k].tile = 22; 1408 } 1409 1410 entities[k].xp = xp; entities[k].yp = yp; 1411 entities[k].cy = -1; 1412 entities[k].w = 32; entities[k].h = 10; 1413 entities[k].behave = vx; entities[k].para = vy; 1414 entities[k].onentity = 1; 1415 entities[k].animate = 100; 1416 1417 createblock(0, xp, yp, 32, 8); 1418 break; 1419 case 4: //Breakable blocks 1420 entities[k].rule = 6; entities[k].type = 3; 1421 entities[k].size = 1; 1422 entities[k].tile = 10; 1423 entities[k].xp = xp; entities[k].yp = yp; 1424 entities[k].cy = -1; 1425 entities[k].w = 8; entities[k].h = 10; 1426 entities[k].behave = vx; entities[k].para = vy; 1427 entities[k].onentity = 1; 1428 entities[k].animate = 100; 1429 1430 createblock(0, xp, yp, 8, 8); 1431 break; 1432 case 5: //Gravity Tokens 1433 entities[k].rule = 3; entities[k].type = 4; 1434 entities[k].size = 0; entities[k].tile = 11; 1435 entities[k].xp = xp; entities[k].yp = yp; 1436 entities[k].w = 16; entities[k].h = 16; 1437 entities[k].behave = vx; entities[k].para = vy; 1438 entities[k].onentity = 1; 1439 entities[k].animate = 100; 1440 break; 1441 case 6: //Decorative particles 1442 entities[k].rule = 2; entities[k].type = 5; //Particles 1443 entities[k].colour = 1; entities[k].size = 3; 1444 entities[k].xp = xp; 1445 entities[k].yp = yp; 1446 entities[k].vx = vx; 1447 entities[k].vy = vy; 1448 1449 entities[k].life = 12; 1450 break; 1451 case 7: //Decorative particles 1452 entities[k].rule = 2; entities[k].type = 5; //Particles 1453 entities[k].colour = 2; entities[k].size = 3; 1454 entities[k].xp = xp; 1455 entities[k].yp = yp; 1456 entities[k].vx = vx; 1457 entities[k].vy = vy; 1458 1459 entities[k].life = 12; 1460 break; 1461 case 8: //Small collectibles 1462 entities[k].rule = 3; entities[k].type = 6; 1463 entities[k].size = 4; entities[k].tile = 48; 1464 entities[k].xp = xp; entities[k].yp = yp; 1465 entities[k].w = 8; entities[k].h = 8; 1466 entities[k].onentity = 1; 1467 entities[k].animate = 100; 1468 1469 //Check if it's already been collected 1470 entities[k].para = vx; 1471 if (collect[vx] == 1) entities[k].active = false; 1472 break; 1473 case 9: //Something Shiny 1474 entities[k].rule = 3; entities[k].type = 7; 1475 entities[k].size = 0; entities[k].tile = 22; 1476 entities[k].xp = xp; entities[k].yp = yp; 1477 entities[k].w = 16; entities[k].h = 16; 1478 entities[k].colour = 3; 1479 entities[k].onentity = 1; 1480 entities[k].animate = 100; 1481 1482 //Check if it's already been collected 1483 entities[k].para = vx; 1484 if (collect[vx] == 1) entities[k].active = false; 1485 break; 1486 case 10: //Savepoint 1487 entities[k].rule = 3; entities[k].type = 8; 1488 entities[k].size = 0; entities[k].tile = 20 + vx; 1489 entities[k].xp = xp; entities[k].yp = yp; 1490 entities[k].w = 16; entities[k].h = 16; 1491 entities[k].colour = 4; 1492 entities[k].onentity = 1; 1493 entities[k].animate = 100; 1494 entities[k].para = vy; 1495 1496 if (game.savepoint == vy) { 1497 entities[k].colour = 5; 1498 entities[k].onentity = 0; 1499 } 1500 1501 if (game.nodeathmode) { 1502 entities[k].active = false; 1503 } 1504 break; 1505 case 11: //Horizontal Gravity Line 1506 entities[k].rule = 4; entities[k].type = 9; 1507 entities[k].size = 5; entities[k].life = 0; 1508 entities[k].xp = xp; entities[k].yp = yp; 1509 entities[k].w = vx; entities[k].h = 1; 1510 entities[k].onentity = 1; 1511 break; 1512 case 12: //Vertical Gravity Line 1513 entities[k].rule = 5; entities[k].type = 10; 1514 entities[k].size = 6; entities[k].life = 0; 1515 entities[k].xp = xp; entities[k].yp = yp; 1516 entities[k].w = 1; entities[k].h = vx; 1517 //entities[k].colour = 0; 1518 entities[k].onentity = 1; 1519 break; 1520 case 13: //Warp token 1521 entities[k].rule = 3; entities[k].type = 11; 1522 entities[k].size = 0; entities[k].tile = 18; 1523 entities[k].xp = xp; entities[k].yp = yp; 1524 entities[k].w = 16; entities[k].h = 16; 1525 entities[k].colour = 10; 1526 entities[k].onentity = 1; 1527 entities[k].animate = 2; 1528 1529 //Added in port, hope it doesn't break anything 1530 entities[k].behave = vx; 1531 entities[k].para = vy; 1532 break; 1533 case 14: // Teleporter 1534 entities[k].rule = 3; entities[k].type = 100; 1535 entities[k].size = 7; entities[k].tile = 1; //inactive 1536 entities[k].xp = xp; entities[k].yp = yp; 1537 entities[k].w = 96; entities[k].h = 96; 1538 entities[k].colour = 100; 1539 entities[k].onentity = 1; 1540 entities[k].animate = 100; 1541 entities[k].para = vy; 1542 1543 //we'll init it's activeness here later 1544 /*if (game.savepoint == vy) { 1545 entities[k].colour = 5; 1546 entities[k].onentity = 0; 1547 }*/ 1548 break; 1549 case 15: // Crew Member (warp zone) 1550 entities[k].rule = 6; entities[k].type = 12; //A special case! 1551 entities[k].tile = 144; entities[k].colour = 13; //144 for sad :( 1552 entities[k].xp = xp; entities[k].yp = yp; 1553 entities[k].cx = 6; entities[k].cy = 2; 1554 entities[k].w = 12; entities[k].h = 21; 1555 entities[k].dir = 0; 1556 1557 entities[k].state = vx; 1558 1559 entities[k].gravity = true; 1560 break; 1561 case 16: // Crew Member, upside down (space station) 1562 entities[k].rule = 7; entities[k].type = 12; //A special case! 1563 entities[k].tile = 144+6; entities[k].colour = 14; //144 for sad (upside down+12):( 1564 entities[k].xp = xp; entities[k].yp = yp; 1565 entities[k].cx = 6; entities[k].cy = 2; 1566 entities[k].w = 12; entities[k].h = 21; 1567 entities[k].dir = 1; 1568 1569 entities[k].state = vx; 1570 1571 entities[k].gravity = true; 1572 break; 1573 case 17: // Crew Member (Lab) 1574 entities[k].rule = 6; entities[k].type = 12; //A special case! 1575 entities[k].tile = 144; entities[k].colour = 16; //144 for sad :( 1576 entities[k].xp = xp; entities[k].yp = yp; 1577 entities[k].cx = 6; entities[k].cy = 2; 1578 entities[k].w = 12; entities[k].h = 21; 1579 entities[k].dir = 1; 1580 1581 entities[k].state = vx; 1582 1583 entities[k].gravity = true; 1584 break; 1585 case 18: // Crew Member (Ship) 1586 //This is the scriping crewmember 1587 entities[k].rule = 6; entities[k].type = 12; //A special case! 1588 entities[k].colour = vx; 1589 if (vy == 0) { 1590 entities[k].tile = 0; 1591 }else { 1592 entities[k].tile = 144; 1593 } 1594 entities[k].xp = xp; entities[k].yp = yp; 1595 entities[k].cx = 6; entities[k].cy = 2; 1596 entities[k].w = 12; entities[k].h = 21; 1597 entities[k].dir = 0; 1598 1599 entities[k].state = p1; 1600 entities[k].para = p2; 1601 1602 if (p1 == 17) { 1603 entities[k].dir = p2; 1604 } 1605 1606 entities[k].gravity = true; 1607 break; 1608 case 19: // Crew Member (Ship) More tests! 1609 entities[k].rule = 6; entities[k].type = 12; //A special case! 1610 entities[k].tile = 0; entities[k].colour = 6; //54 for sad :( 1611 entities[k].xp = xp; entities[k].yp = yp; 1612 entities[k].cx = 6; entities[k].cy = 2; 1613 entities[k].w = 12; entities[k].h = 21; 1614 entities[k].dir = 1; 1615 1616 entities[k].state = vx; 1617 1618 entities[k].gravity = true; 1619 break; 1620 case 20: //Terminal 1621 entities[k].rule = 3; entities[k].type = 13; 1622 entities[k].size = 0; entities[k].tile = 16 + vx; 1623 entities[k].xp = xp; entities[k].yp = yp; 1624 entities[k].w = 16; entities[k].h = 16; 1625 entities[k].colour = 4; 1626 entities[k].onentity = 1; 1627 entities[k].animate = 100; 1628 entities[k].para = vy; 1629 1630 /*if (game.savepoint == vy) { 1631 entities[k].colour = 5; 1632 entities[k].onentity = 0; 1633 }*/ 1634 break; 1635 case 21: //as above, except doesn't highlight 1636 entities[k].rule = 3; entities[k].type = 13; 1637 entities[k].size = 0; entities[k].tile = 16 + vx; 1638 entities[k].xp = xp; entities[k].yp = yp; 1639 entities[k].w = 16; entities[k].h = 16; 1640 entities[k].colour = 4; 1641 entities[k].onentity = 0; 1642 entities[k].animate = 100; 1643 entities[k].para = vy; 1644 1645 /*if (game.savepoint == vy) { 1646 entities[k].colour = 5; 1647 entities[k].onentity = 0; 1648 }*/ 1649 break; 1650 case 22: //Fake trinkets, only appear if you've collected them 1651 entities[k].rule = 3; entities[k].type = 7; 1652 entities[k].size = 0; entities[k].tile = 22; 1653 entities[k].xp = xp; entities[k].yp = yp; 1654 entities[k].w = 16; entities[k].h = 16; 1655 entities[k].colour = 3; 1656 entities[k].onentity = 0; 1657 entities[k].animate = 100; 1658 1659 //Check if it's already been collected 1660 entities[k].para = vx; 1661 if (collect[vx] == 0) entities[k].active = false; 1662 break; 1663 case 23: //SWN Enemies 1664 //Given a different behavior, these enemies are especially for SWN mode and disappear outside the screen. 1665 entities[k].rule = 1; entities[k].type = 23; 1666 entities[k].xp = xp; entities[k].yp = yp; 1667 entities[k].behave = vx; entities[k].para = vy; 1668 entities[k].w = 16; entities[k].h = 16; 1669 entities[k].cx = 0; entities[k].cy = 0; 1670 1671 entities[k].x1 = -2000; entities[k].y1 = -100; 1672 entities[k].x2 = 5200; entities[k].y2 = 340; 1673 1674 entities[k].harmful = true; 1675 1676 //initilise tiles here based on behavior 1677 entities[k].size = 12; //don't wrap around 1678 entities[k].colour = 21; 1679 entities[k].tile = 78; //default case 1680 entities[k].animate = 1; 1681 if (game.swngame == 1) { 1682 //set colour based on current state 1683 entities[k].colour = swncolour(game.swncolstate); 1684 } 1685 break; 1686 case 24: // Super Crew Member 1687 //This special crewmember is way more advanced than the usual kind, and can interact with game objects 1688 entities[k].rule = 6; entities[k].type = 14; //A special case! 1689 entities[k].colour = vx; 1690 if(vx==16){ 1691 //victoria is sad! 1692 if (vy == 2) vy = 1; 1693 }else { 1694 if (vy == 2) vy = 0; 1695 } 1696 if (vy == 0) { 1697 entities[k].tile = 0; 1698 }else { 1699 entities[k].tile = 144; 1700 } 1701 entities[k].xp = xp; entities[k].yp = yp; 1702 entities[k].cx = 6; entities[k].cy = 2; 1703 entities[k].w = 12; entities[k].h = 21; 1704 entities[k].dir = 1; 1705 1706 entities[k].x1 = -2000; entities[k].y1 = -100; 1707 entities[k].x2 = 5200; entities[k].y2 = 340; 1708 1709 entities[k].state = p1; 1710 entities[k].para = p2; 1711 1712 if (p1 == 17) { 1713 entities[k].dir = p2; 1714 } 1715 1716 entities[k].gravity = true; 1717 break; 1718 case 25: //Trophies 1719 entities[k].rule = 3; entities[k].type = 15; 1720 entities[k].size = 0; 1721 entities[k].xp = xp; entities[k].yp = yp; 1722 entities[k].w = 16; entities[k].h = 16; 1723 entities[k].colour = 4; 1724 entities[k].onentity = 1; 1725 entities[k].animate = 100; 1726 entities[k].para = vy; 1727 1728 //Decide tile here based on given achievement: both whether you have them and what they are 1729 //default is just a trophy base: 1730 entities[k].tile = 180 + vx; 1731 switch(vy) { 1732 case 1: if(game.bestrank[0]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 31;} break; 1733 case 2: if(game.bestrank[1]>=3) { entities[k].tile = 186 + vx; entities[k].colour = 35;} break; 1734 case 3: if(game.bestrank[2]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 33;} break; 1735 case 4: if(game.bestrank[3]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 32;} break; 1736 case 5: if(game.bestrank[4]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 34;} break; 1737 case 6: if(game.bestrank[5]>=3) { entities[k].tile = 184 + vx; entities[k].colour = 30;} break; 1738 1739 case 7: 1740 if(game.unlock[5]){ 1741 entities[k].tile = 188 + vx; 1742 entities[k].colour = 37; 1743 entities[k].h += 3; 1744 } 1745 break; 1746 case 8: 1747 if(game.unlock[19]){ 1748 entities[k].tile = 188 + vx; 1749 entities[k].colour = 37; 1750 entities[k].h += 3; 1751 } 1752 break; 1753 1754 case 9: 1755 if (game.bestgamedeaths > -1) { 1756 if (game.bestgamedeaths <= 50) { 1757 entities[k].tile = 182 + vx; entities[k].colour = 40; 1758 } 1759 } 1760 break; 1761 case 10: 1762 if (game.bestgamedeaths > -1) { 1763 if (game.bestgamedeaths <= 100) { 1764 entities[k].tile = 182 + vx; entities[k].colour = 36; 1765 } 1766 } 1767 break; 1768 case 11: 1769 if (game.bestgamedeaths > -1) { 1770 if (game.bestgamedeaths <= 250) { 1771 entities[k].tile = 182 + vx; entities[k].colour = 38; 1772 } 1773 } 1774 break; 1775 case 12: 1776 if (game.bestgamedeaths > -1) { 1777 if (game.bestgamedeaths <= 500) { 1778 entities[k].tile = 182 + vx; entities[k].colour = 39; 1779 } 1780 } 1781 break; 1782 1783 case 13: if(game.swnbestrank>=1) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; 1784 case 14: if(game.swnbestrank>=2) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; 1785 case 15: if(game.swnbestrank>=3) { entities[k].tile = 182 + vx; entities[k].colour = 39;} break; 1786 case 16: if(game.swnbestrank>=4) { entities[k].tile = 182 + vx; entities[k].colour = 38;} break; 1787 case 17: if(game.swnbestrank>=5) { entities[k].tile = 182 + vx; entities[k].colour = 36;} break; 1788 case 18: if(game.swnbestrank>=6) { entities[k].tile = 182 + vx; entities[k].colour = 40;} break; 1789 1790 case 19: 1791 if(game.unlock[20]){ 1792 entities[k].tile = 3; entities[k].colour = 102; 1793 entities[k].size = 13; 1794 entities[k].xp -= 64; entities[k].yp -= 128; 1795 } 1796 break; 1797 1798 } 1799 1800 break; 1801 case 26: //Epilogue super warp token 1802 entities[k].rule = 3; entities[k].type = 11; 1803 entities[k].size = 0; entities[k].tile = 18; 1804 entities[k].xp = xp; entities[k].yp = yp; 1805 entities[k].w = 16; entities[k].h = 16; 1806 entities[k].colour = 3; 1807 entities[k].onentity = 0; 1808 entities[k].animate = 100; 1809 entities[k].para = vy; 1810 entities[k].size = 13; 1811 break; 1812 case 51: //Vertical Warp Line 1813 entities[k].rule = 5; 1814 entities[k].type = 51; 1815 entities[k].size = 6; 1816 entities[k].life = 0; 1817 entities[k].xp = xp; 1818 entities[k].yp = yp; 1819 entities[k].w = 1; 1820 entities[k].h = vx; 1821 //entities[k].colour = 0; 1822 entities[k].onentity = 1; 1823 entities[k].invis=true; 1824 break; 1825 case 52: //Vertical Warp Line 1826 entities[k].rule = 5; 1827 entities[k].type = 52; 1828 entities[k].size = 6; 1829 entities[k].life = 0; 1830 entities[k].xp = xp; 1831 entities[k].yp = yp; 1832 entities[k].w = 1; 1833 entities[k].h = vx; 1834 //entities[k].colour = 0; 1835 entities[k].onentity = 1; 1836 entities[k].invis=true; 1837 break; 1838 case 53: //Horizontal Warp Line 1839 entities[k].rule = 7; 1840 entities[k].type = 53; 1841 entities[k].size = 5; 1842 entities[k].life = 0; 1843 entities[k].xp = xp; 1844 entities[k].yp = yp; 1845 entities[k].w = vx; 1846 entities[k].h = 1; 1847 entities[k].onentity = 1; 1848 entities[k].invis=true; 1849 break; 1850 case 54: //Horizontal Warp Line 1851 entities[k].rule = 7; 1852 entities[k].type = 54; 1853 entities[k].size = 5; 1854 entities[k].life = 0; 1855 entities[k].xp = xp; 1856 entities[k].yp = yp; 1857 entities[k].w = vx; 1858 entities[k].h = 1; 1859 entities[k].onentity = 1; 1860 entities[k].invis=true; 1861 break; 1862 case 55: // Crew Member (custom, collectable) 1863 //1 - position in array 1864 //2 - colour 1865 entities[k].rule = 3; 1866 entities[k].type = 55; 1867 if(customcrewmoods[int(vy)]==1){ 1868 entities[k].tile = 144; 1869 }else{ 1870 entities[k].tile = 0; 1871 } 1872 entities[k].colour = crewcolour(int(vy)); 1873 entities[k].xp = xp; 1874 entities[k].yp = yp; 1875 entities[k].cx = 6; 1876 entities[k].cy = 2; 1877 entities[k].w = 12; 1878 entities[k].h = 21; 1879 entities[k].dir = 0; 1880 1881 entities[k].state = 0; 1882 entities[k].onentity = 1; 1883 //entities[k].state = vx; 1884 1885 entities[k].gravity = true; 1886 1887 //Check if it's already been collected 1888 entities[k].para = vx; 1889 if (customcollect[vx] == 1) entities[k].active = false; 1890 break; 1891 case 56: //Custom enemy 1892 entities[k].rule = 1; 1893 entities[k].type = 1; 1894 entities[k].xp = xp; 1895 entities[k].yp = yp; 1896 entities[k].behave = vx; 1897 entities[k].para = vy; 1898 entities[k].w = 16; 1899 entities[k].h = 16; 1900 entities[k].cx = 0; 1901 entities[k].cy = 0; 1902 1903 entities[k].x1 = p1; 1904 entities[k].y1 = p2; 1905 entities[k].x2 = p3; 1906 entities[k].y2 = p4; 1907 1908 entities[k].harmful = true; 1909 1910 switch(customenemy){ 1911 case 0: setenemyroom(k, 4+100, 0+100); break; 1912 case 1: setenemyroom(k, 2+100, 0+100); break; 1913 case 2: setenemyroom(k, 12+100, 3+100); break; 1914 case 3: setenemyroom(k, 13+100, 12+100); break; 1915 case 4: setenemyroom(k, 16+100, 9+100); break; 1916 case 5: setenemyroom(k, 19+100, 1+100); break; 1917 case 6: setenemyroom(k, 19+100, 2+100); break; 1918 case 7: setenemyroom(k, 18+100, 3+100); break; 1919 case 8: setenemyroom(k, 16+100, 0+100); break; 1920 case 9: setenemyroom(k, 14+100, 2+100); break; 1921 default: setenemyroom(k, 4+100, 0+100); break; 1922 } 1923 1924 //Set colour based on room tile 1925 //Set custom colours 1926 if(customplatformtile>0){ 1927 var entcol:int = (customplatformtile / 12); 1928 switch(entcol){ 1929 //RED 1930 case 3: case 7: case 12: case 23: case 28: 1931 case 34: case 42: case 48: case 58: 1932 entities[k].colour = 6; break; 1933 //GREEN 1934 case 5: case 9: case 22: case 25: case 29: 1935 case 31: case 38: case 46: case 52: case 53: 1936 entities[k].colour = 7; break; 1937 //BLUE 1938 case 1: case 6: case 14: case 27: case 33: 1939 case 44: case 50: case 57: 1940 entities[k].colour = 12; break; 1941 //YELLOW 1942 case 4: case 17: case 24: case 30: case 37: 1943 case 45: case 51: case 55: 1944 entities[k].colour = 9; break; 1945 //PURPLE 1946 case 2: case 11: case 15: case 19: case 32: 1947 case 36: case 49: 1948 entities[k].colour = 20; break; 1949 //CYAN 1950 case 8: case 10: case 13: case 18: case 26: 1951 case 35: case 41: case 47: case 54: 1952 entities[k].colour = 11; break; 1953 //PINK 1954 case 16: case 20: case 39: case 43: case 56: 1955 entities[k].colour = 8; break; 1956 //ORANGE 1957 case 21: case 40: 1958 entities[k].colour = 17; break; 1959 default: 1960 entities[k].colour = 6; 1961 break; 1962 } 1963 } 1964 break; 1965 } 1966 } 1967 1968 public function updateentities(i:int, help:helpclass, game:gameclass, music:musicclass):Boolean { 1969 if(entities[i].active){ 1970 if(entities[i].statedelay<=0){ 1971 switch(entities[i].type) { 1972 case 0: //Player 1973 if (entities[i].state == 0) { 1974 } 1975 break; 1976 case 1: //Movement behaviors 1977 //Enemies can have a number of different behaviors: 1978 switch(entities[i].behave) { 1979 case 0: //Bounce, Start moving down 1980 if (entities[i].state == 0) { //Init 1981 entities[i].state = 3; updateentities(i, help, game, music); 1982 }else if (entities[i].state == 1) { 1983 if (entities[i].outside()) entities[i].state = entities[i].onwall; 1984 }else if (entities[i].state == 2) { 1985 entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 1986 }else if (entities[i].state == 3) { 1987 entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 1988 break; 1989 case 1: //Bounce, Start moving up 1990 if (entities[i].state == 0) { //Init 1991 entities[i].state = 2; updateentities(i, help, game, music); 1992 }else if (entities[i].state == 1) { 1993 if (entities[i].outside()) entities[i].state = entities[i].onwall; 1994 }else if (entities[i].state == 2) { 1995 entities[i].vy = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 1996 }else if (entities[i].state == 3) { 1997 entities[i].vy = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 1998 break; 1999 case 2: //Bounce, Start moving left 2000 if (entities[i].state == 0) { //Init 2001 entities[i].state = 3; updateentities(i, help, game, music); 2002 }else if (entities[i].state == 1) { 2003 if (entities[i].outside()) entities[i].state = entities[i].onwall; 2004 }else if (entities[i].state == 2) { 2005 entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 2006 }else if (entities[i].state == 3) { 2007 entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 2008 break; 2009 case 3: //Bounce, Start moving right 2010 if (entities[i].state == 0) { //Init 2011 entities[i].state = 3; updateentities(i, help, game, music); 2012 }else if (entities[i].state == 1) { 2013 if (entities[i].outside()) entities[i].state = entities[i].onwall; 2014 }else if (entities[i].state == 2) { 2015 entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 2016 }else if (entities[i].state == 3) { 2017 entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 2018 break; 2019 case 4: //Always move left 2020 if (entities[i].state == 0) { //Init 2021 entities[i].vx = entities[i].para; 2022 } 2023 break; 2024 case 5: //Always move right 2025 if (entities[i].state == 0) { //Init 2026 entities[i].vx = entities[i].para; 2027 entities[i].state = 1 2028 entities[i].onwall = 2; 2029 }else if (entities[i].state == 2) { 2030 entities[i].vx = 0; entities[i].onwall = 0; 2031 entities[i].xp -= entities[i].para; 2032 entities[i].statedelay=8; entities[i].state=0; 2033 } 2034 break; 2035 case 6: //Always move up 2036 if (entities[i].state == 0) { //Init 2037 entities[i].vy = entities[i].para; 2038 entities[i].state = 1; 2039 entities[i].onwall = 2; 2040 }else if (entities[i].state == 2) { 2041 entities[i].vy = -entities[i].para; entities[i].onwall = 0; 2042 entities[i].yp -= entities[i].para; 2043 entities[i].statedelay=8; entities[i].state=0; 2044 } 2045 break; 2046 case 7: //Always move down 2047 if (entities[i].state == 0) { //Init 2048 entities[i].vx = entities[i].para; 2049 } 2050 break; 2051 case 8: case 9: 2052 //Threadmill: don't move, just impart velocity 2053 if (entities[i].state == 0) { //Init 2054 entities[i].vx = 0; 2055 entities[i].state = 1; 2056 entities[i].onwall = 0; 2057 } 2058 break; 2059 case 10: 2060 //Emitter: shoot an enemy every so often 2061 if (entities[i].state == 0) { 2062 createentity(game, entities[i].xp+28, entities[i].yp, 1, 10, 1); 2063 entities[i].state = 1; entities[i].statedelay = 12; 2064 }else if (entities[i].state == 1) { 2065 entities[i].state = 0; 2066 } 2067 break; 2068 case 11: //Always move right, destroy when outside screen 2069 if (entities[i].state == 0) { //Init 2070 entities[i].vx = entities[i].para; 2071 entities[i].state = 1 2072 }else if (entities[i].state == 1) { 2073 if (entities[i].xp >= 335) entities[i].active = false; 2074 if (game.roomx == 117) { 2075 if (entities[i].xp >= (33*8)-32) entities[i].active = false; 2076 //collector for LIES 2077 } 2078 } 2079 break; 2080 case 12: 2081 //Emitter: shoot an enemy every so often (up) 2082 if (entities[i].state == 0) { 2083 createentity(game, entities[i].xp, entities[i].yp, 1, 12, 1); 2084 entities[i].state = 1; entities[i].statedelay = 16; 2085 }else if (entities[i].state == 1) { 2086 entities[i].state = 0; 2087 } 2088 break; 2089 case 13: //Always move up, destroy when outside screen 2090 if (entities[i].state == 0) { //Init 2091 entities[i].vy = entities[i].para; 2092 entities[i].state = 1 2093 }else if (entities[i].state == 1) { 2094 if (entities[i].yp <= -60) entities[i].active = false; 2095 if (game.roomy == 108) { 2096 if (entities[i].yp <= 60) entities[i].active = false; 2097 //collector for factory 2098 } 2099 } 2100 break; 2101 case 14: //Very special hack: as two, but doesn't move in specific circumstances 2102 if (entities[i].state == 0) { //Init 2103 for (j = 0; j < nentity; j++) { 2104 if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp-32) { 2105 entities[i].state = 3; updateentities(i, help, game, music); 2106 } 2107 } 2108 }else if (entities[i].state == 1) { 2109 if (entities[i].outside()) entities[i].state = entities[i].onwall; 2110 }else if (entities[i].state == 2) { 2111 entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 2112 }else if (entities[i].state == 3) { 2113 entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 2114 break; 2115 case 15: //As above, but for 3! 2116 if (entities[i].state == 0) { //Init 2117 for (j = 0; j < nentity; j++) { 2118 if (entities[j].type == 2 && entities[j].state==3 && entities[j].xp==entities[i].xp+32) { 2119 entities[i].state = 3; updateentities(i, help, game, music); 2120 } 2121 } 2122 }else if (entities[i].state == 1) { 2123 if (entities[i].outside()) entities[i].state = entities[i].onwall; 2124 }else if (entities[i].state == 2) { 2125 entities[i].vx = -entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 2126 }else if (entities[i].state == 3) { 2127 entities[i].vx = entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 2128 break; 2129 case 16: //MAVERICK BUS FOLLOWS HIS OWN RULES 2130 if (entities[i].state == 0) { //Init 2131 //first, y position 2132 if (entities[getplayer()].yp > 14 * 8) { 2133 entities[i].tile = 120; 2134 entities[i].yp = (28*8)-62; 2135 }else { 2136 entities[i].tile = 96; 2137 entities[i].yp = 24; 2138 } 2139 //now, x position 2140 if (entities[getplayer()].xp > 20 * 8) { 2141 //approach from the left 2142 entities[i].xp = -64; 2143 entities[i].state = 2; updateentities(i, help, game, music); //right 2144 }else { 2145 //approach from the left 2146 entities[i].xp = 320; 2147 entities[i].state = 3; updateentities(i, help, game, music); //left 2148 } 2149 2150 }else if (entities[i].state == 1) { 2151 if (entities[i].outside()) entities[i].state = entities[i].onwall; 2152 }else if (entities[i].state == 2) { 2153 entities[i].vx = entities[i].para; entities[i].onwall = 3; entities[i].state = 1; 2154 }else if (entities[i].state == 3) { 2155 entities[i].vx = -entities[i].para; entities[i].onwall = 2; entities[i].state = 1; } 2156 break; 2157 case 17: //Special for ASCII Snake (left) 2158 if (entities[i].state == 0) { //Init 2159 entities[i].statedelay = 6; entities[i].xp -= entities[i].para; 2160 } 2161 break; 2162 case 18: //Special for ASCII Snake (right) 2163 if (entities[i].state == 0) { //Init 2164 entities[i].statedelay = 6; entities[i].xp += entities[i].para; 2165 } 2166 break; 2167 } 2168 break; 2169 case 2: //Disappearing platforms 2170 //wait for collision 2171 if (entities[i].state == 1) { 2172 entities[i].life = 12; 2173 entities[i].state = 2; entities[i].onentity = 0; 2174 2175 music.playef(7,10); 2176 }else if (entities[i].state == 2) { 2177 entities[i].life--; 2178 if (entities[i].life % 3 == 0) entities[i].tile++; 2179 if (entities[i].life <= 0) { 2180 removeblockat(entities[i].xp, entities[i].yp); 2181 entities[i].state = 3;// = false; 2182 entities[i].invis = true; 2183 } 2184 }else if (entities[i].state == 3) { 2185 //wait until recharged! 2186 }else if (entities[i].state == 4) { 2187 //restart! 2188 createblock(0, entities[i].xp, entities[i].yp, 32, 8); 2189 entities[i].state = 4; 2190 entities[i].invis = false; 2191 entities[i].tile--; 2192 entities[i].state++; entities[i].onentity = 1; 2193 }else if (entities[i].state == 5) { 2194 entities[i].life+=3; 2195 if (entities[i].life % 3 == 0) entities[i].tile--; 2196 if (entities[i].life >= 12) { 2197 entities[i].life = 12; 2198 entities[i].state = 0; 2199 entities[i].tile++; 2200 } 2201 } 2202 break; 2203 case 3: //Breakable blocks 2204 //Only counts if vy of player entity is non zero 2205 if (entities[i].state == 1) { 2206 j = getplayer(); 2207 //if (entities[j].vy > 0.5 && (entities[j].yp+entities[j].h<=entities[i].yp+6)) { 2208 entities[i].life = 4; 2209 entities[i].state = 2; entities[i].onentity = 0; 2210 music.playef(6,10); 2211 /*}else if (entities[j].vy <= -0.5 && (entities[j].yp>=entities[i].yp+2)) { 2212 entities[i].life = 4; 2213 entities[i].state = 2; entities[i].onentity = 0; 2214 }else { 2215 entities[i].state = 0; 2216 }*/ 2217 }else if (entities[i].state == 2) { 2218 entities[i].life--; 2219 entities[i].tile++; 2220 if (entities[i].life <= 0) { 2221 removeblockat(entities[i].xp, entities[i].yp); 2222 entities[i].active = false; 2223 } 2224 } 2225 break; 2226 case 4: //Gravity token 2227 //wait for collision 2228 if (entities[i].state == 1) { 2229 entities[i].active = false; 2230 game.gravitycontrol = (game.gravitycontrol + 1) % 2; 2231 2232 } 2233 break; 2234 case 5: //Particle sprays 2235 if (entities[i].state == 0) { 2236 entities[i].life--; 2237 if (entities[i].life < 0) entities[i].active = false; 2238 } 2239 break; 2240 case 6: //Small pickup 2241 //wait for collision 2242 if (entities[i].state == 1) { 2243 game.coins++; 2244 music.playef(4,10); 2245 collect[entities[i].para] = 1; 2246 2247 entities[i].active = false; 2248 } 2249 break; 2250 case 7: //Found a trinket 2251 //wait for collision 2252 if (entities[i].state == 1) { 2253 game.trinkets++; 2254 if (game.intimetrial) { 2255 collect[entities[i].para] = 1; 2256 music.playef(25,10); 2257 }else{ 2258 game.state = 1000; 2259 //music.haltdasmusik(); 2260 music.silencedasmusik(); 2261 music.playef(3,10); 2262 collect[entities[i].para] = 1; 2263 if (game.trinkets > game.stat_trinkets) { 2264 game.stat_trinkets = game.trinkets; 2265 } 2266 } 2267 2268 entities[i].active = false; 2269 } 2270 break; 2271 case 8: //Savepoints 2272 //wait for collision 2273 if (entities[i].state == 1) { 2274 //First, deactivate all other savepoints 2275 for (j = 0; j < nentity; j++) { 2276 if (entities[j].type == 8 && entities[j].active) { 2277 entities[j].colour = 4; entities[j].onentity = 1; 2278 } 2279 } 2280 entities[i].colour = 5; 2281 entities[i].onentity = 0; 2282 game.savepoint = entities[i].para; 2283 music.playef(5,10); 2284 2285 game.savex = entities[i].xp - 4; 2286 2287 if (entities[i].tile == 20) { 2288 game.savey = entities[i].yp - 1; 2289 game.savegc = 1; 2290 }else if (entities[i].tile == 21) { 2291 game.savey = entities[i].yp-8; 2292 game.savegc = 0; 2293 } 2294 2295 game.saverx = game.roomx; game.savery = game.roomy; 2296 game.savedir = entities[getplayer()].dir; 2297 entities[i].state = 0; 2298 2299 if(!game.mobilequicksave_thisroom){ 2300 game.autoquicksave = true; 2301 game.mobilequicksave_thisroom = true; 2302 } 2303 } 2304 break; 2305 case 9: //Gravity Lines 2306 if (entities[i].state == 1) { 2307 entities[i].life--; 2308 entities[i].onentity = 0; 2309 2310 if (entities[i].life <= 0) { 2311 entities[i].state = 0; 2312 entities[i].onentity = 1; 2313 } 2314 } 2315 break; 2316 case 10: //Vertical gravity Lines 2317 if (entities[i].state == 1) { 2318 entities[i].onentity = 3; 2319 entities[i].state = 2; 2320 2321 2322 music.playef(8,10); 2323 game.gravitycontrol = (game.gravitycontrol + 1) % 2; 2324 game.totalflips++; 2325 temp = getplayer(); 2326 if (game.gravitycontrol == 0) { 2327 if (entities[temp].vy < 3) entities[temp].vy = 3; 2328 }else { 2329 if (entities[temp].vy > -3) entities[temp].vy = -3; 2330 } 2331 }else if (entities[i].state == 2) { 2332 entities[i].life--; 2333 if (entities[i].life <= 0) { 2334 entities[i].state = 0; 2335 entities[i].onentity = 1; 2336 } 2337 }else if (entities[i].state == 3) { 2338 entities[i].state = 2; entities[i].life = 4; 2339 entities[i].onentity = 3; 2340 }else if (entities[i].state == 4) { 2341 //Special case for room initilisations: As state one, except without the reversal 2342 entities[i].onentity = 3; 2343 entities[i].state = 2; 2344 } 2345 break; 2346 case 11: //Warp point 2347 //wait for collision 2348 if (entities[i].state == 1) { 2349 //Depending on the room the warp point is in, teleport to a new location! 2350 entities[i].onentity = 0; 2351 //play a sound or somefink 2352 music.playef(10); 2353 game.teleport = true; 2354 2355 game.edteleportent = i; 2356 //for the multiple room: 2357 if (int(entities[i].xp) == 12*8) game.teleportxpos = 1; 2358 if (int(entities[i].xp) == 5*8) game.teleportxpos = 2; 2359 if (int(entities[i].xp) == 28*8) game.teleportxpos = 3; 2360 if (int(entities[i].xp) == 21*8) game.teleportxpos = 4; 2361 } 2362 break; 2363 case 12: //Crew member 2364 //Somewhat complex AI: exactly what they do depends on room, location, state etc 2365 //At state 0, do nothing at all. 2366 if (entities[i].state == 1) { 2367 //happy! 2368 if (entities[k].rule == 6) entities[k].tile = 0; 2369 if (entities[k].rule == 7) entities[k].tile = 6; 2370 //Stay close to the hero! 2371 j = getplayer(); 2372 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2373 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2374 2375 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2376 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2377 2378 //Special rules: 2379 if (game.roomx == 110 && game.roomy == 105) { 2380 if (entities[i].xp < 155) { if (entities[i].ax < 0) entities[i].ax = 0; } 2381 } 2382 }else if (entities[i].state == 2) { 2383 //Basic rules, don't change expression 2384 j = getplayer(); 2385 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2386 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2387 2388 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2389 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2390 }else if (entities[i].state == 10) { 2391 //Everything from 10 on is for cutscenes 2392 //Basic rules, don't change expression 2393 j = getplayer(); 2394 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2395 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2396 2397 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2398 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2399 }else if (entities[i].state == 11) { 2400 //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) 2401 j=getcrewman(1); //purple 2402 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2403 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2404 2405 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2406 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2407 }else if (entities[i].state == 12) { 2408 //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) 2409 j=getcrewman(2); //yellow 2410 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2411 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2412 2413 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2414 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2415 }else if (entities[i].state == 13) { 2416 //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) 2417 j=getcrewman(3); //red 2418 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2419 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2420 2421 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2422 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2423 }else if (entities[i].state == 14) { 2424 //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) 2425 j=getcrewman(4); //green 2426 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2427 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2428 2429 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2430 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2431 }else if (entities[i].state == 15) { 2432 //11-15 means to follow a specific character, in crew order (cyan, purple, yellow, red, green, blue) 2433 j=getcrewman(5); //blue 2434 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2435 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2436 2437 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2438 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2439 }else if (entities[i].state == 16) { 2440 //Follow a position: given an x coordinate, seek it out. 2441 if (entities[i].para > entities[i].xp + 5) { entities[i].dir = 1; 2442 }else if (entities[i].para < entities[i].xp - 5) { entities[i].dir = 0; } 2443 2444 if (entities[i].para > entities[i].xp + 45) { entities[i].ax = 3; 2445 }else if (entities[i].para < entities[i].xp - 45) { entities[i].ax = -3; } 2446 }else if (entities[i].state == 17) { 2447 //stand still 2448 }else if (entities[i].state == 18) { 2449 //Stand still and face the player 2450 j = getplayer(); 2451 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2452 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2453 }else if (entities[i].state == 19) { 2454 //Walk right off the screen after time t 2455 if (entities[i].para <= 0) { 2456 entities[i].dir = 1; 2457 entities[i].ax = 3; 2458 }else { 2459 entities[i].para--; 2460 } 2461 }else if (entities[i].state == 20) { 2462 //Panic! For briefing script 2463 if (entities[i].life == 0) { 2464 //walk left for a bit 2465 entities[i].ax = 0; 2466 if (40 > entities[i].xp + 5) { entities[i].dir = 1; 2467 }else if (40 < entities[i].xp - 5) { entities[i].dir = 0; } 2468 2469 if (40 > entities[i].xp + 45) { entities[i].ax = 3; 2470 }else if (40 < entities[i].xp - 45) { entities[i].ax = -3; } 2471 if (entities[i].ax == 0) { entities[i].life = 1; entities[i].para = 30;} 2472 }else if (entities[i].life == 1) { 2473 //Stand around for a bit 2474 entities[i].para--; 2475 if (entities[i].para <= 0) { 2476 entities[i].life++; 2477 } 2478 }else if (entities[i].life == 2) { 2479 //walk right for a bit 2480 entities[i].ax = 0; 2481 if (280 > entities[i].xp + 5) { entities[i].dir = 1; 2482 }else if (280 < entities[i].xp - 5) { entities[i].dir = 0; } 2483 2484 if (280 > entities[i].xp + 45) { entities[i].ax = 3; 2485 }else if (280 < entities[i].xp - 45) { entities[i].ax = -3; } 2486 if (entities[i].ax == 0) { entities[i].life = 3; entities[i].para = 30;} 2487 }else if (entities[i].life == 3) { 2488 //Stand around for a bit 2489 entities[i].para--; 2490 if (entities[i].para <= 0) { 2491 entities[i].life=0; 2492 } 2493 } 2494 } 2495 break; 2496 case 13: //Terminals (very similar to savepoints) 2497 //wait for collision 2498 if (entities[i].state == 1) { 2499 entities[i].colour = 5; 2500 entities[i].onentity = 0; 2501 music.playef(17,10); 2502 2503 entities[i].state = 0; 2504 } 2505 break; 2506 case 14: //Super Crew member 2507 //Actually needs less complex AI than the scripting crewmember 2508 if (entities[i].state == 0) { 2509 //follow player, but only if he's on the floor! 2510 j = getplayer(); 2511 if(entities[j].onground>0){ 2512 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2513 }else if (entities[j].xp>15 && entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2514 2515 if (entities[j].xp > entities[i].xp + 45) { entities[i].ax = 3; 2516 }else if (entities[j].xp < entities[i].xp - 45) { entities[i].ax = -3; } 2517 if (entities[i].ax < 0 && entities[i].xp < 60) { 2518 entities[i].ax = 0; 2519 } 2520 }else { 2521 if (entities[j].xp > entities[i].xp + 5) { entities[i].dir = 1; 2522 }else if (entities[j].xp < entities[i].xp - 5) { entities[i].dir = 0; } 2523 2524 entities[i].ax = 0; 2525 } 2526 2527 if (entities[i].xp > 240) { 2528 entities[i].ax = 3; entities[i].dir = 1; 2529 } 2530 if (entities[i].xp >= 310) { 2531 game.scmprogress++; 2532 entities[i].active = false; 2533 } 2534 } 2535 break; 2536 case 15: //Trophy 2537 //wait for collision 2538 if (entities[i].state == 1) { 2539 trophytext+=2; if (trophytext > 30) trophytext = 30; 2540 trophytype = entities[i].para; 2541 2542 entities[i].state = 0; 2543 } 2544 break; 2545 case 23: 2546 //swn game! 2547 switch(entities[i].behave) { 2548 case 0: 2549 if (entities[i].state == 0) { //Init 2550 entities[i].vx = 7; 2551 if (entities[i].xp > 320) entities[i].active = false; 2552 } 2553 break; 2554 case 1: 2555 if (entities[i].state == 0) { //Init 2556 entities[i].vx = -7; 2557 if (entities[i].xp <-20) entities[i].active = false; 2558 } 2559 break; 2560 } 2561 break; 2562 case 51: //Vertical warp line 2563 if (entities[i].state == 2){ 2564 var j:int = getplayer(); 2565 if(entities[j].xp<=307){ 2566 customwarpmodevon=false; 2567 entities[i].state = 0; 2568 } 2569 }else if (entities[i].state == 1){ 2570 entities[i].state = 2; 2571 entities[i].statedelay = 2; 2572 entities[i].onentity = 1; 2573 customwarpmodevon=true; 2574 } 2575 break; 2576 case 52: //Vertical warp line 2577 if (entities[i].state == 2){ 2578 j = getplayer(); 2579 if(entities[j].xp<=307){ 2580 customwarpmodevon=false; 2581 entities[i].state = 0; 2582 } 2583 }else if (entities[i].state == 1){ 2584 entities[i].state = 2; 2585 entities[i].statedelay = 2; 2586 entities[i].onentity = 1; 2587 customwarpmodevon=true; 2588 } 2589 break; 2590 case 53: //Warp lines Horizonal 2591 if (entities[i].state == 2){ 2592 customwarpmodehon=false; 2593 entities[i].state = 0; 2594 }else if (entities[i].state == 1){ 2595 entities[i].state = 2; 2596 entities[i].statedelay = 2; 2597 entities[i].onentity = 1; 2598 customwarpmodehon=true; 2599 } 2600 break; 2601 case 54: //Warp lines Horizonal 2602 ////if (entities[i].state != 0) { 2603 //trace("entity 54 is still here! ", i, ": state = ", entities[i].state, String(int(Math.random()*100)), entities[i].active); 2604 ////} 2605 if (entities[i].state == 2){ 2606 customwarpmodehon=false; 2607 entities[i].state = 0; 2608 }else if (entities[i].state == 1){ 2609 entities[i].state = 2; 2610 entities[i].statedelay = 2; 2611 entities[i].onentity = 1; 2612 customwarpmodehon=true; 2613 } 2614 break; 2615 case 55: //Collectable crewmate 2616 //wait for collision 2617 if (entities[i].state == 0){ 2618 //Basic rules, don't change expression 2619 j = getplayer(); 2620 if (entities[j].xp > entities[i].xp + 5){ 2621 entities[i].dir = 1; 2622 }else if (entities[j].xp < entities[i].xp - 5) { 2623 entities[i].dir = 0; 2624 } 2625 }else if (entities[i].state == 1){ 2626 game.crewmates++; 2627 if (game.intimetrial){ 2628 customcollect[entities[i].para] = 1; 2629 music.playef(27,10); 2630 }else{ 2631 game.state = 1010; 2632 //music.haltdasmusik(); 2633 if(music.currentsong!=-1) music.silencedasmusik(); 2634 music.playef(27,10); 2635 customcollect[entities[i].para] = 1; 2636 } 2637 2638 entities[i].active = false; 2639 } 2640 break; 2641 case 100: //The teleporter 2642 if (entities[i].state == 1) { 2643 //if inactive, activate! 2644 if (entities[i].tile == 1) { 2645 music.playef(18, 10); 2646 entities[i].onentity = 0; 2647 entities[i].tile = 2; 2648 entities[i].colour = 101; 2649 if(!game.intimetrial && !game.nodeathmode){ 2650 game.state = 2000; game.statedelay = 0; 2651 } 2652 2653 game.activetele = true; 2654 game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32; 2655 game.teleblock.width = 160; game.teleblock.height = 160; 2656 2657 2658 //Alright, let's set this as our savepoint too 2659 //First, deactivate all other savepoints 2660 for (j = 0; j < nentity; j++) { 2661 if (entities[j].type == 8 && entities[j].active) { 2662 entities[j].colour = 4; entities[j].onentity = 1; 2663 } 2664 } 2665 game.savepoint = entities[i].para; 2666 game.savex = entities[i].xp + 44; 2667 game.savey = entities[i].yp + 44; 2668 game.savegc = 0; 2669 2670 game.saverx = game.roomx; game.savery = game.roomy; 2671 game.savedir = entities[getplayer()].dir; 2672 entities[i].state = 0; 2673 2674 if(!game.mobilequicksave_thisroom){ 2675 game.autoquicksave = true; 2676 game.mobilequicksave_thisroom = true; 2677 } 2678 } 2679 2680 entities[i].state = 0; 2681 }else if (entities[i].state == 2) { 2682 //Initilise the teleporter without changing the game state or playing sound 2683 entities[i].onentity = 0; 2684 entities[i].tile = 6; 2685 entities[i].colour = 102; 2686 2687 game.activetele = true; 2688 game.teleblock.x = entities[i].xp - 32; game.teleblock.y = entities[i].yp - 32; 2689 game.teleblock.width = 160; game.teleblock.height = 160; 2690 2691 entities[i].state = 0; 2692 } 2693 break; 2694 } 2695 }else { 2696 entities[i].statedelay--; 2697 if (entities[i].statedelay < 0) entities[i].statedelay = 0; 2698 } 2699 } 2700 2701 return true; 2702 } 2703 2704 public function animateentities(i:int, game:gameclass, help:helpclass):void { 2705 if(entities[i].active){ 2706 if(entities[i].statedelay<=0){ 2707 switch(entities[i].type) { 2708 case 0: 2709 entities[i].framedelay--; 2710 if(entities[i].dir==1){ 2711 entities[i].drawframe=entities[i].tile; 2712 }else{ 2713 entities[i].drawframe=entities[i].tile+3; 2714 } 2715 2716 if(entities[i].onground>0 || entities[i].onroof>0){ 2717 if(int(entities[i].vx)!=0){ 2718 //Walking 2719 if(entities[i].framedelay<=0){ 2720 entities[i].framedelay=4; 2721 entities[i].walkingframe++; 2722 } 2723 if (entities[i].walkingframe >=2) entities[i].walkingframe=0; 2724 entities[i].drawframe += entities[i].walkingframe + 1; 2725 } 2726 2727 if (entities[i].onroof > 0) entities[i].drawframe += 6; 2728 }else { 2729 entities[i].drawframe ++; 2730 if (game.gravitycontrol == 1) { 2731 entities[i].drawframe += 6; 2732 } 2733 } 2734 2735 if (game.deathseq > -1) { 2736 entities[i].drawframe=13; 2737 if (entities[i].dir == 1) entities[i].drawframe = 12; 2738 if (game.gravitycontrol == 1) entities[i].drawframe += 2; 2739 } 2740 break; 2741 case 1: case 23: 2742 //Variable animation 2743 switch(entities[i].animate) { 2744 case 0: 2745 //Simple oscilation 2746 entities[i].framedelay--; 2747 if(entities[i].framedelay<=0){ 2748 entities[i].framedelay = 8; 2749 if(entities[i].actionframe==0){ 2750 entities[i].walkingframe++; 2751 if (entities[i].walkingframe == 4) { 2752 entities[i].walkingframe = 2; 2753 entities[i].actionframe = 1; 2754 } 2755 }else { 2756 entities[i].walkingframe--; 2757 if (entities[i].walkingframe == -1) { 2758 entities[i].walkingframe = 1; 2759 entities[i].actionframe = 0; 2760 } 2761 } 2762 } 2763 2764 entities[i].drawframe = entities[i].tile; 2765 entities[i].drawframe += entities[i].walkingframe; 2766 break; 2767 case 1: 2768 //Simple Loop 2769 entities[i].framedelay--; 2770 if(entities[i].framedelay<=0){ 2771 entities[i].framedelay = 8; 2772 entities[i].walkingframe++; 2773 if (entities[i].walkingframe == 4) { 2774 entities[i].walkingframe = 0; 2775 } 2776 } 2777 2778 entities[i].drawframe = entities[i].tile; 2779 entities[i].drawframe += entities[i].walkingframe; 2780 break; 2781 case 2: 2782 //Simpler Loop (just two frames) 2783 entities[i].framedelay--; 2784 if(entities[i].framedelay<=0){ 2785 entities[i].framedelay = 2; 2786 entities[i].walkingframe++; 2787 if (entities[i].walkingframe == 2) { 2788 entities[i].walkingframe = 0; 2789 } 2790 } 2791 2792 entities[i].drawframe = entities[i].tile; 2793 entities[i].drawframe += entities[i].walkingframe; 2794 break; 2795 case 3: 2796 //Simpler Loop (just two frames, but double sized) 2797 entities[i].framedelay--; 2798 if(entities[i].framedelay<=0){ 2799 entities[i].framedelay = 2; 2800 entities[i].walkingframe++; 2801 if (entities[i].walkingframe == 2) { 2802 entities[i].walkingframe = 0; 2803 } 2804 } 2805 2806 entities[i].drawframe = entities[i].tile; 2807 entities[i].drawframe += (entities[i].walkingframe*2); 2808 break; 2809 case 4: 2810 //Simpler Loop (just two frames, but double sized) (as above but slower) 2811 entities[i].framedelay--; 2812 if(entities[i].framedelay<=0){ 2813 entities[i].framedelay = 6; 2814 entities[i].walkingframe++; 2815 if (entities[i].walkingframe == 2) { 2816 entities[i].walkingframe = 0; 2817 } 2818 } 2819 2820 entities[i].drawframe = entities[i].tile; 2821 entities[i].drawframe += (entities[i].walkingframe*2); 2822 break; 2823 case 5: 2824 //Simpler Loop (just two frames) (slower) 2825 entities[i].framedelay--; 2826 if(entities[i].framedelay<=0){ 2827 entities[i].framedelay = 6; 2828 entities[i].walkingframe++; 2829 if (entities[i].walkingframe == 2) { 2830 entities[i].walkingframe = 0; 2831 } 2832 } 2833 2834 entities[i].drawframe = entities[i].tile; 2835 entities[i].drawframe += entities[i].walkingframe; 2836 break; 2837 case 6: 2838 //Normal Loop (four frames, double sized) 2839 entities[i].framedelay--; 2840 if(entities[i].framedelay<=0){ 2841 entities[i].framedelay = 4; 2842 entities[i].walkingframe++; 2843 if (entities[i].walkingframe == 4) { 2844 entities[i].walkingframe = 0; 2845 } 2846 } 2847 2848 entities[i].drawframe = entities[i].tile; 2849 entities[i].drawframe += (entities[i].walkingframe*2); 2850 break; 2851 case 7: 2852 //Simpler Loop (just two frames) (slower) (with directions!) 2853 entities[i].framedelay--; 2854 if(entities[i].framedelay<=0){ 2855 entities[i].framedelay = 6; 2856 entities[i].walkingframe++; 2857 if (entities[i].walkingframe == 2) { 2858 entities[i].walkingframe = 0; 2859 } 2860 } 2861 2862 entities[i].drawframe = entities[i].tile; 2863 entities[i].drawframe += entities[i].walkingframe; 2864 2865 if (entities[i].vx > 0) entities[i].drawframe += 2; 2866 break; 2867 case 10: 2868 //Threadmill left 2869 entities[i].framedelay--; 2870 if(entities[i].framedelay<=0){ 2871 entities[i].framedelay = 3;//(6-entities[i].para); 2872 entities[i].walkingframe--; 2873 if (entities[i].walkingframe == -1) { 2874 entities[i].walkingframe = 3; 2875 } 2876 } 2877 2878 entities[i].drawframe = entities[i].tile; 2879 entities[i].drawframe += entities[i].walkingframe; 2880 break; 2881 case 11: 2882 //Threadmill right 2883 entities[i].framedelay--; 2884 if(entities[i].framedelay<=0){ 2885 entities[i].framedelay = 3;//(6-entities[i].para); 2886 entities[i].walkingframe++; 2887 if (entities[i].walkingframe == 4) { 2888 entities[i].walkingframe = 0; 2889 } 2890 } 2891 2892 entities[i].drawframe = entities[i].tile; 2893 entities[i].drawframe += entities[i].walkingframe; 2894 break; 2895 case 100: 2896 //Simple case for no animation (platforms, etc) 2897 entities[i].drawframe = entities[i].tile; 2898 break; 2899 default: 2900 entities[i].drawframe = entities[i].tile; 2901 break; 2902 } 2903 break; 2904 case 11: 2905 entities[i].drawframe = entities[i].tile; 2906 if(entities[i].animate==2) { 2907 //Simpler Loop (just two frames) 2908 entities[i].framedelay--; 2909 if(entities[i].framedelay<=0){ 2910 entities[i].framedelay = 10; 2911 entities[i].walkingframe++; 2912 if (entities[i].walkingframe == 2) { 2913 entities[i].walkingframe = 0; 2914 } 2915 } 2916 2917 entities[i].drawframe = entities[i].tile; 2918 entities[i].drawframe += entities[i].walkingframe; 2919 } 2920 break; 2921 case 12: case 55: case 14: //Crew member! Very similar to hero 2922 entities[i].framedelay--; 2923 if(entities[i].dir==1){ 2924 entities[i].drawframe=entities[i].tile; 2925 }else{ 2926 entities[i].drawframe=entities[i].tile+3; 2927 } 2928 2929 if(entities[i].onground>0 || entities[i].onroof>0){ 2930 if(entities[i].vx!=0){ 2931 //Walking 2932 if(entities[i].framedelay<=0){ 2933 entities[i].framedelay=4; 2934 entities[i].walkingframe++; 2935 } 2936 if (entities[i].walkingframe >=2) entities[i].walkingframe=0; 2937 entities[i].drawframe += entities[i].walkingframe + 1; 2938 } 2939 2940 //if (entities[i].onroof > 0) entities[i].drawframe += 6; 2941 }else { 2942 entities[i].drawframe ++; 2943 //if (game.gravitycontrol == 1) { 2944 // entities[i].drawframe += 6; 2945 //} 2946 } 2947 2948 if (game.deathseq > -1) { 2949 entities[i].drawframe=13; 2950 if (entities[i].dir == 1) entities[i].drawframe = 12; 2951 if (entities[i].rule == 7) entities[i].drawframe += 2; 2952 //if (game.gravitycontrol == 1) entities[i].drawframe += 2; 2953 } 2954 break; 2955 case 100: //the teleporter! 2956 if (entities[i].tile == 1) { 2957 //it's inactive 2958 entities[i].drawframe = entities[i].tile; 2959 }else if (entities[i].tile == 2){ 2960 entities[i].drawframe = entities[i].tile; 2961 2962 entities[i].framedelay--; 2963 if(entities[i].framedelay<=0){ 2964 entities[i].framedelay = 1; 2965 entities[i].walkingframe = int(Math.random() * 6); 2966 if (entities[i].walkingframe >= 4) { 2967 entities[i].walkingframe = -1; 2968 entities[i].framedelay = 4; 2969 } 2970 } 2971 2972 entities[i].drawframe = entities[i].tile; 2973 entities[i].drawframe += entities[i].walkingframe; 2974 }else if (entities[i].tile == 6) { 2975 //faster! 2976 entities[i].drawframe = entities[i].tile; 2977 2978 entities[i].framedelay--; 2979 if(entities[i].framedelay<=0){ 2980 entities[i].framedelay = 2; 2981 entities[i].walkingframe = int(Math.random() * 6); 2982 if (entities[i].walkingframe >= 4) { 2983 entities[i].walkingframe = -5; 2984 entities[i].framedelay = 4; 2985 } 2986 } 2987 2988 entities[i].drawframe = entities[i].tile; 2989 entities[i].drawframe += entities[i].walkingframe; 2990 } 2991 break; 2992 default: 2993 entities[i].drawframe = entities[i].tile; 2994 break; 2995 } 2996 }else { 2997 //entities[i].statedelay--; 2998 if (entities[i].statedelay < 0) entities[i].statedelay = 0; 2999 } 3000 } 3001 } 3002 3003 public function gettype(t:int):Boolean { 3004 //Returns true is there is an entity of type t onscreen 3005 for (var i:int = 0; i < nentity; i++) { 3006 if(entities[i].type==t){ 3007 return true; 3008 } 3009 } 3010 3011 return false; 3012 } 3013 3014 public function getcompanion(t:int):int { 3015 //Returns the index of the companion with rule t 3016 for (var i:int = 0; i < nentity; i++) { 3017 if(entities[i].rule==6 || entities[i].rule==7){ 3018 return i; 3019 } 3020 } 3021 3022 return -1; 3023 } 3024 3025 public function getplayer():int { 3026 //Returns the index of the first player entity 3027 for (var i:int = 0; i < nentity; i++) { 3028 if (entities[i].type == 0) { 3029 return i; 3030 } 3031 } 3032 3033 return -1; 3034 } 3035 3036 public function getscm():int { 3037 //Returns the supercrewmate 3038 for (var i:int = 0; i < nentity; i++) { 3039 if(entities[i].type==14){ 3040 return i; 3041 } 3042 } 3043 3044 return 0; 3045 } 3046 3047 public function getlineat(t:int):int { 3048 //Get the entity which is a horizontal line at height t (for SWN game) 3049 for (var i:int = 0; i < nentity; i++) { 3050 if (entities[i].size == 5) { 3051 if (entities[i].yp == t) { 3052 return i; 3053 } 3054 } 3055 } 3056 3057 return 0; 3058 } 3059 3060 public function getcrewman(t:int):int { 3061 //Returns the index of the crewman with colour index given by t 3062 if (t == 0) t = 0; 3063 if (t == 1) t = 20; 3064 if (t == 2) t = 14; 3065 if (t == 3) t = 15; 3066 if (t == 4) t = 13; 3067 if (t == 5) t = 16; 3068 3069 for (var i:int = 0; i < nentity; i++) { 3070 if (entities[i].rule == 6 || entities[i].rule == 7) { 3071 if(entities[i].colour==t){ 3072 return i; 3073 } 3074 } 3075 } 3076 3077 return 0; 3078 } 3079 3080 public function getcustomcrewman(t:int):int { 3081 //Returns the index of the crewman with colour index given by t 3082 if (t == 0) t = 0; 3083 if (t == 1) t = 20; 3084 if (t == 2) t = 14; 3085 if (t == 3) t = 15; 3086 if (t == 4) t = 13; 3087 if (t == 5) t = 16; 3088 3089 for (var i:int = 0; i < nentity; i++){ 3090 if (entities[i].type == 55){ 3091 if(entities[i].colour==t){ 3092 return i; 3093 } 3094 } 3095 } 3096 3097 return 0; 3098 } 3099 3100 public function getteleporter():int { 3101 for (var i:int = 0; i < nentity; i++) { 3102 if(entities[i].type==100 && entities[i].active){ 3103 return i; 3104 } 3105 } 3106 3107 return -1; 3108 } 3109 3110 public function rectset(xi:int, yi:int, wi:int, hi:int):void { 3111 temprect.x = xi; temprect.y = yi; temprect.width = wi; temprect.height = hi; 3112 } 3113 3114 public function rect2set(xi:int, yi:int, wi:int, hi:int):void { 3115 temprect2.x = xi; temprect2.y = yi; temprect2.width = wi; temprect2.height = hi; 3116 } 3117 3118 public function entitycollide(a:int, b:int):Boolean { 3119 //Do entities a and b collide? 3120 tempx = entities[a].xp + entities[a].cx; tempy = entities[a].yp + entities[a].cy; 3121 tempw = entities[a].w; temph = entities[a].h; 3122 rectset(tempx, tempy, tempw, temph); 3123 3124 tempx = entities[b].xp + entities[b].cx; tempy = entities[b].yp + entities[b].cy; 3125 tempw = entities[b].w; temph = entities[b].h; 3126 rect2set(tempx, tempy, tempw, temph); 3127 3128 if (temprect.intersects(temprect2)) return true; 3129 return false; 3130 } 3131 3132 public function checkdirectional(t:int):Boolean{ 3133 //Returns true if player entity (rule 0) moving in dir t through directional block 3134 if(opt_usedirectional){ 3135 i = getplayer(); 3136 if (i > -1) { 3137 if(entities[i].rule==0){ 3138 tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; 3139 tempw = entities[i].w; temph = entities[i].h; 3140 rectset(tempx, tempy, tempw, temph); 3141 3142 for (j = 0; j < nblocks; j++) { 3143 if (blocks[j].type == DIRECTIONAL && blocks[j].active){ 3144 if(blocks[j].rect.intersects(temprect)) { 3145 return true; 3146 } 3147 } 3148 } 3149 } 3150 } 3151 } 3152 return false; 3153 } 3154 3155 public function checkdamage():Boolean{ 3156 //Returns true if player entity (rule 0) collides with a damagepoint 3157 if(opt_usedamage){ 3158 i = getplayer(); 3159 if (i > -1) { 3160 if(entities[i].rule==0){ 3161 tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; 3162 tempw = entities[i].w; temph = entities[i].h; 3163 rectset(tempx, tempy, tempw, temph); 3164 3165 for (j=0; j<nblocks; j++){ 3166 if (blocks[j].type == DAMAGE && blocks[j].active){ 3167 if(blocks[j].rect.intersects(temprect)) { 3168 return true; 3169 } 3170 } 3171 } 3172 } 3173 } 3174 } 3175 return false; 3176 } 3177 3178 public function scmcheckdamage():Boolean{ 3179 //Returns true if supercrewmate collides with a damagepoint 3180 for(i = 0; i < nentity; i++) { 3181 if(entities[i].type==14){ 3182 tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; 3183 tempw = entities[i].w; temph = entities[i].h; 3184 rectset(tempx, tempy, tempw, temph); 3185 3186 for (j=0; j<nblocks; j++){ 3187 if (blocks[j].type == DAMAGE && blocks[j].active){ 3188 if(blocks[j].rect.intersects(temprect)) { 3189 return true; 3190 } 3191 } 3192 } 3193 } 3194 } 3195 return false; 3196 } 3197 3198 public function settemprect(t:int):void { 3199 //setup entity t in temprect 3200 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy; 3201 tempw = entities[t].w; temph = entities[t].h; 3202 rectset(tempx, tempy, tempw, temph); 3203 } 3204 3205 public function checktrigger():int{ 3206 //Returns an int player entity (rule 0) collides with a trigger 3207 if (opt_usetrigger) { 3208 i = getplayer(); 3209 if (i > -1) { 3210 if(entities[i].rule==0){ 3211 tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; 3212 tempw = entities[i].w; temph = entities[i].h; 3213 rectset(tempx, tempy, tempw, temph); 3214 3215 for (j=0; j<nblocks; j++){ 3216 if (blocks[j].type == TRIGGER && blocks[j].active){ 3217 if (blocks[j].rect.intersects(temprect)) { 3218 activetrigger = blocks[j].trigger; 3219 return blocks[j].trigger; 3220 } 3221 } 3222 } 3223 } 3224 } 3225 } 3226 return -1; 3227 } 3228 3229 public function checkactivity():int{ 3230 //Returns an int player entity (rule 0) collides with an activity 3231 if(opt_useactivity){ 3232 i = getplayer(); 3233 if(i>-1){ 3234 if(entities[i].rule==0){ 3235 tempx = entities[i].xp + entities[i].cx; tempy = entities[i].yp + entities[i].cy; 3236 tempw = entities[i].w; temph = entities[i].h; 3237 rectset(tempx, tempy, tempw, temph); 3238 3239 for (j=0; j<nblocks; j++){ 3240 if (blocks[j].type == ACTIVITY && blocks[j].active){ 3241 if (blocks[j].rect.intersects(temprect)) { 3242 return j; 3243 } 3244 } 3245 } 3246 } 3247 } 3248 } 3249 return -1; 3250 } 3251 3252 public function getgridpoint(t:int):int { 3253 t = (t - (t % 8)) / 8; 3254 return t; 3255 } 3256 3257 public function cblocks(t:int):Boolean { 3258 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy; 3259 tempw = entities[t].w; temph = entities[t].h; 3260 rectset(tempx, tempy, tempw, temph); 3261 3262 return checkblocks(); 3263 } 3264 3265 public function checkplatform():Boolean { 3266 //Return true if rectset intersects a moving platform, setups px & py to the platform x & y 3267 for (i = 0; i < nblocks; i++) { 3268 if (blocks[i].active) { 3269 if (blocks[i].type == BLOCK){ 3270 if (blocks[i].rect.intersects(temprect)) { 3271 px = blocks[i].xp; py = blocks[i].yp; 3272 return true; 3273 } 3274 } 3275 } 3276 } 3277 return false; 3278 } 3279 3280 public function checkblocks():Boolean { 3281 for (i = 0; i < nblocks; i++) { 3282 if (blocks[i].active) { 3283 if (!skipdirblocks) { 3284 if (blocks[i].type == DIRECTIONAL) { 3285 if (dy > 0 && blocks[i].trigger == 0) if (blocks[i].rect.intersects(temprect)) return true; 3286 if (dy <= 0 && blocks[i].trigger == 1) if (blocks[i].rect.intersects(temprect)) return true; 3287 if (dx > 0 && blocks[i].trigger == 2) if (blocks[i].rect.intersects(temprect)) return true; 3288 if (dx <= 0 && blocks[i].trigger == 3) if (blocks[i].rect.intersects(temprect)) return true; 3289 } 3290 } 3291 if (blocks[i].type == BLOCK){ 3292 if (blocks[i].rect.intersects(temprect)) { 3293 return true; 3294 } 3295 } 3296 if (blocks[i].type == SAFE) { 3297 if(dr==1){ 3298 if (blocks[i].rect.intersects(temprect)) { 3299 return true; 3300 } 3301 } 3302 } 3303 } 3304 } 3305 return false; 3306 } 3307 3308 public function checktowerspikes(t:int, map:mapclass):Boolean { 3309 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy; 3310 tempw = entities[t].w; temph = entities[t].h; 3311 rectset(tempx, tempy, tempw, temph); 3312 3313 tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y); 3314 tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1); 3315 if (map.spikecollide(tempx, tempy)) return true; 3316 if (map.spikecollide(tempw, tempy)) return true; 3317 if (map.spikecollide(tempx, temph)) return true; 3318 if (map.spikecollide(tempw, temph)) return true; 3319 if (temprect.height >= 12) { 3320 tpy1 = getgridpoint(temprect.y + 6); 3321 if (map.spikecollide(tempx, tpy1)) return true; 3322 if (map.spikecollide(tempw, tpy1)) return true; 3323 if (temprect.height >= 18) { 3324 tpy1 = getgridpoint(temprect.y + 12); 3325 if (map.spikecollide(tempx, tpy1)) return true; 3326 if (map.spikecollide(tempw, tpy1)) return true; 3327 if (temprect.height >= 24) { 3328 tpy1 = getgridpoint(temprect.y + 18); 3329 if (map.spikecollide(tempx, tpy1)) return true; 3330 if (map.spikecollide(tempw, tpy1)) return true; 3331 } 3332 } 3333 } 3334 if (temprect.width >= 12) { 3335 tpx1 = getgridpoint(temprect.x + 6); 3336 if (map.collide(tpx1, tempy)) return true; 3337 if (map.collide(tpx1, temph)) return true; 3338 } 3339 return false; 3340 } 3341 3342 public function checkwall(map:mapclass):Boolean{ 3343 //Returns true if entity setup in temprect collides with a wall 3344 //used for proper collision functions; you can't just, like, call it 3345 //whenever you feel like it and expect a response 3346 // 3347 //that won't work at all 3348 if(skipblocks){ 3349 if (checkblocks()) return true; 3350 } 3351 3352 tempx = getgridpoint(temprect.x); tempy = getgridpoint(temprect.y); 3353 tempw = getgridpoint(temprect.x + temprect.width - 1); temph = getgridpoint(temprect.y + temprect.height - 1); 3354 if (map.collide(tempx, tempy)) return true; 3355 if (map.collide(tempw, tempy)) return true; 3356 if (map.collide(tempx, temph)) return true; 3357 if (map.collide(tempw, temph)) return true; 3358 if (temprect.height >= 12) { 3359 tpy1 = getgridpoint(temprect.y + 6); 3360 if (map.collide(tempx, tpy1)) return true; 3361 if (map.collide(tempw, tpy1)) return true; 3362 if (temprect.height >= 18) { 3363 tpy1 = getgridpoint(temprect.y + 12); 3364 if (map.collide(tempx, tpy1)) return true; 3365 if (map.collide(tempw, tpy1)) return true; 3366 if (temprect.height >= 24) { 3367 tpy1 = getgridpoint(temprect.y + 18); 3368 if (map.collide(tempx, tpy1)) return true; 3369 if (map.collide(tempw, tpy1)) return true; 3370 } 3371 } 3372 } 3373 if (temprect.width >= 12) { 3374 tpx1 = getgridpoint(temprect.x + 6); 3375 if (map.collide(tpx1, tempy)) return true; 3376 if (map.collide(tpx1, temph)) return true; 3377 } 3378 return false; 3379 } 3380 3381 public function hplatformat():Number { 3382 //Returns first entity of horizontal platform at (px, py), -1000 otherwise. 3383 for (i = 0; i < nentity; i++) { 3384 if (entities[i].active) { 3385 if (entities[i].rule == 2) { 3386 if (entities[i].behave >= 2) { 3387 if (entities[i].xp == px && entities[i].yp == py) { 3388 if (entities[i].behave == 8) { //threadmill! 3389 return entities[i].para; 3390 }else if(entities[i].behave == 9) { //threadmill! 3391 return -entities[i].para; 3392 }else{ 3393 return entities[i].vx; 3394 } 3395 } 3396 } 3397 } 3398 } 3399 } 3400 return -1000; 3401 } 3402 3403 public function yline(a:int, b:int):int { 3404 if (a < b) return -1; 3405 return 1; 3406 } 3407 3408 public function entityhlinecollide(t:int, l:int):Boolean { 3409 //Returns true is entity t collided with the horizontal line l. 3410 if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){ 3411 if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){ 3412 linetemp = 0; 3413 3414 linetemp += yline(entities[t].yp, entities[l].yp); 3415 linetemp += yline(entities[t].yp + entities[t].h, entities[l].yp); 3416 linetemp += yline(entities[t].oldyp, entities[l].yp); 3417 linetemp += yline(entities[t].oldyp + entities[t].h, entities[l].yp); 3418 3419 if (linetemp > -4 && linetemp < 4) return true; 3420 return false; 3421 } 3422 } 3423 return false; 3424 } 3425 3426 public function entityvlinecollide(t:int, l:int):Boolean { 3427 //Returns true is entity t collided with the vertical line l. 3428 if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){ 3429 if(entities[t].yp + entities[t].cy<=entities[l].yp+entities[l].h){ 3430 linetemp = 0; 3431 3432 linetemp += yline(entities[t].xp + entities[t].cx+1, entities[l].xp); 3433 linetemp += yline(entities[t].xp + entities[t].cx+1 + entities[t].w, entities[l].xp); 3434 linetemp += yline(entities[t].oldxp + entities[t].cx+1, entities[l].xp); 3435 linetemp += yline(entities[t].oldxp + entities[t].cx+1 + entities[t].w, entities[l].xp); 3436 3437 if (linetemp > -4 && linetemp < 4) return true; 3438 return false; 3439 } 3440 } 3441 return false; 3442 } 3443 3444 public function entitywarphlinecollide(t:int, l:int):Boolean { 3445 //Returns true is entity t collided with the horizontal line l. 3446 if(entities[t].xp + entities[t].cx+entities[t].w>=entities[l].xp){ 3447 if(entities[t].xp + entities[t].cx<=entities[l].xp+entities[l].w){ 3448 linetemp = 0; 3449 if (entities[l].yp < 120) { 3450 //Top line 3451 if (entities[t].vy < 0) { 3452 if (entities[t].yp < entities[l].yp + 10) linetemp++; 3453 if (entities[t].yp + entities[t].h < entities[l].yp + 10) linetemp++; 3454 if (entities[t].oldyp < entities[l].yp + 10) linetemp++; 3455 if (entities[t].oldyp + entities[t].h < entities[l].yp + 10) linetemp++; 3456 } 3457 3458 if (linetemp > 0) return true; 3459 return false; 3460 }else { 3461 //Bottom line 3462 if (entities[t].vy > 0) { 3463 if (entities[t].yp > entities[l].yp - 10) linetemp++; 3464 if (entities[t].yp + entities[t].h > entities[l].yp - 10) linetemp++; 3465 if (entities[t].oldyp > entities[l].yp - 10) linetemp++; 3466 if (entities[t].oldyp + entities[t].h > entities[l].yp - 10) linetemp++; 3467 } 3468 3469 if (linetemp > 0) return true; 3470 return false; 3471 } 3472 } 3473 } 3474 return false; 3475 } 3476 3477 public function entitywarpvlinecollide(t:int, l:int):Boolean { 3478 //Returns true is entity t collided with the vertical warp line l. 3479 if(entities[t].yp + entities[t].cy+entities[t].h>=entities[l].yp){ 3480 if (entities[t].yp + entities[t].cy <= entities[l].yp + entities[l].h) { 3481 linetemp = 0; 3482 if (entities[l].xp < 160) { 3483 //Left hand line 3484 if (entities[t].xp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++; 3485 if (entities[t].xp + entities[t].cx+1 + entities[t].w < entities[l].xp + 10) linetemp++; 3486 if (entities[t].oldxp + entities[t].cx + 1 < entities[l].xp + 10) linetemp++; 3487 if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w < entities[l].xp + 10) linetemp++; 3488 3489 if (linetemp > 0) return true; 3490 return false; 3491 }else { 3492 //Right hand line 3493 if (entities[t].xp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++; 3494 if (entities[t].xp + entities[t].cx+1 + entities[t].w > entities[l].xp - 10) linetemp++; 3495 if (entities[t].oldxp + entities[t].cx + 1 > entities[l].xp - 10) linetemp++; 3496 if (entities[t].oldxp + entities[t].cx + 1 + entities[t].w > entities[l].xp - 10) linetemp++; 3497 3498 if (linetemp > 0) return true; 3499 return false; 3500 } 3501 } 3502 } 3503 return false; 3504 } 3505 3506 public function entitycollideplatformroof(map:mapclass, t:int):Number{ 3507 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy -1; 3508 tempw = entities[t].w; temph = entities[t].h; 3509 rectset(tempx, tempy, tempw, temph); 3510 3511 if (checkplatform()) { 3512 //px and py now contain an x y coordinate for a platform, find it 3513 return hplatformat(); 3514 } 3515 return -1000; 3516 } 3517 3518 public function entitycollideplatformfloor(map:mapclass, t:int):Number{ 3519 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1; 3520 tempw = entities[t].w; temph = entities[t].h; 3521 rectset(tempx, tempy, tempw, temph); 3522 3523 if (checkplatform()) { 3524 //px and py now contain an x y coordinate for a platform, find it 3525 return hplatformat(); 3526 } 3527 return -1000; 3528 } 3529 3530 public function entitycollidefloor(map:mapclass, t:int):Boolean{ 3531 //see? like here, for example! 3532 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy + 1; 3533 tempw = entities[t].w; temph = entities[t].h; 3534 rectset(tempx, tempy, tempw, temph); 3535 3536 if (checkwall(map)) return true; 3537 return false; 3538 } 3539 3540 public function entitycollideroof(map:mapclass, t:int):Boolean{ 3541 //and here! 3542 tempx = entities[t].xp + entities[t].cx; tempy = entities[t].yp + entities[t].cy - 1; 3543 tempw = entities[t].w; temph = entities[t].h; 3544 rectset(tempx, tempy, tempw, temph); 3545 3546 if (checkwall(map)) return true; 3547 return false; 3548 } 3549 3550 public function testwallsx(t:int, map:mapclass, tx:int, ty:int):Boolean{ 3551 tempx = tx + entities[t].cx; tempy = ty + entities[t].cy; 3552 tempw = entities[t].w; temph = entities[t].h; 3553 rectset(tempx, tempy, tempw, temph); 3554 3555 if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; } 3556 if (entities[t].type == 14) skipblocks = true; 3557 dx = 0; dy = 0; if (entities[t].rule == 0) dx = entities[t].vx; 3558 dr = entities[t].rule; 3559 3560 //Ok, now we check walls 3561 if (checkwall(map)) { 3562 if (entities[t].vx > 1) { 3563 entities[t].vx--; 3564 entities[t].newxp = int(entities[t].xp + entities[t].vx); 3565 return testwallsx(t, map, entities[t].newxp, entities[t].yp); 3566 }else if (entities[t].vx < -1) { 3567 entities[t].vx++; 3568 entities[t].newxp = int(entities[t].xp + entities[t].vx); 3569 return testwallsx(t, map, entities[t].newxp, entities[t].yp); 3570 }else { 3571 entities[t].vx=0; 3572 return false; 3573 } 3574 } 3575 return true; 3576 } 3577 3578 public function testwallsy(t:int, map:mapclass, tx:int, ty:int):Boolean { 3579 tempx = tx + entities[t].cx; tempy = ty + entities[t].cy; 3580 tempw = entities[t].w; temph = entities[t].h; 3581 rectset(tempx, tempy, tempw, temph); 3582 3583 if (entities[t].rule < 2) { skipblocks = true; } else { skipblocks = false; } 3584 if (entities[t].type == 14) skipblocks = true; 3585 3586 dx = 0; dy = 0; if (entities[t].rule == 0) dy = entities[t].vy; 3587 dr = entities[t].rule; 3588 3589 //Ok, now we check walls 3590 if (checkwall(map)) { 3591 if (entities[t].vy > 1) { 3592 entities[t].vy--; 3593 entities[t].newyp = int(entities[t].yp + entities[t].vy); 3594 return testwallsy(t, map, entities[t].xp, entities[t].newyp); 3595 }else if (entities[t].vy < -1) { 3596 entities[t].vy++; 3597 entities[t].newyp = int(entities[t].yp + entities[t].vy); 3598 return testwallsy(t, map, entities[t].xp, entities[t].newyp); 3599 }else { 3600 entities[t].vy=0; 3601 return false; 3602 } 3603 } 3604 return true; 3605 } 3606 3607 public function fixfriction(t:int, xfix:Number, xrate:Number, yrate:Number):void{ 3608 if (entities[t].vx > xfix) entities[t].vx -= xrate; 3609 if (entities[t].vx < xfix) entities[t].vx += xrate; 3610 if (entities[t].vy > 0) entities[t].vy -= yrate; 3611 if (entities[t].vy < 0) entities[t].vy += yrate; 3612 if (entities[t].vy > 10) entities[t].vy = 10; 3613 if (entities[t].vy < -10) entities[t].vy = -10; 3614 if (entities[t].vx > 6) entities[t].vx = 6; 3615 if (entities[t].vx < -6) entities[t].vx = -6; 3616 3617 if (Math.abs(entities[t].vx-xfix) <= xrate) entities[t].vx = xfix; 3618 if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0; 3619 } 3620 3621 public function applyfriction(t:int, xrate:Number, yrate:Number):void{ 3622 if (entities[t].vx > 0) entities[t].vx -= xrate; 3623 if (entities[t].vx < 0) entities[t].vx += xrate; 3624 if (entities[t].vy > 0) entities[t].vy -= yrate; 3625 if (entities[t].vy < 0) entities[t].vy += yrate; 3626 if (entities[t].vy > 10) entities[t].vy = 10; 3627 if (entities[t].vy < -10) entities[t].vy = -10; 3628 if (entities[t].vx > 6) entities[t].vx = 6; 3629 if (entities[t].vx < -6) entities[t].vx = -6; 3630 3631 if (Math.abs(entities[t].vx) <= xrate) entities[t].vx = 0; 3632 if (Math.abs(entities[t].vy) <= yrate) entities[t].vy = 0; 3633 } 3634 3635 public function cleanup():void { 3636 i = nentity - 1; while (i >= 0 && !entities[i].active) { nentity--; i--; } 3637 i = nblocks - 1; while (i >= 0 && !blocks[i].active) { nblocks--; i--; } 3638 } 3639 3640 public function updateentitylogic(t:int, game:gameclass):void { 3641 entities[t].oldxp = entities[t].xp; entities[t].oldyp = entities[t].yp; 3642 3643 entities[t].vx = entities[t].vx + entities[t].ax; 3644 entities[t].vy = entities[t].vy + entities[t].ay; 3645 entities[t].ax = 0; 3646 3647 if (entities[t].gravity) { 3648 if (entities[t].rule == 0) { 3649 if(game.gravitycontrol==0){ 3650 entities[t].ay = 3; 3651 }else { 3652 entities[t].ay = -3; 3653 } 3654 }else if (entities[t].rule == 7) { 3655 entities[t].ay = -3; 3656 }else { 3657 entities[t].ay = 3; 3658 } 3659 applyfriction(t, game.inertia, 0.25); 3660 } 3661 3662 entities[t].newxp = entities[t].xp + entities[t].vx; 3663 entities[t].newyp = entities[t].yp + entities[t].vy; 3664 } 3665 3666 3667 public function entitymapcollision(t:int, map:mapclass):void { 3668 if (testwallsx(t, map, entities[t].newxp, entities[t].yp)) { 3669 entities[t].xp = entities[t].newxp; 3670 }else { 3671 if (entities[t].onwall > 0) entities[t].state = entities[t].onwall; 3672 if (entities[t].onxwall > 0) entities[t].state = entities[t].onxwall; 3673 } 3674 if (testwallsy(t, map, entities[t].xp, entities[t].newyp)) { 3675 entities[t].yp = entities[t].newyp; 3676 }else { 3677 if (entities[t].onwall > 0) entities[t].state = entities[t].onwall; 3678 if (entities[t].onywall > 0) entities[t].state = entities[t].onywall; 3679 entities[t].jumpframe = 0; 3680 } 3681 } 3682 3683 public function movingplatformfix(t:int, map:mapclass):void{ 3684 //If this intersects the player, then we move the player along it 3685 j = getplayer(); 3686 if (entitycollide(t, j)) { 3687 //ok, bollox, let's make sure 3688 entities[j].yp = entities[j].yp + entities[j].vy; 3689 if (entitycollide(t, j)) { 3690 entities[j].yp = entities[j].yp - entities[j].vy; 3691 entities[j].vy = entities[t].vy; 3692 entities[j].newyp = entities[j].yp + entities[j].vy; 3693 if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) { 3694 if (entities[t].vy > 0) { 3695 entities[j].yp = entities[t].yp + entities[t].h; 3696 entities[j].vy = 0; 3697 entities[j].onroof = 1; 3698 }else { 3699 entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy; 3700 entities[j].vy = 0; 3701 entities[j].onground = 1; 3702 } 3703 }else { 3704 entities[t].state = entities[t].onwall; 3705 } 3706 } 3707 } 3708 } 3709 3710 public function scmmovingplatformfix(t:int, map:mapclass):void{ 3711 //If this intersects the SuperCrewMate, then we move them along it 3712 j = getscm(); 3713 if (entitycollide(t, j)) { 3714 //ok, bollox, let's make sure 3715 entities[j].yp = entities[j].yp + entities[j].vy; 3716 if (entitycollide(t, j)) { 3717 entities[j].yp = entities[j].yp - entities[j].vy; 3718 entities[j].vy = entities[t].vy; 3719 entities[j].newyp = entities[j].yp + entities[j].vy; 3720 if (testwallsy(j, map, entities[j].xp, entities[j].newyp)) { 3721 if (entities[t].vy > 0) { 3722 entities[j].yp = entities[t].yp + entities[t].h; 3723 entities[j].vy = 0; 3724 //entities[j].onroof = true; 3725 }else { 3726 entities[j].yp = entities[t].yp - entities[j].h-entities[j].cy; 3727 entities[j].vy = 0; 3728 //entities[j].onground = true; 3729 } 3730 }else { 3731 entities[t].state = entities[t].onwall; 3732 } 3733 } 3734 } 3735 } 3736 3737 public function hormovingplatformfix(t:int, map:mapclass):void{ 3738 //If this intersects the player, then we move the player along it 3739 //for horizontal platforms, this is simplier 3740 createblock(0, entities[t].xp, entities[t].yp, entities[t].w, entities[t].h); 3741 /*j = getplayer(); 3742 if (entitycollide(t, j)) { 3743 //ok, bollox, let's make sure 3744 entities[j].yp = entities[j].yp + entities[j].vy; 3745 if (entitycollide(t, j)) { 3746 //entities[t].state = entities[t].onwall; 3747 } 3748 }*/ 3749 } 3750 3751 public function customwarplinecheck(i:int):void { 3752 //Turns on obj.customwarpmodevon and obj.customwarpmodehon if player collides 3753 //with warp lines 3754 3755 if (entities[i].active) { 3756 //We test entity to entity 3757 for (j = 0; j < nentity; j++) { 3758 if (entities[j].active && i != j) {//Active 3759 if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line! 3760 if (entities[j].type == 51 || entities[j].type == 52) { 3761 if (entitywarpvlinecollide(i, j)) { 3762 customwarpmodevon = true; 3763 } 3764 } 3765 } 3766 3767 if (entities[i].rule == 0 && entities[j].rule == 7){ //Player vs horizontal WARP line 3768 if (entities[j].type == 53 || entities[j].type == 54) { 3769 if (entitywarphlinecollide(i, j)) { 3770 customwarpmodehon = true; 3771 } 3772 } 3773 } 3774 } 3775 } 3776 } 3777 } 3778 3779 public function entitycollisioncheck(dwgfx:dwgraphicsclass, game:gameclass, map:mapclass, music:musicclass):void { 3780 i = getplayer(); 3781 if (entities[i].active) { 3782 //We test entity to entity 3783 for (j = 0; j < nentity; j++) { 3784 if (entities[j].active && i != j) {//Active 3785 if (entities[i].rule == 0 && entities[j].rule == 1 && entities[j].harmful) { 3786 //player i hits enemy or enemy bullet j 3787 if (entitycollide(i, j) && !map.invincibility) { 3788 if (entities[i].size == 0 && (entities[j].size == 0 || entities[j].size == 12)) { 3789 //They're both sprites, so do a per pixel collision 3790 colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp; 3791 colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp; 3792 if (dwgfx.flipmode) { 3793 if (dwgfx.flipsprites[entities[i].drawframe].hitTest( 3794 colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) { 3795 //Do the collision stuff 3796 game.deathseq = 30; 3797 } 3798 }else{ 3799 if (dwgfx.sprites[entities[i].drawframe].hitTest( 3800 colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) { 3801 //Do the collision stuff 3802 game.deathseq = 30; 3803 } 3804 } 3805 }else { 3806 //Ok, then we just assume a normal bounding box collision 3807 game.deathseq = 30; 3808 } 3809 } 3810 } 3811 if (entities[i].rule == 0 && entities[j].rule == 2) { //Moving platforms 3812 if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp); 3813 } 3814 if (entities[i].rule == 0 && entities[j].rule == 3) { //Entity to entity 3815 if(entities[j].onentity>0){ 3816 if (entitycollide(i, j)) entities[j].state = entities[j].onentity; 3817 } 3818 } 3819 if (entities[i].rule == 0 && entities[j].rule == 4) { //Player vs horizontal line! 3820 if(game.deathseq==-1){ 3821 //Here we compare the player's old position versus his new one versus the line. 3822 //All points either be above or below it. Otherwise, there was a collision this frame. 3823 if (entities[j].onentity > 0) { 3824 if (entityhlinecollide(i, j)) { 3825 music.playef(8,10); 3826 game.gravitycontrol = (game.gravitycontrol + 1) % 2; 3827 game.totalflips++; 3828 if (game.gravitycontrol == 0) { 3829 if (entities[i].vy < 1) entities[i].vy = 1; 3830 }else { 3831 if (entities[i].vy > -1) entities[i].vy = -1; 3832 } 3833 3834 entities[j].state = entities[j].onentity; 3835 entities[j].life = 6; 3836 } 3837 } 3838 } 3839 } 3840 if (entities[i].rule == 0 && entities[j].rule == 5) { //Player vs vertical line! 3841 if(game.deathseq==-1){ 3842 if(entities[j].onentity>0){ 3843 if (entityvlinecollide(i, j)) { 3844 entities[j].state = entities[j].onentity; 3845 entities[j].life = 4; 3846 } 3847 } 3848 } 3849 } 3850 if (entities[i].rule == 0 && entities[j].rule == 6) { //Player versus crumbly blocks! Special case 3851 if (entities[j].onentity > 0) { 3852 //ok; only check the actual collision if they're in a close proximity 3853 temp = entities[i].yp - entities[j].yp; 3854 if (temp < 30 || temp > -30) { 3855 temp = entities[i].xp - entities[j].xp; 3856 if (temp < 30 || temp > -30) { 3857 if (entitycollide(i, j)) entities[j].state = entities[j].onentity; 3858 } 3859 } 3860 } 3861 } 3862 /* 3863 if (entities[i].rule == 0 && entities[j].rule == 7){ //Player vs horizontal WARP line 3864 if (game.deathseq == -1) { 3865 if (entities[j].onentity > 0) { 3866 if (entityhlinecollide(i, j)) { 3867 entities[j].state = entities[j].onentity; 3868 entities[j].life = 4; 3869 } 3870 } 3871 } 3872 } 3873 */ 3874 } 3875 } 3876 } 3877 3878 if (game.supercrewmate) { 3879 //some extra collisions 3880 for (i = 0; i < nentity; i++) { 3881 if (entities[i].active) { 3882 for (j = 0; j < nentity; j++) { 3883 if (entities[j].active && i != j) {//Active 3884 if (entities[i].type == 14) { //i is the supercrewmate 3885 if (entities[j].rule == 1 && entities[j].harmful) {//j is a harmful enemy 3886 //player i hits enemy or enemy bullet j 3887 if (entitycollide(i, j) && !map.invincibility) { 3888 if (entities[i].size == 0 && entities[j].size == 0) { 3889 //They're both sprites, so do a per pixel collision 3890 colpoint1.x = entities[i].xp; colpoint1.y = entities[i].yp; 3891 colpoint2.x = entities[j].xp; colpoint2.y = entities[j].yp; 3892 if (dwgfx.flipmode) { 3893 if (dwgfx.flipsprites[entities[i].drawframe].hitTest( 3894 colpoint1, 1, dwgfx.flipsprites[entities[j].drawframe], colpoint2, 1)) { 3895 //Do the collision stuff 3896 game.deathseq = 30; game.scmhurt = true; 3897 } 3898 }else{ 3899 if (dwgfx.sprites[entities[i].drawframe].hitTest( 3900 colpoint1, 1, dwgfx.sprites[entities[j].drawframe], colpoint2, 1)) { 3901 //Do the collision stuff 3902 game.deathseq = 30; game.scmhurt = true; 3903 } 3904 } 3905 }else { 3906 //Ok, then we just assume a normal bounding box collision 3907 game.deathseq = 30; game.scmhurt = true; 3908 } 3909 } 3910 } 3911 if (entities[j].rule == 2) { //Moving platforms 3912 if (entitycollide(i, j)) removeblockat(entities[j].xp, entities[j].yp); 3913 } 3914 if (entities[j].type == 8 && entities[j].rule == 3) { //Entity to entity (well, checkpoints anyway!) 3915 if(entities[j].onentity>0){ 3916 if (entitycollide(i, j)) entities[j].state = entities[j].onentity; 3917 } 3918 } 3919 } 3920 } 3921 } 3922 } 3923 } 3924 } 3925 3926 //can't have the player being stuck... 3927 j = getplayer(); 3928 skipdirblocks = true; 3929 if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) { 3930 //Let's try to get out... 3931 if (entities[j].rule == 0) { 3932 if(game.gravitycontrol==0){ 3933 entities[j].yp -= 3; 3934 }else { 3935 entities[j].yp += 3; 3936 } 3937 } 3938 } 3939 skipdirblocks = false; 3940 3941 //Can't have the supercrewmate getting stuck either! 3942 if (game.supercrewmate) { 3943 j = getscm(); 3944 skipdirblocks = true; 3945 if (!testwallsx(j, map, entities[j].xp, entities[j].yp)) { 3946 //Let's try to get out... 3947 if(game.gravitycontrol==0){ 3948 entities[j].yp -= 3; 3949 }else { 3950 entities[j].yp += 3; 3951 } 3952 } 3953 skipdirblocks = false; 3954 } 3955 3956 //Is the player colliding with any damageblocks? 3957 if (checkdamage() && !map.invincibility) { 3958 //usual player dead stuff 3959 game.deathseq = 30; 3960 } 3961 3962 //how about the supercrewmate? 3963 if (game.supercrewmate) { 3964 if (scmcheckdamage() && !map.invincibility) { 3965 //usual player dead stuff 3966 game.scmhurt = true; 3967 game.deathseq = 30; 3968 } 3969 } 3970 3971 activetrigger = -1; 3972 if (checktrigger() > -1) { 3973 game.state = activetrigger; 3974 game.statedelay = 0; 3975 } 3976 } 3977 3978 public var nentity:int; 3979 public var entities:Vector.<entclass> = new Vector.<entclass>; 3980 3981 public var linecrosskludge:Vector.<entclass> = new Vector.<entclass>; 3982 public var nlinecrosskludge:int; 3983 public var colpoint1:Point, colpoint2:Point; 3984 3985 public var tempx:int, tempy:int, tempw:int, temph:int, temp:int, temp2:int; 3986 public var tpx1:int, tpy1:int, tpx2:int, tpy2:int; 3987 public var temprect:Rectangle, temprect2:Rectangle; 3988 public var i:int, j:int, k:int;// z:int; 3989 public var dx:int, dy:int, dr:int; 3990 public var px:int, py:int, linetemp:int; 3991 public var activetrigger:int; 3992 3993 public var blocks:Vector.<blockclass> = new Vector.<blockclass>; 3994 public var flags:Array = new Array; 3995 public var collect:Array = new Array; 3996 public var customcollect:Array = new Array; 3997 public var nblocks:int; 3998 public var skipblocks:Boolean, skipdirblocks:Boolean; 3999 4000 public var platformtile:int; 4001 public var vertplatforms:Boolean, horplatforms:Boolean; 4002 4003 // :( 4004 public var nearelephant:Boolean; 4005 public var upsetmode:Boolean, upset:int; 4006 4007 //Trophy Text 4008 public var trophytext:int, trophytype:int; 4009 4010 //Secret lab scripts 4011 public var altstates:int; 4012 4013 //Custom stuff 4014 public var customenemy:int; 4015 public var customplatformtile:int; 4016 public var customwarpmode:Boolean, customwarpmodevon:Boolean, customwarpmodehon:Boolean; 4017 public var customscript:String; 4018 public var customcrewmoods:Array = new Array(); 4019 4020 public var mobilemenus:Boolean = true; 4021 } 4022}