This file is indexed.

/usr/share/openmsx/scripts/mog-overlay.tcl is in openmsx-data 0.8.2-2.1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
namespace eval mog_overlay {

variable num_enemies 16
variable num_rocks 8
variable mog_overlay_active false
variable mog_editor_active false
variable item_cache
variable tomb_cache
variable ladder_cache
variable wall_cache
variable demon_cache
variable ep
variable mouse1_pressed

# Demon summon spells
variable spell [list \
	"" "YOMAR" "ELOHIM" "HAHAKLA" "BARECHET" "HEOTYMEO" \
	"LEPHA" "NAWABRA" "ASCHER" "XYWOLEH" "HAMALECH"]
# Demon Max Power
variable demon_power [list -1 -1 24 40 64 112 72 56 64 80 80 248]
# Item names
variable items [list \
	"" "Arrow" "Ceramic Arrow" "Rolling Fire" "Fire" "Mine" \
	"Magnifying Glass" "Holy Water" "Cape" "Magical Rod" "World Map" \
	"Cross" "Great Key" "Necklace" "Crown" "Helm" "Oar" "Boots" "Doll" \
	"Robe" "Bell" "Halo" "Candle" "Armor" "Carpet" "Helmet" "Lamp" "Vase" \
	"Pendant" "Earrings" "Bracelet" "Ring" "Bible" "Harp" "Triangle" \
	"Trumpet Shell" "Pitcher" "Sabre" "Dagger" "Feather" "Bronze Shield" \
	"Bread and Water" "Salt" "Silver Shield" "Gold Shield" \
	"Quiver of Arrows" "Coins" "Keys"]

variable enemy_names [list \
	"" "Gorilla" "Twinkle" "HorBlob" "Gate" "Fire Snake" "06" "Ring Worm" \
	"08" "09" "Knight" "Water Strider" "Sparky" "Fish" "Bat" "Pacman" \
	"Insect" "Hedgehog" "Rockman" "Cloud Demon" "Mudman" "Ill" \
	"Bird Dragon" "Egg Bird" "Worm" "Butterfly" "Snake's Fire" "Fireball" \
	"1C" "1D" "1E" "Goblin" "20" "Crawler" "Pea Shooter" "Trapwall" "Swine" \
	"Bones" "Living Helmet" "Owl" "Ectoplasm" "29" "Poltergeist" "Wizard" \
	"Shoe 1" "Frost Demon" "Bamboo Shoot" "Frog Plant" "Seahorse Demon" \
	"31" "32" "Armor's Dart" "Bally" "35" "36" "Great Butterfly" "VerBlob" \
	"39" "3A" "Moai Head Projectile" "Trickster Ghost" "Star" \
	"Flocking Bird" "3F" "Cyclop's Ghost" "41" "Maner" "Gero" "44" "45" \
	"46" "47" "48" "Huge Bat" "4A" "4B" "Fuzzball" "4D" "4E" "4F" "50" "51" \
	"Middle Bat" "Mini Bat" "Bone" "Small Bone" "Small Fireball" "57" \
	"Crab's Breath" "Seed" "5A" "5B" "Spiral Ball " "5D" "5E" "5F" "Maner's Arm" "61" \
	"Gero's Tongue" "63" "Shoe 2" "Breath" "66" "Protectors"]

set_help_text toggle_mog_overlay \
"Shows OSD widgets that help you play The Maze of Galious. Only useful if you
are actually running this game... If you are not, you may get a lot of weird
stuff on your screen :) The script shows the Great Demon summon spells, ladders
which will disappear, walls which will grow, hitpoints of enemies, hidden
items, etc.\nSee also toggle_mog_editor."

set_help_text toggle_mog_editor \
"Gives you mouse bindings to fool around in The Maze of Galious. Only useful if
you are actually running this game... If you are not, you may get a lot of
weird stuff on your screen :) With this editor, you can draw walls with one
mouse button and put Popolon on your position of choice with the other. Needs
the MoG overlay to work, see toggle_mog_overlay."

