phaser.inc.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 vpWidth = window.innerWidth || document.documentElement.clientWidth || document.getElementsByTagName('body')[0].clientWidth;
  7. var vpHeight = window.innerHeight|| document.documentElement.clientHeight|| document.getElementsByTagName('body')[0].clientHeight;
  8. var game = new Phaser.Game(vpWidth, vpHeight, Phaser.AUTO, 'game', { preload: preload, create: create, update: update });
  9. var grpPackets;
  10. var grpDevices;
  11. var grpLaunchers;
  12. var pause, pause_, play, play_, fast, fast_;
  13. function preload() {
  14. game.load.image('imac', 'includes/imac.png');
  15. game.load.image('iphone-1', 'includes/iphone-1.png');
  16. game.load.image('macbook', 'includes/macbook.png');
  17. game.load.image('monitor', 'includes/monitor.png');
  18. game.load.image('packet', 'includes/circle.png');
  19. game.load.image('server', 'includes/server.png');
  20. game.load.image('reset', 'includes/ui/reset.png');
  21. game.load.image('pause', 'includes/ui/pause.png');
  22. game.load.image('pause_', 'includes/ui/pause_grey.png');
  23. game.load.image('play', 'includes/ui/play.png');
  24. game.load.image('play_', 'includes/ui/play_grey.png');
  25. game.load.image('fast', 'includes/ui/fast.png');
  26. game.load.image('fast_', 'includes/ui/fast_grey.png');
  27. game.load.image('edit', 'includes/ui/tabs.png');
  28. game.load.image('launch', 'includes/ui/launch.png');
  29. game.load.image('add', 'includes/ui/add.png');
  30. }
  31. function create() {
  32. game.stage.backgroundColor = 0xDDDDDD;
  33. grpDevices = game.add.group();
  34. grpPackets = game.add.group();
  35. grpLaunchers = game.add.group();
  36. document.getElementById('pane').style.left = (vpWidth * 0.7) + 'px';
  37. document.getElementById('pane').style.width = (vpWidth * 0.3 - 40) + 'px';
  38. document.getElementById('pane').style.height = (vpHeight - 40) + 'px';
  39. <?php if (LOGGEDIN) { ?>
  40. pause = game.add.sprite(80, 20, 'pause');
  41. play = game.add.sprite(140, 20, 'play');
  42. fast = game.add.sprite(200, 20, 'fast');
  43. game.add.button(20, 20, 'reset', btnReset);
  44. pause_ = game.add.button(80, 20, 'pause_', btnPause);
  45. play_ = game.add.button(140, 20, 'play_', btnPlay);
  46. fast_ = game.add.button(200, 20, 'fast_', btnFast);
  47. createLaunchers();
  48. fast_.visible = false;
  49. <?php } ?>
  50. for (var i = 0; i < level.devices.length; i++) {
  51. 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');
  52. level.devices[i].sprite = devSprite;
  53. devices[level.devices[i].id] = level.devices[i];
  54. devices[level.devices[i].id].ports = [];
  55. devSprite.inputEnabled = true;
  56. devSprite.events.onInputDown.add(onDeviceClick, level.devices[i]);
  57. }
  58. var graphics = game.add.graphics(0,0);
  59. graphics.lineStyle(1, 0, 0);
  60. graphics.lineTo(1,1);
  61. graphics.lineStyle(1, 0x000000, 1);
  62. for (var i = 0; i < level.links.length; i++) {
  63. var src = devices[level.links[i].src];
  64. var dst = devices[level.links[i].dst];
  65. src.ports[ level.links[i].srcport ] = dst.id;
  66. dst.ports[ level.links[i].dstport ] = src.id;
  67. graphics.moveTo(src.sprite.centerX, src.sprite.centerY);
  68. graphics.lineTo(dst.sprite.centerX, dst.sprite.centerY);
  69. }
  70. var meshSprite = game.add.sprite(0, 0, graphics.generateTexture());
  71. meshSprite.sendToBack();
  72. graphics.destroy();
  73. if (!level.hasOwnProperty("triggers")) level.triggers = [];
  74. <?php if (LOGGEDIN) { ?>
  75. game.input.keyboard.onPressCallback = function(e){ if (e == " ") {
  76. if (game.paused) {
  77. if (game.time.slowMotion == 1) btnFast();
  78. else btnPlay();
  79. } else btnPause();
  80. }};
  81. loadPlayerPackets();
  82. btnReset();
  83. <?php } else { ?>
  84. $("input[type=submit").button();
  85. initEvents();
  86. <?php } ?>
  87. }
  88. function initEvents() {
  89. for (var i = 0; i < level.timeline.length; i++) {
  90. game.time.events.add(level.timeline[i].at * 3, playPacket, level.timeline[i]);
  91. }
  92. }
  93. function playPacket() {
  94. doPacketAnimation(this.from, getDefaultRecipient(this.from), this.payload);
  95. }
  96. function getDefaultRecipient(from) {
  97. for (var i = 0; i < level.links.length; i++) {
  98. if (level.links[i].src == from) return level.links[i].dst;
  99. else if (level.links[i].dst == from) return level.links[i].src;
  100. }
  101. return null;
  102. }
  103. function update() {
  104. }
  105. function donePacket() {
  106. this.kill();
  107. for (var i = 0; i < level.triggers.length; i++) {
  108. if (satisfiesTrigger(this, level.triggers[i])) {
  109. $.get("./solns.ajax.php?level="+levelid+"&method=win");
  110. $("#winner").dialog({
  111. title:"You win!",
  112. resizable:false,
  113. modal:true,
  114. buttons:[{text:"Go to the next level", click:function(){ location.href="./?level="+level.nextLevel; }}]
  115. });
  116. }
  117. }
  118. if (devices[this.dst].hasOwnProperty("script")) {
  119. devices[this.dst].script.onPacketReceived(devices[this.dst], this.payload);
  120. }
  121. }
  122. function satisfiesTrigger(pkt, t) {
  123. if (pkt.dst != t.device) return false;
  124. if (!t.hasOwnProperty("payload")) return true;
  125. return pkt.payload.network.dstip == t.payload.network.dstip && pkt.payload.network.srcip == t.payload.network.srcip;
  126. }