phaser.inc.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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. "payload"
  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('reset', 'includes/ui/reset.png');
  32. game.load.image('pause', 'includes/ui/pause.png');
  33. game.load.image('pause_', 'includes/ui/pause_grey.png');
  34. game.load.image('play', 'includes/ui/play.png');
  35. game.load.image('play_', 'includes/ui/play_grey.png');
  36. game.load.image('fast', 'includes/ui/fast.png');
  37. game.load.image('fast_', 'includes/ui/fast_grey.png');
  38. game.load.image('edit', 'includes/ui/tabs.png');
  39. game.load.image('launch', 'includes/ui/launch.png');
  40. game.load.image('add', 'includes/ui/add.png');
  41. }
  42. function create() {
  43. game.stage.backgroundColor = 0xDDDDDD;
  44. grpDevices = game.add.group();
  45. grpPackets = game.add.group();
  46. grpLaunchers = game.add.group();
  47. document.getElementById('pane').style.left = (vpWidth * 0.7) + 'px';
  48. document.getElementById('pane').style.width = (vpWidth * 0.3 - 40) + 'px';
  49. document.getElementById('pane').style.height = (vpHeight - 40) + 'px';
  50. <?php if (LOGGEDIN) { ?>
  51. pause = game.add.sprite(80, 20, 'pause');
  52. play = game.add.sprite(140, 20, 'play');
  53. fast = game.add.sprite(200, 20, 'fast');
  54. game.add.button(20, 20, 'reset', btnReset);
  55. pause_ = game.add.button(80, 20, 'pause_', btnPause);
  56. play_ = game.add.button(140, 20, 'play_', btnPlay);
  57. fast_ = game.add.button(200, 20, 'fast_', btnFast);
  58. createLaunchers();
  59. fast_.visible = false;
  60. <?php } ?>
  61. for (var i = 0; i < level.devices.length; i++) {
  62. 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');
  63. level.devices[i].sprite = devSprite;
  64. devices[level.devices[i].id] = level.devices[i];
  65. devices[level.devices[i].id].ports = [];
  66. devSprite.inputEnabled = true;
  67. devSprite.events.onInputDown.add(onDeviceClick, level.devices[i]);
  68. }
  69. var graphics = game.add.graphics(0,0);
  70. graphics.lineStyle(1, 0, 0);
  71. graphics.lineTo(1,1);
  72. graphics.lineStyle(1, 0x000000, 1);
  73. for (var i = 0; i < level.links.length; i++) {
  74. var src = devices[level.links[i].src];
  75. var dst = devices[level.links[i].dst];
  76. src.ports[ level.links[i].srcport ] = dst.id;
  77. dst.ports[ level.links[i].dstport ] = src.id;
  78. graphics.moveTo(src.sprite.centerX, src.sprite.centerY);
  79. graphics.lineTo(dst.sprite.centerX, dst.sprite.centerY);
  80. }
  81. var meshSprite = game.add.sprite(0, 0, graphics.generateTexture());
  82. meshSprite.sendToBack();
  83. graphics.destroy();
  84. if (!level.hasOwnProperty("triggers")) level.triggers = [];
  85. <?php if (LOGGEDIN) { ?>
  86. game.input.keyboard.onPressCallback = function(e){ if (e == " ") {
  87. if (game.paused) {
  88. if (game.time.slowMotion == 1) btnFast();
  89. else btnPlay();
  90. } else btnPause();
  91. }};
  92. loadPlayerPackets();
  93. btnReset();
  94. <?php } else { ?>
  95. $("input[type=submit").button();
  96. initEvents();
  97. <?php } ?>
  98. }
  99. function initEvents() {
  100. for (var i = 0; i < level.timeline.length; i++) {
  101. game.time.events.add(level.timeline[i].at * 3, playPacket, level.timeline[i]);
  102. }
  103. }
  104. function playPacket() {
  105. doPacketAnimation(this.from, getDefaultRecipient(this.from), this.payload);
  106. }
  107. function getDefaultRecipient(from) {
  108. for (var i = 0; i < level.links.length; i++) {
  109. if (level.links[i].src == from) return level.links[i].dst;
  110. else if (level.links[i].dst == from) return level.links[i].src;
  111. }
  112. return null;
  113. }
  114. function update() {
  115. }
  116. function donePacket() {
  117. this.kill();
  118. for (var i = 0; i < level.triggers.length; i++) {
  119. if (satisfiesTrigger(this, level.triggers[i])) {
  120. $.get("./solns.ajax.php?level="+levelid+"&method=win");
  121. $("#winner").dialog({
  122. title:"You win!",
  123. resizable:false,
  124. modal:true,
  125. buttons:[{text:"Go to the next level", click:function(){ location.href="./?level="+level.nextLevel; }}]
  126. });
  127. }
  128. }
  129. if (devices[this.dst].hasOwnProperty("script")) {
  130. devices[this.dst].script.onPacketReceived(devices[this.dst], this.payload);
  131. }
  132. }
  133. function satisfiesTrigger(pkt, t) {
  134. if (pkt.dst != t.device) return false;
  135. if (!t.hasOwnProperty("payload")) return true;
  136. if (!pkt.hasOwnProperty("payload")) return false;
  137. var layers = Object.keys(t.payload);
  138. for (var i = 0; i < layers.length; i++) {
  139. if (!pkt.payload.hasOwnProperty(layers[i])) return false;
  140. var fields = Object.keys(t.payload[ layers[i] ]);
  141. for (var j = 0; j < fields.length; j++) {
  142. if (!pkt.payload[ layers[i] ].hasOwnProperty(fields[j])) return false;
  143. if (pkt.payload[ layers[i] ][ fields[j] ] != t.payload[ layers[i] ][ fields[j] ]) return false;
  144. }
  145. }
  146. return true;
  147. }