#Init Overlays
proc init {} {
	namespace import ::osd_widgets::*

	variable num_enemies
	variable num_rocks
	variable label_color
	variable label_text_color
	variable item_cache
	variable tomb_cache
	variable ladder_cache
	variable wall_cache
	variable demon_cache
	variable max_ep

	msx_init mog

	for {set i 0} {$i < $num_enemies} {incr i} {
		create_power_bar mog.powerbar$i 14 2 0xff0000ff 0x00000080 0xffffffff
	}

	create_power_bar mog.item 16 16 0x00000000 0xff770020 0xffffffff
	set item_cache 0

	osd create rectangle mog.tomb -rely 999 -w 16 -h 16 -rgba 0x00000080
	osd create text mog.tomb.text -x 1 -y 1 -size 5 -rgb 0xffffff
	set tomb_cache 0

	osd create rectangle mog.ladder -rely 999 -relw 16 -rgba 0xffffff80
	set ladder_cache 0

	osd create rectangle mog.wall -rely 999 -relw 8 -relh 24 -rgba 0x00ffff80
	set wall_cache 0

	osd create rectangle mog.wall2 -rely 999 -relw 32 -relh 24 -rgba 0x00000080
	osd create text mog.wall2.text -x 1 -y 1 -size 4 -rgb 0xffffff

	for {set i 0} {$i < $num_rocks} {incr i} {
		osd create rectangle mog.rock$i  -rely 999 -w 24 -h 4 -rgba 0x0000ff80
		osd create text mog.rock$i.text -x 0 -y 0 -size 4 -rgb 0xffffff
	}

	create_power_bar mog.demon 48 4 0x2bdd2bff 0x00000080 0xffffffff
	set demon_cache 0

	# Enemy Power
	for {set i 0} {$i < $num_enemies} {incr i} {set max_ep($i) 0}
}

# Update the overlays
proc update_overlay {} {
	variable mog_overlay_active
	variable num_enemies
	variable num_rocks
	variable label_color
	variable label_text_color
	variable item_cache
	variable tomb_cache
	variable ladder_cache
	variable wall_cache
	variable demon_cache
	variable spell
	variable demon_power
	variable items
	variable enemy_names
	variable max_ep

	if {!$mog_overlay_active} return

	#see if not in demo
	if {[peek 0xe002] != 64} {osd configure mog -y 999} else {msx_update mog}

	for {set i 0; set addr 0xe800} {$i < $num_enemies} {incr i; incr addr 0x20} {
		set enemy_type [peek $addr]
		set enemy_hp [peek [expr {$addr + 0x10}]]

		# If enemy's power is 0 set max power to 0
		if {$enemy_hp == 0 && $max_ep($i) > 0} {set max_ep($i) 0}

		if {$enemy_type > 0 && $enemy_hp > 0 && $enemy_hp < 200} {
			#Set Max Power Recorded for Enemy
			if {$max_ep($i) < $enemy_hp} {set max_ep($i) $enemy_hp}

			set pos_x [expr { 8 + [peek [expr {$addr + 7}]]}]
			set pos_y [expr {-6 + [peek [expr {$addr + 5}]]}]
			set power [expr {1.00 * $enemy_hp / $max_ep($i)}]
			set text [format "%s (%d): %d/%d" [lindex $enemy_names $enemy_type] $i $enemy_hp $max_ep($i)]
			update_power_bar mog.powerbar$i $pos_x $pos_y $power $text
		} else {
			hide_power_bar mog.powerbar$i
		}
	}

	set new_item [peek 0xe740]
	if {$new_item != $item_cache} {
		set item_cache $new_item
		if {$item_cache} {
			set height [expr {($item_cache < 7) ? 8 : 16}]
			osd configure mog.item -relh $height
			osd configure mog.item.text -text [lindex $items $item_cache]
			osd configure mog.item -relx [peek 0xe743] -rely [peek 0xe742]
		} else {
			osd configure mog.item -rely 999
		}
	}

	set new_tomb [peek 0xe678]
	if {$new_tomb != $tomb_cache} {
		set tomb_cache $new_tomb
		if {($tomb_cache > 0) && ($tomb_cache <= 10)} {
			osd configure mog.tomb.text -text "[lindex $spell $tomb_cache]"
			osd configure mog.tomb -relx [peek 0xe67a] -rely [peek 0xe679]
		} else {
			osd configure mog.tomb -rely 999
		}
	}

	#todo: see what the disappear trigger is (up, down, either)
	set new_ladder [expr {[peek 0xec00] | [peek 0xec07]}]
	if {$new_ladder != $ladder_cache} {
		set ladder_cache $new_ladder
		if {$ladder_cache != 0} {
			osd configure mog.ladder -relx [peek 0xec02] -rely [peek 0xec01] \
			                         -relh [expr {8 * ([peek 0xec03] & 31)}]
		} else {
			osd configure mog.ladder -rely 999
		}
	}

	set new_wall [peek 0xeaa0]
	if {$new_wall != $wall_cache} {
		set wall_cache $new_wall
		if {$wall_cache != 0} {
			osd configure mog.wall -relx [peek 0xeaa3] -rely [peek 0xeaa2]
		} else {
			osd configure mog.wall -rely 999
		}
	}

	if {[peek 0xea20] != 0} {
		set text [format "Wall (%02d)" [peek 0xea23]]
		osd configure mog.wall2 -relx [peek 0xea22] -rely [peek 0xea21]
		osd configure mog.wall2.text -text $text
	} else {
		osd configure mog.wall2 -rely 999
	}

	for {set i 0; set addr 0xec30} {$i < $num_rocks} {incr i; incr addr 8} {
		if {[peek $addr] > 0} {
			set pos_x [expr { 8 + [peek [expr {$addr + 3}]]}]
			set pos_y [expr {-6 + [peek [expr {$addr + 2}]]}]
			set rock_hp [peek [expr {$addr + 6}]]
			set text [format "Rock %d (%02d)" $i $rock_hp]
			osd configure mog.rock$i -relx $pos_x -rely $pos_y
			osd configure mog.rock$i.text -text $text
		} else {
			osd configure mog.rock$i -rely 999
		}
	}

	if {([peek 0xe0d2] != 0) && ([peek 0xe710] != 0)} {
		osd configure mog.demon -relx 112 -rely 26
		# let's not print text, it destroys a replay
		# print_mog_text 1 1 "Now Fighting [lindex $spell [expr {[peek 0xe041] - 1}]]"
		set new_demon [peek 0xe710]
		if {$new_demon != $demon_cache} {
			set demon_cache $new_demon
			set demon_max [lindex $demon_power [peek 0xe041]]
			if {$demon_max > 0} {
				set power [expr {$demon_cache * ([peek 0xe076] + 1.0) / $demon_max}]
				osd configure mog.demon.bar -relw $power
			}
		}
	} else {
		osd configure mog.demon -rely 999
	}

	after frame [namespace code update_overlay]
}

