phaser.inc.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. var DEFAULT_GAMESPEED = 3;
  2. var levelid = <?=$leveldata['id']?>;
  3. var level = <?php include 'levels/'.$leveldata['filename'].'.json'; ?>;
  4. var devices = {};
  5. var playerPackets = [];
  6. var packetFields = [
  7. {layer:"network", fields:[
  8. "srcip", "dstip"
  9. ]},
  10. {layer:"transport", fields:[
  11. "proto", "ttl"
  12. ]},
  13. {layer:"application", fields:[
  14. "type", "key"
  15. ]}
  16. ];
  17. var vpWidth = window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
  18. var vpHeight = window.innerHeight|| document.documentElement.clientHeight|| document.getElementsByTagName('body')[0].clientHeight;
  19. var game = new Phaser.Game(vpWidth, vpHeight, Phaser.AUTO, 'game', { preload: preload, create: create, update: update });
  20. var grpPackets;
  21. var grpDevices;
  22. var grpLaunchers;
  23. var pause, pause_, play, play_, fast, fast_;
  24. function preload() {
  25. game.load.image('imac', 'includes/imac.png');
  26. game.load.image('iphone-1', 'includes/iphone-1.png');
  27. game.load.image('macbook', 'includes/macbook.png');
  28. game.load.image('monitor', 'includes/monitor.png');
  29. game.load.image('packet', 'includes/circle.png');
  30. game.load.image('server', 'includes/server.png');
  31. game.load.image('router', 'includes/router.png');
  32. game.load.image('reset', 'includes/ui/reset.png');
  33. game.load.image('pause', 'includes/ui/pause.png');
  34. game.load.image('pause_', 'includes/ui/pause_grey.png');
  35. game.load.image('play', 'includes/ui/play.png');
  36. game.load.image('play_', 'includes/ui/play_grey.png');
  37. game.load.image('fast', 'includes/ui/fast.png');
  38. game.load.image('fast_', 'includes/ui/fast_grey.png');
  39. game.load.image('edit', 'includes/ui/tabs.png');
  40. game.load.image('launch', 'includes/ui/launch.png');
  41. game.load.image('add', 'includes/ui/add.png');
  42. }
  43. function create() {
  44. game.stage.backgroundColor = 0xDDDDDD;
  45. grpDevices = game.add.group();
  46. grpPackets = game.add.group();
  47. grpLaunchers = game.add.group();
  48. document.getElementById('pane').style.left = (vpWidth * 0.7) + 'px';
  49. document.getElementById('pane').style.width = (vpWidth * 0.3 - 40) + 'px';
  50. document.getElementById('pane').style.height = (vpHeight - 40) + 'px';
  51. <?php if (LOGGEDIN) { ?>
  52. pause = game.add.sprite(80, 20, 'pause');
  53. play = game.add.sprite(140, 20, 'play');
  54. fast = game.add.sprite(200, 20, 'fast');
  55. game.add.button(20, 20, 'reset', btnReset);
  56. pause_ = game.add.button(80, 20, 'pause_', btnPause);
  57. play_ = game.add.button(140, 20, 'play_', btnPlay);
  58. fast_ = game.add.button(200, 20, 'fast_', btnFast);
  59. createLaunchers();
  60. fast_.visible = false;
  61. <?php } ?>
  62. for (var i = 0; i < level.devices.length; i++) {
  63. var devSprite = grpDevices.create(0.7 * game.world.width * level.devices[i].x, game.world.height * level.devices[i].y, level.devices[i].image || 'imac');
  64. level.devices[i].sprite = devSprite;
  65. devices[level.devices[i].id] = level.devices[i];
  66. devices[level.devices[i].id].ports = [];
  67. devSprite.inputEnabled = true;
  68. devSprite.events.onInputDown.add(onDeviceClick, level.devices[i]);
  69. }
  70. var graphics = game.add.graphics(0,0);
  71. graphics.lineStyle(1, 0, 0);
  72. graphics.lineTo(1,1);
  73. graphics.lineStyle(1, 0x000000, 1);
  74. for (var i = 0; i < level.links.length; i++) {
  75. var src = devices[level.links[i].src];
  76. var dst = devices[level.links[i].dst];
  77. src.ports[ level.links[i].srcport ] = dst.id;
  78. dst.ports[ level.links[i].dstport ] = src.id;
  79. graphics.moveTo(src.sprite.centerX, src.sprite.centerY);
  80. graphics.lineTo(dst.sprite.centerX, dst.sprite.centerY);
  81. }
  82. var meshSprite = game.add.sprite(0, 0, graphics.generateTexture());
  83. meshSprite.sendToBack();
  84. graphics.destroy();
  85. if (!level.hasOwnProperty("triggers")) level.triggers = [];
  86. $("#loading").hide();
  87. <?php if (LOGGEDIN) { ?>
  88. game.input.keyboard.onPressCallback = function(e){ if (e == " ") {
  89. if (game.paused) {
  90. if (game.time.slowMotion == 1) btnFast();
  91. else btnPlay();
  92. } else btnPause();
  93. }};
  94. loadPlayerPackets();
  95. btnReset();
  96. <?php } else { ?>
  97. $("input[type=submit").button();
  98. initEvents();
  99. <?php } ?>
  100. }
  101. function initEvents() {
  102. for (var i = 0; i < level.timeline.length; i++) {
  103. game.time.events.add(level.timeline[i].at * 3, playPacket, level.timeline[i]);
  104. }
  105. }
  106. function playPacket() {
  107. doPacketAnimation(this.from, getDefaultRecipient(this.from), this.payload);
  108. }
  109. function getDefaultRecipient(from) {
  110. for (var i = 0; i < level.links.length; i++) {
  111. if (level.links[i].src == from) return level.links[i].dst;
  112. else if (level.links[i].dst == from) return level.links[i].src;
  113. }
  114. return null;
  115. }
  116. function getPortRecipient(from, portNum) {
  117. for (var i = 0; i < level.links.length; i++) {
  118. if (level.links[i].src == from && level.links[i].srcport == portNum) return level.links[i].dst;
  119. if (level.links[i].dst == from && level.links[i].dstport == portNum) return level.links[i].src;
  120. }
  121. return null;
  122. }
  123. // WARNING: this should only be called by the animator
  124. // devicescripts should not be able to access it
  125. function getRemotePort(src, dst) {
  126. for (var i = 0; i < level.links.length; i++) {
  127. if (level.links[i].src == src && level.links[i].dst == dst) return level.links[i].dstport;
  128. if (level.links[i].src == dst && level.links[i].dst == src) return level.links[i].srcport;
  129. }
  130. }
  131. function update() {
  132. }
  133. var levelOver = false;
  134. function donePacket() {
  135. this.kill();
  136. var youWin = true;
  137. for (var i = 0; i < level.triggers.length; i++) {
  138. if (satisfiesTrigger(this, level.triggers[i])) {
  139. if (level.triggers[i].hasOwnProperty("times")) {
  140. if (--level.triggers[i].times <= 0) level.triggers[i].completed = true;
  141. } else level.triggers[i].completed = true;
  142. }
  143. if (!level.triggers[i].hasOwnProperty("completed")) youWin = false;
  144. }
  145. if (!levelOver && youWin) {
  146. levelOver = true;
  147. $.get("./solns.ajax.php?level="+levelid+"&method=win");
  148. $("#winner").dialog({
  149. title:"You win!",
  150. resizable:false,
  151. modal:true,
  152. buttons:[{text:"Go to the next level", click:function(){ location.href="./?level="+level.nextLevel; }}]
  153. });
  154. }
  155. if (devices[this.dst].hasOwnProperty("script")) {
  156. devices[this.dst].script.onPacketReceived(devices[this.dst], this.payload, this.portNum);
  157. }
  158. }
  159. function satisfiesTrigger(pkt, t) {
  160. if (pkt.dst != t.device) return false;
  161. if (!t.hasOwnProperty("payload") && !t.hasOwnProperty("times")) return true;
  162. if (!pkt.hasOwnProperty("payload")) return false;
  163. var layers = t.hasOwnProperty("payload") ? Object.keys(t.payload) : [];
  164. for (var i = 0; i < layers.length; i++) {
  165. if (!pkt.payload.hasOwnProperty(layers[i])) return false;
  166. var fields = Object.keys(t.payload[ layers[i] ]);
  167. for (var j = 0; j < fields.length; j++) {
  168. if (!pkt.payload[ layers[i] ].hasOwnProperty(fields[j])) return false;
  169. if (pkt.payload[ layers[i] ][ fields[j] ].trim().toLowerCase() != t.payload[ layers[i] ][ fields[j] ].trim().toLowerCase()) return false;
  170. }
  171. }
  172. return true;
  173. }