phaser.inc.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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. for (var i = 0; i <= 6; i++) game.load.image('meter-'+i, 'includes/ui/meter-'+i+'.png');
  43. }
  44. function create() {
  45. game.stage.backgroundColor = 0xDDDDDD;
  46. grpDevices = game.add.group();
  47. grpPackets = game.add.group();
  48. grpLaunchers = game.add.group();
  49. document.getElementById('pane').style.left = (vpWidth * 0.7) + 'px';
  50. document.getElementById('pane').style.width = (vpWidth * 0.3 - 40) + 'px';
  51. document.getElementById('pane').style.height = (vpHeight - 40) + 'px';
  52. <?php if (LOGGEDIN) { ?>
  53. pause = game.add.sprite(80, 20, 'pause');
  54. play = game.add.sprite(140, 20, 'play');
  55. fast = game.add.sprite(200, 20, 'fast');
  56. game.add.button(20, 20, 'reset', btnReset);
  57. pause_ = game.add.button(80, 20, 'pause_', btnPause);
  58. play_ = game.add.button(140, 20, 'play_', btnPlay);
  59. fast_ = game.add.button(200, 20, 'fast_', btnFast);
  60. createLaunchers();
  61. fast_.visible = false;
  62. <?php } ?>
  63. for (var i = 0; i < level.devices.length; i++) {
  64. 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');
  65. level.devices[i].sprite = devSprite;
  66. if (level.devices[i].hasOwnProperty("capacity")) {
  67. level.devices[i].capsprite = grpDevices.create(0.7 * game.world.width * level.devices[i].x + 128, game.world.height * level.devices[i].y, 'meter-0');
  68. }
  69. devices[level.devices[i].id] = level.devices[i];
  70. devices[level.devices[i].id].ports = [];
  71. devices[level.devices[i].id].locked = false;
  72. devSprite.inputEnabled = true;
  73. devSprite.events.onInputDown.add(onDeviceClick, level.devices[i]);
  74. }
  75. var graphics = game.add.graphics(0,0);
  76. graphics.lineStyle(1, 0, 0);
  77. graphics.lineTo(1,1);
  78. graphics.lineStyle(1, 0x000000, 1);
  79. for (var i = 0; i < level.links.length; i++) {
  80. var src = devices[level.links[i].src];
  81. var dst = devices[level.links[i].dst];
  82. src.ports[ level.links[i].srcport ] = dst.id;
  83. dst.ports[ level.links[i].dstport ] = src.id;
  84. graphics.moveTo(src.sprite.centerX, src.sprite.centerY);
  85. graphics.lineTo(dst.sprite.centerX, dst.sprite.centerY);
  86. }
  87. var meshSprite = game.add.sprite(0, 0, graphics.generateTexture());
  88. meshSprite.sendToBack();
  89. graphics.destroy();
  90. if (!level.hasOwnProperty("triggers")) level.triggers = [];
  91. $("#loading").hide();
  92. <?php if (LOGGEDIN) { ?>
  93. game.input.keyboard.onPressCallback = function(e){ if (e == " ") {
  94. if (game.paused) {
  95. if (game.time.slowMotion == 1) btnFast();
  96. else btnPlay();
  97. } else btnPause();
  98. }};
  99. loadPlayerPackets();
  100. btnReset();
  101. <?php } else { ?>
  102. $("input[type=submit").button();
  103. initEvents();
  104. <?php } ?>
  105. }
  106. function initEvents() {
  107. for (var i = 0; i < level.timeline.length; i++) {
  108. game.time.events.add(level.timeline[i].at * 3, playPacket, level.timeline[i]);
  109. }
  110. }
  111. function playPacket() {
  112. doPacketAnimation(this.from, getDefaultRecipient(this.from), this.payload);
  113. }
  114. function getDefaultRecipient(from) {
  115. for (var i = 0; i < level.links.length; i++) {
  116. if (level.links[i].src == from) return level.links[i].dst;
  117. else if (level.links[i].dst == from) return level.links[i].src;
  118. }
  119. return null;
  120. }
  121. function getPortRecipient(from, portNum) {
  122. for (var i = 0; i < level.links.length; i++) {
  123. if (level.links[i].src == from && level.links[i].srcport == portNum) return level.links[i].dst;
  124. if (level.links[i].dst == from && level.links[i].dstport == portNum) return level.links[i].src;
  125. }
  126. return null;
  127. }
  128. // WARNING: this should only be called by the animator
  129. // devicescripts should not be able to access it
  130. function getRemotePort(src, dst) {
  131. for (var i = 0; i < level.links.length; i++) {
  132. if (level.links[i].src == src && level.links[i].dst == dst) return level.links[i].dstport;
  133. if (level.links[i].src == dst && level.links[i].dst == src) return level.links[i].srcport;
  134. }
  135. }
  136. function update() {
  137. //todo: separate out the meter-X updates from satisfiesTrigger
  138. for (var i = 0; i < level.triggers.length; i++) {
  139. if (level.triggers[i].type == "flood") {
  140. satisfiesTrigger({dst: level.triggers[i].device}, {type:"flood",device:level.triggers[i].device,noup:true});
  141. }
  142. }
  143. }
  144. var levelOver = false;
  145. function donePacket() {
  146. this.kill();
  147. var youWin = true;
  148. for (var i = 0; i < level.triggers.length; i++) {
  149. if (satisfiesTrigger(this, level.triggers[i])) {
  150. if (level.triggers[i].hasOwnProperty("times")) {
  151. if (--level.triggers[i].times <= 0) level.triggers[i].completed = true;
  152. } else level.triggers[i].completed = true;
  153. }
  154. if (!level.triggers[i].hasOwnProperty("completed")) youWin = false;
  155. }
  156. if (!levelOver && youWin) {
  157. levelOver = true;
  158. $.get("./solns.ajax.php?level="+levelid+"&method=win");
  159. $("#winner").dialog({
  160. title:"You win!",
  161. resizable:false,
  162. modal:true,
  163. buttons:[{text:"Go to the next level", click:function(){ location.href="./?level="+level.nextLevel; }}]
  164. });
  165. }
  166. if (devices[this.dst].hasOwnProperty("script")) {
  167. devices[this.dst].script.onPacketReceived(devices[this.dst], this.payload, this.portNum);
  168. }
  169. }
  170. function satisfiesTrigger(pkt, t) {
  171. if (pkt.dst != t.device) return false;
  172. if (t.type == "packet") {
  173. if (!t.hasOwnProperty("payload") && !t.hasOwnProperty("times")) return true;
  174. if (!pkt.hasOwnProperty("payload")) return false;
  175. var layers = t.hasOwnProperty("payload") ? Object.keys(t.payload) : [];
  176. for (var i = 0; i < layers.length; i++) {
  177. if (!pkt.payload.hasOwnProperty(layers[i])) return false;
  178. var fields = Object.keys(t.payload[ layers[i] ]);
  179. for (var j = 0; j < fields.length; j++) {
  180. if (!pkt.payload[ layers[i] ].hasOwnProperty(fields[j])) return false;
  181. if (pkt.payload[ layers[i] ][ fields[j] ].trim().toLowerCase() != t.payload[ layers[i] ][ fields[j] ].trim().toLowerCase()) return false;
  182. }
  183. }
  184. return true;
  185. } else if (t.type == "flood") {
  186. if (!devices[t.device].hasOwnProperty("floodCounter")) {
  187. devices[t.device].floodCounter = 0;
  188. devices[t.device].floodLast = 0;
  189. }
  190. var delta = game.time.events.ms - devices[t.device].floodLast;
  191. if (t.noup && devices[t.device].floodCounter > 0) {
  192. if (delta > 200) {
  193. devices[t.device].floodCounter--;
  194. devices[t.device].floodLast = game.time.events.ms;
  195. }
  196. } else if (delta < 120 / devices[t.device].capacity) {
  197. devices[t.device].floodCounter++;
  198. if (devices[t.device].floodCounter > 30) devices[t.device].floodCounter = 30;
  199. } else {
  200. devices[t.device].floodCounter -= Math.floor(delta / (120 / devices[t.device].capacity));
  201. if (devices[t.device].floodCounter < 0) devices[t.device].floodCounter = 0;
  202. }
  203. if (!t.noup) devices[t.device].floodLast = game.time.events.ms;
  204. devices[t.device].capsprite.loadTexture('meter-'+Math.floor( devices[t.device].floodCounter / 5 ));
  205. return devices[t.device].floodCounter == 30;
  206. } else {
  207. console.log("unknown trigger type: "+t.type);
  208. return false;
  209. }
  210. }