File: _osd_nemesis.tcl

package info (click to toggle)
openmsx 20.0%2Bdfsg-1.2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 27,544 kB
  • sloc: cpp: 236,922; xml: 49,948; tcl: 15,056; python: 5,385; perl: 281; sh: 77; makefile: 53
file content (123 lines) | stat: -rw-r--r-- 3,527 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
set_help_text toggle_nemesis_1_shield \
{This command (de)activates some Nemesis 1 toys:
 - A shield around the players ship: enemy bullets will bounce off this shield.
 - Allow to move the ship with the mouse (click right mouse button to activate, click again to disable).
}

namespace eval osd_nemesis {

variable move_active false
variable after_frame_id
variable after_mouse_button_id

proc toggle_nemesis_1_shield {} {
	if {[osd exists "nemesis1"]} {
		disable_nemesis_1_shield
		message "Nemesis 1 shield deactivated" info
	} else {
		enable_nemesis_1_shield
		message "Nemesis 1 shield activated" info
	}
	return ""
}
namespace export toggle_nemesis_1_shield

proc disable_nemesis_1_shield {} {
	variable after_frame_id
	variable after_mouse_button_id

	osd destroy "nemesis1"
	after cancel $after_frame_id
	after cancel $after_mouse_button_id
}

proc enable_nemesis_1_shield {} {
	variable move_active
	variable after_frame_id
	variable after_mouse_button_id

	osd_widgets::msx_init "nemesis1"
	osd create rectangle "nemesis1.shield" \
		-fadeCurrent 0 -fadeTarget 0 -fadePeriod 2 \
		-image [data_file scripts/shield.png]

	set move_active false

	set after_frame_id [after time 0.1 osd_nemesis::after_frame]
	set after_mouse_button_id [after "mouse button1 down" osd_nemesis::after_mouse]
}

proc after_mouse {} {
	# click to capture and click again to release
	variable move_active
	variable after_mouse_button_id
	set move_active [expr {!$move_active}]
	set after_mouse_button_id [after "mouse button1 down" osd_nemesis::after_mouse]
}

proc after_frame {} {
	variable move_active
	variable after_frame_id

	osd_widgets::msx_update "nemesis1"

	if {$move_active} {
		# move vic viper to mouse position
		lassign [osd info "nemesis1" -mousecoord] x y
		catch { ;# when the cursor is hidden, -mousecoord won't give sane values
			poke 0xe206 [utils::clip 0 255 [expr {int($x)}]]
			poke 0xe204 [utils::clip 0 212 [expr {int($y)}]]
		}
	}

	# vic viper location
	set x [utils::clip 9 255 [peek 0xe206]]
	set y [utils::clip 0 192 [peek 0xe204]]
	osd configure "nemesis1.shield" -relx [expr {$x - 9}] -rely [expr {$y - 9}]

	for {set i 0} {$i < 32} {incr i} {
		# set base address
		set addr [expr {0xe300 + ($i * 0x20)}]

		# get enemy id
		set id [peek $addr]

		# enegry pod / flash pod / life pod / score pod /
		# endless score pod / explosion / end brain connections
		if {(17 <= $id) && ($id <= 26) && ($id != 20)} continue

		set a [peek [expr {$addr + 6}]]
		set b [peek [expr {$addr + 4}]]

		# Not in contact with shield? Then do nothing.
		if {((($a - $x + 6) ** 2) + (($b - $y + 7) ** 2)) >= 961} continue

		# ground turrets change into razor discs :)
		if {$id == 1 && $i < 16} {poke $addr 2}

		# homing ships and walkers
		if {$id == 4 || $id == 5} {poke $addr 21}

		# change color of sprite when in contact with shield
		# poke [expr {$addr + 13}] 15

		# Shield routine (hit front/back/top/bottom)
		set shieldstrength 2
		set dx [expr {($x > $a) ? -$shieldstrength : $shieldstrength}]
		set dy [expr {($y > $b) ? -$shieldstrength : $shieldstrength}]
		set xn [expr {$a + $dx}]
		set yn [expr {$b + $dy}]
		poke [expr {$addr +  6}] [utils::clip 0 255 $xn]
		poke [expr {$addr +  4}] [utils::clip 0 255 $yn]
		poke [expr {$addr +  8}] [expr {$dy & 255}]
		poke [expr {$addr + 10}] [expr {$dx & 255}]

		# make shield visible
		osd configure "nemesis1.shield" -fadeCurrent 0.5
	}
	set after_frame_id [after frame osd_nemesis::after_frame]
}

} ;# namespace osd_nemesis

namespace import osd_nemesis::*