_osd_nemesis.tcl 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. set_help_text toggle_nemesis_1_shield \
  2. {This command (de)activates some Nemesis 1 toys:
  3. - A shield around the players ship: enemy bullets will bounce off this shield.
  4. - Allow to move the ship with the mouse (click right mouse button to activate, click again to disable).
  5. }
  6. namespace eval osd_nemesis {
  7. variable move_active false
  8. variable after_frame_id
  9. variable after_mouse_button_id
  10. proc toggle_nemesis_1_shield {} {
  11. if {[osd exists "nemesis1"]} {
  12. disable_nemesis_1_shield
  13. osd::display_message "Nemesis 1 shield deactivated" info
  14. } else {
  15. enable_nemesis_1_shield
  16. osd::display_message "Nemesis 1 shield activated" info
  17. }
  18. return ""
  19. }
  20. namespace export toggle_nemesis_1_shield
  21. proc disable_nemesis_1_shield {} {
  22. variable after_frame_id
  23. variable after_mouse_button_id
  24. osd destroy "nemesis1"
  25. after cancel $after_frame_id
  26. after cancel $after_mouse_button_id
  27. }
  28. proc enable_nemesis_1_shield {} {
  29. variable move_active
  30. variable after_frame_id
  31. variable after_mouse_button_id
  32. osd_widgets::msx_init "nemesis1"
  33. osd create rectangle "nemesis1.shield" \
  34. -fadeCurrent 0 -fadeTarget 0 -fadePeriod 2 \
  35. -image [data_file scripts/shield.png]
  36. set move_active false
  37. set after_frame_id [after time 0.1 osd_nemesis::after_frame]
  38. set after_mouse_button_id [after "mouse button1 down" osd_nemesis::after_mouse]
  39. }
  40. proc after_mouse {} {
  41. # click to capture and click again to release
  42. variable move_active
  43. variable after_mouse_button_id
  44. set move_active [expr {!$move_active}]
  45. set after_mouse_button_id [after "mouse button1 down" osd_nemesis::after_mouse]
  46. }
  47. proc after_frame {} {
  48. variable move_active
  49. variable after_frame_id
  50. osd_widgets::msx_update "nemesis1"
  51. if {$move_active} {
  52. # move vic viper to mouse position
  53. lassign [osd info "nemesis1" -mousecoord] x y
  54. catch { ;# when the cursor is hidden, -mousecoord won't give sane values
  55. poke 0xe206 [utils::clip 0 255 [expr {int($x)}]]
  56. poke 0xe204 [utils::clip 0 212 [expr {int($y)}]]
  57. }
  58. }
  59. # vic viper location
  60. set x [utils::clip 9 255 [peek 0xe206]]
  61. set y [utils::clip 0 192 [peek 0xe204]]
  62. osd configure "nemesis1.shield" -relx [expr {$x - 9}] -rely [expr {$y - 9}]
  63. for {set i 0} {$i < 32} {incr i} {
  64. # set base address
  65. set addr [expr {0xe300 + ($i * 0x20)}]
  66. # get enemy id
  67. set id [peek $addr]
  68. # enegry pod / flash pod / life pod / score pod /
  69. # endless score pod / explosion / end brain connections
  70. if {(17 <= $id) && ($id <= 26) && ($id != 20)} continue
  71. set a [peek [expr {$addr + 6}]]
  72. set b [peek [expr {$addr + 4}]]
  73. # Not in contact with shield? Then do nothing.
  74. if {((($a - $x + 6) ** 2) + (($b - $y + 7) ** 2)) >= 961} continue
  75. # ground turrets change into razor discs :)
  76. if {$id == 1 && $i < 16} {poke $addr 2}
  77. # homing ships and walkers
  78. if {$id == 4 || $id == 5} {poke $addr 21}
  79. # change color of sprite when in contact with shield
  80. # poke [expr {$addr + 13}] 15
  81. # Shield routine (hit front/back/top/bottom)
  82. set shieldstrength 2
  83. set dx [expr {($x > $a) ? -$shieldstrength : $shieldstrength}]
  84. set dy [expr {($y > $b) ? -$shieldstrength : $shieldstrength}]
  85. set xn [expr {$a + $dx}]
  86. set yn [expr {$b + $dy}]
  87. poke [expr {$addr + 6}] [utils::clip 0 255 $xn]
  88. poke [expr {$addr + 4}] [utils::clip 0 255 $yn]
  89. poke [expr {$addr + 8}] [expr {$dy & 255}]
  90. poke [expr {$addr + 10}] [expr {$dx & 255}]
  91. # make shield visible
  92. osd configure "nemesis1.shield" -fadeCurrent 0.5
  93. }
  94. set after_frame_id [after frame osd_nemesis::after_frame]
  95. }
  96. } ;# namespace osd_nemesis
  97. namespace import osd_nemesis::*