PageRenderTime 30ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/Scage/src-blamer/su/msk/dunno/blame/screens/Blamer.scala

http://scage.googlecode.com/
Scala | 150 lines | 125 code | 18 blank | 7 comment | 7 complexity | 6745fd2333fc259cb3d4d6dcd4cf1a34 MD5 | raw file
  1. package su.msk.dunno.blame.screens
  2. import su.msk.dunno.screens.ScageScreen
  3. import su.msk.dunno.scage.support.messages.ScageMessage._
  4. import su.msk.dunno.screens.support.ScageLibrary._
  5. import org.lwjgl.input.Keyboard
  6. import su.msk.dunno.scage.support.Vec
  7. import su.msk.dunno.blame.field.FieldTracer
  8. import su.msk.dunno.blame.field.tiles.{Door, Wall, Floor}
  9. import su.msk.dunno.screens.prototypes.ScageRender
  10. import su.msk.dunno.screens.handlers.Renderer
  11. import su.msk.dunno.blame.support.{BottomMessages, TimeUpdater, GenLib}
  12. import su.msk.dunno.blame.livings.{SiliconCreature, Cibo, Killy}
  13. import su.msk.dunno.blame.decisions._
  14. object Blamer extends ScageScreen(
  15. screen_name = "Blamer",
  16. is_main_screen = true,
  17. properties = "blame-properties.txt") {
  18. val right_messages_width = property("rightmessages.width", 200)
  19. // map
  20. private val maze = GenLib.CreateStandardDunegon(FieldTracer.N_x, FieldTracer.N_y)
  21. (0 to FieldTracer.N_x-1).foreachpair(0 to FieldTracer.N_y-1)((i, j) => {
  22. maze(i)(j) match {
  23. case '#' => new Wall(i, j)
  24. case '.' => new Floor(i, j)
  25. case ',' => new Floor(i, j)
  26. case '+' => new Door(i, j)
  27. case _ =>
  28. }
  29. })
  30. // players
  31. private var is_play_cibo = false
  32. val killy = FieldTracer.randomPassablePoint() match {
  33. case Some(point) => new Killy(point)
  34. case None => {
  35. log.error("failed to place killy to the field, the programm will exit")
  36. System.exit(1)
  37. null
  38. }
  39. }
  40. val cibo = FieldTracer.randomPassablePoint(killy.getPoint - Vec(2,2), killy.getPoint + Vec(2,2)) match {
  41. case Some(point) => new Cibo(point)
  42. case None => {
  43. log.error("failed to place cibo to the field, the programm will exit")
  44. System.exit(1)
  45. null
  46. }
  47. }
  48. def currentPlayer = if(is_play_cibo) cibo else killy
  49. // enemies
  50. (1 to 50).foreach(i => {
  51. FieldTracer.randomPassablePoint() match {
  52. case Some(point) => new SiliconCreature(point)
  53. case None =>
  54. }
  55. })
  56. // controls on main screen
  57. private var is_key_pressed = false
  58. private var pressed_start_time:Long = 0
  59. private def repeatTime = {
  60. if(is_key_pressed) {
  61. if(System.currentTimeMillis - pressed_start_time > 600) 100
  62. else 300
  63. }
  64. else 300
  65. }
  66. private def move(point:Vec) = {
  67. if(!is_key_pressed) {
  68. is_key_pressed = true
  69. pressed_start_time = System.currentTimeMillis
  70. }
  71. TimeUpdater.addDecision(new Move(currentPlayer, point))
  72. }
  73. keyListener(Keyboard.KEY_NUMPAD9, repeatTime, onKeyDown = move(Vec(1,1)), onKeyUp = is_key_pressed = false)
  74. keyListener(Keyboard.KEY_UP, repeatTime, onKeyDown = move(Vec(0,1)), onKeyUp = is_key_pressed = false)
  75. keyListener(Keyboard.KEY_NUMPAD8, repeatTime, onKeyDown = move(Vec(0,1)), onKeyUp = is_key_pressed = false)
  76. keyListener(Keyboard.KEY_NUMPAD7, repeatTime, onKeyDown = move(Vec(-1,1)), onKeyUp = is_key_pressed = false)
  77. keyListener(Keyboard.KEY_RIGHT, repeatTime, onKeyDown = move(Vec(1,0)), onKeyUp = is_key_pressed = false)
  78. keyListener(Keyboard.KEY_NUMPAD6, repeatTime, onKeyDown = move(Vec(1,0)), onKeyUp = is_key_pressed = false)
  79. keyListener(Keyboard.KEY_NUMPAD5, repeatTime, onKeyDown = move(Vec(0,0)), onKeyUp = is_key_pressed = false)
  80. keyListener(Keyboard.KEY_LEFT, repeatTime, onKeyDown = move(Vec(-1,0)), onKeyUp = is_key_pressed = false)
  81. keyListener(Keyboard.KEY_NUMPAD4, repeatTime, onKeyDown = move(Vec(-1,0)), onKeyUp = is_key_pressed = false)
  82. keyListener(Keyboard.KEY_NUMPAD3, repeatTime, onKeyDown = move(Vec(1,-1)), onKeyUp = is_key_pressed = false)
  83. keyListener(Keyboard.KEY_DOWN, repeatTime, onKeyDown = move(Vec(0,-1)), onKeyUp = is_key_pressed = false)
  84. keyListener(Keyboard.KEY_NUMPAD2, repeatTime, onKeyDown = move(Vec(0,-1)), onKeyUp = is_key_pressed = false)
  85. keyListener(Keyboard.KEY_NUMPAD1, repeatTime, onKeyDown = move(Vec(-1,-1)), onKeyUp = is_key_pressed = false)
  86. keyListener(Keyboard.KEY_O, onKeyDown = TimeUpdater.addDecision(new OpenDoor(currentPlayer)))
  87. keyListener(Keyboard.KEY_C, onKeyDown = TimeUpdater.addDecision(new CloseDoor(currentPlayer)))
  88. keyListener(Keyboard.KEY_F, onKeyDown = TimeUpdater.addDecision(new PlayerShoot(currentPlayer)))
  89. keyListener(Keyboard.KEY_I, onKeyDown = TimeUpdater.addDecision(new OpenInventory(currentPlayer)))
  90. keyListener(Keyboard.KEY_W, onKeyDown = TimeUpdater.addDecision(new OpenWeapon(currentPlayer)))
  91. keyListener(Keyboard.KEY_D, onKeyDown = TimeUpdater.addDecision(new DropItem(currentPlayer)))
  92. keyListener(Keyboard.KEY_COMMA, onKeyDown = TimeUpdater.addDecision(new PickUpItem(currentPlayer)))
  93. keyListener(Keyboard.KEY_TAB, onKeyDown = is_play_cibo = !is_play_cibo)
  94. keyListener(Keyboard.KEY_ESCAPE, onKeyDown = allStop)
  95. private lazy val help_screen = new ScageScreen("Help Screen") {
  96. keyListener(Keyboard.KEY_ESCAPE, onKeyDown = stop)
  97. addRender(new ScageRender {
  98. override def interface = {
  99. print(xml("helpscreen.tutorial.keys"), 10, Renderer.height-20)
  100. print(xml("helpscreen.tutorial.description"), 300, Renderer.height-65)
  101. print(xml("helpscreen.helpmessage"), 10, row_height, GREEN)
  102. }
  103. })
  104. }
  105. keyListener(Keyboard.KEY_F1, onKeyDown = help_screen.run)
  106. keyListener(Keyboard.KEY_T, onKeyDown = TimeUpdater.addDecision(new IssueCommand(currentPlayer)))
  107. // render on main screen
  108. windowCenter = Vec((width - right_messages_width)/2,
  109. BottomMessages.bottom_messages_height + (height - BottomMessages.bottom_messages_height)/2)
  110. center = FieldTracer.pointCenter(currentPlayer.getPoint)
  111. Renderer.backgroundColor = BLACK
  112. def drawInterface = {
  113. //messages on the right side of the screen
  114. print(currentPlayer.stat("name"), width - right_messages_width, height-25, WHITE)
  115. print("FPS: "+Renderer.fps, width - right_messages_width, height-45, WHITE)
  116. print("time: "+TimeUpdater.time, width - right_messages_width, height-65, WHITE)
  117. print("HP: "+currentPlayer.intStat("health"), width - right_messages_width, height-85, WHITE)
  118. print("Follow: "+currentPlayer.boolStat("follow"), width - right_messages_width, height-105, WHITE)
  119. print("Attack: "+currentPlayer.boolStat("attack"), width - right_messages_width, height-125, WHITE)
  120. }
  121. addRender(new ScageRender {
  122. override def render = FieldTracer.drawField(currentPlayer.getPoint)
  123. override def interface = {
  124. BottomMessages.showBottomMessages(0)
  125. drawInterface
  126. }
  127. })
  128. // initial message
  129. BottomMessages.addPropMessage("mainscreen.openhelp")
  130. BottomMessages.addPropMessage("greetings.helloworld", currentPlayer.stat("name"))
  131. def main(args:Array[String]):Unit = run
  132. }