# better don't use this if you want to keep your replay OK
proc print_mog_text {x y text} {
	set text [string tolower $text]
	for {set i 0} {$i < [string length $text]} {incr i} {
		scan [string range $text $i $i]] "%c" ascii
		incr ascii -86
		if {$ascii >= -38 && $ascii <= -29} {incr ascii 39}
		if {$ascii < 0} {set ascii 0}
		poke [expr {0xed80 + $x + $y * 32 + $i}] $ascii
	}
}

proc toggle_mog_overlay {} {
	variable mog_overlay_active
	variable mog_editor_active

	set mog_overlay_active [expr !$mog_overlay_active]

	if {$mog_overlay_active} {
		init
		update_overlay
		return "MoG overlay activated!"
	} else {
		set retval ""
		if {$mog_editor_active} {
			set retval "[toggle_mog_editor]\n"
		}
		osd destroy mog
		return "${retval}MoG overlay deactivated."
	}
}

# MoG editor
# Separated from MoG overlay, because the overlay is useful for TASing and the
# editor will ruin your replay

proc draw_block {} {
	osd_widgets::msx_update "mog"
	lassign [osd info "mog" -mousecoord] x y
	poke [expr {0xed80 + int($x / 8) + int(($y - 32) / 8) * 32}] 240
	if {$mog_overlay::mouse1_pressed} {after frame mog_overlay::draw_block}
}

proc put_popolon {} {
	osd_widgets::msx_update "mog"
	lassign [osd info "mog" -mousecoord] x y
	poke 0xe507 [utils::clip 0 255 [expr {int($x)}]]
	poke 0xe505 [utils::clip 0 212 [expr {int($y)}]]
}

proc toggle_mog_editor {} {
	variable mog_editor_active
	variable mog_overlay_active

	if {!$mog_editor_active && !$mog_overlay_active} {
		error "You need to have the MoG overlay active to use this editor!"
	}

	set mog_editor_active [expr {!$mog_editor_active}]

	if {$mog_editor_active} {
		bind_default "mouse button1 down" {
			set mog_overlay::mouse1_pressed true
			mog_overlay::draw_block
		}

		bind_default "mouse button1 up" {
			set mog_overlay::mouse1_pressed false
		}

		bind_default "mouse button3 down" {
			mog_overlay::put_popolon
		}
		return "MoG editor activated!"
	} else {
		unbind_default "mouse button1 down"
		unbind_default "mouse button1 up"
		unbind_default "mouse button3 down"
		return "MoG editor deactivated."
	}
	return ""
}

namespace export toggle_mog_overlay
namespace export toggle_mog_editor

};# namespace mog_overlay

namespace import mog_overlay::*