Plotlite.hsd

This file has not been updated to to match the latest version of plotscr.hsd
This is an alternative HSD file for use with OHRRPGCE, and is invented by User:Zzo38, who agrees to post in public domain if possible.
This file is imported instead of plotscr.hsd; you should not import both files. HSpeak will automatically include plotscr.hsd; you should pass the -b commandline argument to HSpeak to prevent this. (Note that if plotscr.hsd isn't included then you will need to explicitly include scancode.hsi.) Also, it is intended to be imported using shell scripts rather than through CUSTOM, and not using the "export .hsi" option. It is meant to work with numeric scripts, attacks, menus, etc rather than the named ones. You can use HAMARC to delete the COMMANDS.BIN, SCRIPTS.TXT, and SCRIPTS.BIN lumps from the compiled .HSP file, since those lumps are unnecessary and take up extra space; HAMARC is also used to splice the compiled scripts into the .RPG file.
This file uses shorter names for most functions, as well as sometimes multiples each with different defaults, and will result in smaller compiled files. There are also a few predefined scripts:
- GENSET: Set a general bitset, using the GB: constants. (For example GENSET(GB:CATERPILLAR) enables caterpillar mode.)
- GENCLEAR: Clear a general bitset, using the GB: constants.
- ILAST: Get the index of the last inventory slot.
- EQDEL: Clears an equipment slot, without affecting the contents of the inventory. (UNEQUIP is a built-in which is similar but adds the removed item to the inventory.)
- EQSET: Set the contents of an equipment slot, without affecting the contents of the inventory. (If the item to set in the slot is NOITEM then it acts the same as EQDEL.) (DOEQUIP is a built-in which is similar but takes it out of the inventory, and puts into the inventory the item that used to be equipped, if any.)
- STRSAVE: Allocates a hidden slice to save a string and returns the ID number for restoring it with.
- STRLOAD: Given the string number to write into, and the ID number returned by STRSAVE, reload the saved string. After doing this, the saved ID number is no longer valid.
Note: When downloading this file it is necessary to delete the <pre> tag and stuff above it, as well as the final </pre> tag.
# PLOTLITE.HSD
# Use same capitalisation as HSpeak does, pad to length 3
PLOTSCRVERSION("3P ","3P ")
DEFINEFUNCTION(
0,NOOP,0 # no operation
1,WAIT,1,1 # wait specified number of ticks
2,AWAIT,0 # wait for everything to stop moving
3,HWAIT,1,0 # wait for hero to stop moving
4,NWAIT,1,0 # wait for NPC to stop moving
5,NPCMOVE-OFF,0 # stop NPC movement
6,CONTROL-OFF,0 # turn off default controls except textboses
7,NPCMOVE-ON,0 # undo NPCMOVE-OFF
8,CONTROL-ON,0 # undo CONTROL-OFF
9,KEYWAIT,1,99 # wait for a key and return the scancode
10,HWALK,3,0,2,1 # Cause hero to walk (who,dir,count)
11,TEXTBOX,1,1 # Display a text box (script continues)
12,TSET?,1,0 # Check if a tag is set
13,TSET,2,0,1 # Set a tag
13,TCLEAR,2,0,0 # Clear a tag
15,ENTER,1,0 # Activate a door
16,BATTLE,1,0 # Call a battle formation; return true if you win
17,IINC,2,0,1 # Increase quantity of item in inventory
18,IDEC,2,0,1 # Decrease quantity of item in inventory
19,LEADER,0 # Current leader ID
20,MINC,1,1 # Increase money
21,MDEC,1,1 # Decrease money
22,MDEC?,1,1 # If you can afford it, decrease money and return true
23,UNEQUIP,2,0,1 # Unequip slot (who,slot)
24,DOEQUIP,3,0,1,0 # Equip slot (who,slot,item)
27,OVERLAY-OFF,0 # Turn off overlay, making them normal tiles instead
28,MUSIC,1,0 # Play music
29,MUSIC-STOP,0 # Stop music
30,KEYCODE,1,0 # Tell you the state of a key
32,BACKDROP,1,0 # Show a .MXS picture instead of the map
33,BACKDROP-OFF,0 # Turn off the BACKDROP
34,DISMOUNT,0 # Dismount the active vehicle
40,PAN,3,0,1,2 # Pan the camera (dir,dist,speed)
41,CFOCUS,3,0,0,2 # Cause camera to move to a point (x,y,speed)
42,CWAIT,0 # Wait until camera is finished moving
43,HEROX,1,0 # Hero X coordinate (who)
44,HEROY,1,0 # Hero Y coordinate (who)
45,NPCX,1,0 # NPC X coordinate (who)
46,NPCY,1,0 # NPC Y coordinate (who)
49,WALL-OFF,0 # Let hero walk through walls
51,WALL-ON,0 # Prevents hero from walking through walls
52,NWALK,3,0,2,1 # Cause NPC to walk (who,dir,count)
53,HFACE,2,0,2 # Set hero facing (who,dir)
54,NFACE,2,0,2 # Set NPC facing (who,dir)
59,BOXWAIT,0 # Wait until no textboxes are open
60,EQSLOT?,2,0,0 # Where it can be equipped (who,item)
61,TELEPORT,3,0,0,0 # Teleport to (map,x,y)
62,BATTLE-OFF,0 # Turn off foemap battles
63,BATTLE-ON,0 # Turn on foemap battles
64,HSGET,3,0,0,0 # Get current hero stat (who,stat)
64,HSMGET,3,0,0,1 # Get maximum hero stat (who,stat)
64,HSBGET,3,0,0,2 # Get base hero stat (who,stat)
64,LEVELGET,3,0,12,0 # Get hero level (who)
65,OVERLAY-ON,0 # Turn back on overlay disabled by OVERLAY-OFF
66,HADD,1,0 # Add a hero to the party
67,HDEL,1,0 # Delete a hero from the party
68,HOUT,1,0 # Swap out a hero
69,HIN,1,0 # Swap in a party
70,PARTY?,0 # Number of free slots in active party
71,HLOCK,1,0 # Lock a hero
72,HUNLOCK,1,0 # Unlock a hero
73,QUIT,0 # Quit; return to title screen if not bypassed in gen
74,ONDEATH,1,0 # Set script to run when all heros is dead
75,FADEOUT,3,0,0,0 # Fade out screen (r,g,b) (range 0-63)
76,FADEIN,0 # Fade in the screen
77,SHOWNUM,1,0 # Display a number in the bottom-left corner
78,NPCPUT,3,0,0,0 # Write to NPC registers (who,which,data)
79,SHOWOFF,0 # Turn off SHOWNUM
80,MAP,0 # Current map ID
81,HSPEED,2,0,4 # Set speed of hero movement (who,speed)
82,INVENTORY?,1,0 # How many you have in the inventory
83,HSPUT,4,0,0,0,0 # Put current hero stat (who,stat,value)
83,HSMPUT,4,0,0,0,1 # Put maximum hero stat (who,stat,value)
83,HSBPUT,4,0,0,0,2 # Put base hero stat (who,stat,value)
84,TBA-OFF,0 # Turn off manual control of text box advancing
85,TBA-ON,0 # Resume manual control of text box advancing
86,TBA,0 # Advance the text box
87,HPLACE,3,0,0,0 # Place hero (who,x,y)
88,NPLACE,3,0,0,0 # Place NPC (who,x,y)
89,HSWAP,2,0,0 # Swap two hero slots
90,HFIND,1,0 # Find slot number of hero (who)
91,EQGET,2,0,1 # Look at equipment (who,slot)
96,HZPUT,2,0,0 # Set hero jump height (who,height)
97,TILEGET,3,0,0,0 # Get tile at (x,y,layer)
98,TILEPUT,4,0,0,0,0 # Put tile at (x,y,value,layer)
99,WALLGET,2,0,0 # Get passability at (x,y)
100,WALLPUT,3,0,0,0 # Put passability at (x,y,value)
101,NDGET,1,0 # Get NPC direction
102,HDGET,1,0 # Get PC direction
108,RANDOMIZE,1,0 # Random seed
110,HPICPUT,3,0,0,1
111,HPALPUT,3,0,0,1
112,HPICGET,2,0,1
113,HPALGET,2,0,1
114,VALUE,1,0 # Read script global by index
115,SET,2,0,0 # Write script global by index (var,value)
116,WALKING?,1,0 # Check if hero is walking (who)
118,FOLLOW-OFF,0 # Turn off automatic caterpillar movement
119,FOLLOW-ON,0 # Turn on automatic caterpillar movement
120,NPC,2,0,0 # Get a reference to a NPC (id,num)
121,NPCAT,3,0,0,0 # Get NPC at (x,y,which if multiples)
121,NPCATCOUNT,3,0,0,-1 # How many NPCs at (x,y)
122,NPCIDGET,1,0
123,NPCCOUNT,1,0 # How many of specified NPC is on map (id)
124,NPCIDPUT,2,0,0 # Set ID of an NPC (who,id)
125,NPCNEW,4,0,0,0,2
126,NPCDEL,1,0 # Delete a NPC
127,SPTEACH,2,0,0 # Teach a spell if learnable by item (who,attack+1)
128,SPFORGET,2,0,0 # Hero forgets a spell (who,attack+1)
129,SPGET,3,0,0,0 # Read spell slot (who,list,slot)
130,SPPUT,4,0,0,0,0 # Write spell slot (who,list,slot,attack+1)
131,SPKNOWN?,2,0,0 # Check if spell known (who,attack+1)
132,SPLEARN?,3,0,0,0 # Check if spell learnable by item (who,attack+1)
133,SLOTHID,1,0 # Get hero ID by slot
134,RANKHID,1,0 # Get hero ID by marching order
135,PUTHEROP,3,0,0,0
136,PUTNPCP,3,0,0,0
137,CAMSETP,2,0,0
138,HEROPX,1,0
139,HEROPY,1,0
140,NPCPX,1,0
141,NPCPY,1,0
142,CAMPX,0
143,CAMPY,0
144,TILESET,2,-1,-1
145,ASKHERO,0 # Ask which hero you want, returns -1 if canceled
146,NAMEHERO,1,0 # Ask the name of the hero
147,GENGET,1,0 # Read general data
148,GENPUT,2,0,0 # Write to general data
150,STATUSSCREEN,1,0 # Status screen for specified hero
151,MINIMAP,0 # Show entire map in small view
152,SPELLS,1,0 # Spells menu for specified hero
153,ITEMS,0 # Display inventory menu
154,EQUIP,1,-1 # Display equipment menu (who)
157,ORDER,0 # Display order menu
158,TEAM,0 # Display team menu
159,MOUSEON,0 # Enable mouse functions
160,MOUSEX,0
161,MOUSEY,0
162,BUTTON?,0 # Check if mouse button is pushed
163,MWARP,2,160,100 # Set position of mouse pointer
164,MOUSE-LIMIT,4,-1,-1,-1,-1
166,SAVE,1,0 # Save game in specified slot
167,SAVELAST,0
170,ASKSAVE,1,0 # Ask which slot to save (doesn't actually save)
171,SAVED?,1,1 # Tells if a save game exists
172,SAVEGET,3,1,-1,-1
173,SAVEPUT,3,1,0,16383
174,RESTORE,1,1 # Restore a save game
175,DELSAVE,1,1 # Delete a save game
176,CALL,-1 # Call a script dynamically (script,args...)
178,MAPGET,1,0
179,MAPPUT,2,0,0
180,MAPWIDTH,1,-1 # Get width of map
181,MAPHEIGHT,1,-1 # Get height of map
182,NPCGET,2,0,0
183,LEVELPUT,3,0,0,1 # Set hero level (who,level)
183,LEVELPUTNF,3,0,0,0 # As above but remember spells if level down
184,XPADD,2,-1,1 # Add experience to hero (who,amount)
185,LEVELUP?,1,0 # Check if specified hero levelled up
187,VOLGET,0 # Get current volume
188,VOLPUT,1,128 # Set current volume
193,NPCEXGET,2,0,1 # Get NPC extra data 0-2 (who,ext)
194,NPCEXPUT,3,0,1,0 # Put NPC extra data 0-2 (who,ext,value)
197,SOUND,3,1,0,0 # Play sound (id,loop,preempt)
198,SOUND-PAUSE,1,1 # Pause sound (id)
199,SOUND-STOP,1,1 # Stop and rewind sound (id)
200,RTCH,0 # Real-time-clock hours
201,RTCM,0 # Real-time-clock minutes
202,RTCS,0 # Real-time-clock seconds
203,SONG,0 # Current song playing
204,STRHERO,2,0,0 # Hero name (str,who)
205,HRENAME,2,0,0 # Change name of hero by script (str,who)
206,STRITEM,2,0,0 # Name of item (str,item)
207,STRMAP,2,0,0 # Name of map (str,map)
210,SHOWSTR,1,0 # Show string in bottom-left (str)
211,STRCLEAR,1,0 # Clear a string
212,STRAPP,2,0,0 # Append character to string (str,char)
213,STRAPPN,2,0,0 # Append number to string (str,num)
214,STRCOPY,2,0,0 # Copy string (dest,src)
215,STRCAT,2,0,0 # Concatenate string (dest,src)
216,STRLEN,1,0 # Length of string (str)
217,STRDEL,2,0,1 # Delete character from string (str,pos)
218,STRPUT,3,0,1,0 # Set character in string (str,pos,char)
219,STRGET,2,0,1 # Get character from string (str,pos)
220,STRMOVE,3,0,0,0 # Set string position on screen (str,x,y)
221,STRSHOW,3,0,0,1 # Make string visible (str)
221,STRHIDE,3,0,0,0 # Make string invisible (str)
221,STRFLAT,3,0,1,1 # Make string flat (no outline) (str)
221,STROUTLINE,3,0,1,0 # Make string with outline (str)
222,STRSHOWN?,2,0,0 # Check if string is visible (str)
222,STRFLAT?,2,0,1 # Check if string is flat (str)
223,STRCOLOR,3,0,15,0 # Set color of string (str,fg,bg)
226,RTCDAY,0 # Real-time-clock days
227,RTCMO,0 # Real-time-clock months
228,RTCY,0 # Real-time-clock years (Anno Domini)
229,STREQ?,2,1,0 # Check if two strings match (str1,str2)
230,EGET,2,0,0 # Enemy get (id,which)
231,EPUT,3,0,0,0 # Enemy put (id,which,value)
232,TRACE,1,0 # Write string to debug file
233,STRSONG,2,0,0 # Get name of song (str,song)
235,KEY?,2,0,0 # Is the key pushed now or previous tick? (key,stick)
236,SOUND?,1,0 # Tell you if the sound is playing
238,STRLOOK,3,0,0,1 # Search in the string (str1,str2,start)
239,STRTRIM,3,0,-1,1 # Trim string (str,start,length)
241,STREXP,1,0 # Expand a string like a textbox does
242,JBUTTON?,2,0,0 # Tell you if joystick button pushed (button,stick)
243,JAXIS,3,0,100,0 # Joystick axis (axis,mult,stick)
244,SCANWAIT,1,0 # Wait for a key by scancode
249,GOLD,0
250,SETGOLD,1,0
251,setstringfromtable,2,0,0
252,appendstringfromtable,2,0,0
256,AUTOMUSIC-OFF,0 # Disable auto changing music when moving to a map
257,AUTOMUSIC-ON,0 # Undo AUTOMUSIC-OFF
258,HBLOCKED?,2,0,0 # Check if hero is blocked (who,dir)
259,NBLOCKED?,2,0,0 # Check if NPC is blocked (who,dir)
260,TIMER,6,0,-1,-1,-1,-1,-1 # Set timer (id,count,speed,trig,str,flag)
260,TIMERNORM,6,0,-1,-1,-1,-1,0 # Set a normal timer
260,TIMERCRIT,6,0,-1,-1,-1,-1,3 # Set a critical timer
260,TIMERCRITM,6,0,-1,-1,-1,-1,7 # Set a critical timer (incl. menu)
260,TIMERBAT,6,0,-1,-1,-1,-1,2 # Set a battle-inclusive timer
260,TIMERBATM,6,0,-1,-1,-1,-1,6 # Set a battle-inclusive timer (menu)
262,TIMER?,1,0 # Check timer count; false if expired
265,RGB,3,0,0,0 # Make RGB value (r,g,b)
269,XPGET,1,0 # Total experience of hero (who)
270,XPTO,1,0 # Experience to reach level from lv.0 (level)
271,XPNEXT,1,0 # How much experience needed for next level (who)
272,XPPUTF,3,0,0,1 # Set experience, allow forgetting (who,value)
272,XPPUTR,3,0,0,0 # Set experience, remembering spells (who,value)
274,MENU,2,0,0 # Show menu (id)
274,MENUDUP,2,0,1 # Show another copy even if the menu is already open
275,MENUGET,2,0,0
276,MENUPUT,3,0,0,0
277,MIGET,2,0,0 # Menu item get
278,MIPUT,3,0,0,0 # Menu item put
279,MNEW,0 # Make up a new blank menu
280,MDEL,1,0 # Delete a menu created with MNEW
281,MTOP?,0 # Handle to top menu; false if no menu is open
282,MFRONT,1,0 # Move to front
283,MADD,1,0 # Add menu item (menuh)
284,MIDEL,1,0 # Delete menu item (itemh)
286,MITEXT,2,0,0 # Set menu caption (itemh,str)
287,SSGET,2,0,0 # Get Vancian MP (who,row)
288,SSPUT,3,0,0,0 # Set Vancian MP (who,row,value)
289,MBOT?,0
290,MBELOW?,1,0 # Get menu below this one (false if none)
291,MABOVE?,1,0 # Get menu above this one (false if none)
292,MSITEM,3,0,0,0 # Menu item by slot (menuh,slot,visibleonly)
293,MIPREV?,2,0,1 # Get previous menu item (false if none)
294,MINEXT?,2,0,1 # Get next menu item (false if none)
295,MCURSOR,1,-1 # Where is the cursor (menuh)
296,MISELECT,1,0 # Move menu cursor (itemh)
297,MILOC,1,0 # Get menu that an item belongs to (itemh)
302,MOPEN?,1,0 # Check if menu handle is valid
303,MISLOT,1,0
304,ATTACK,3,0,0,-1 # Execute OOB attack (attack,target,user)
308,FADD,5,0,0,85,95,-1
309,FFIND,3,0,0,0
310,FDEL,2,0,0
314,FBGSET,4,0,0,1,0
315,FBGGET,1,0
316,FLAST,0 # Last formation fought
317,FRANDOM,1,0 # Pick a random formation from a set
320,CURBOX,0 # Current textbox number (NOITEM if none)
322,SPNEW0,2,0,-1 # Create a PT0 sprite slice (picture,palette)
324,SLPOS,3,0,0,0 # Set position of slice (slice,x,y)
327,SPCHANGE0,3,0,0,-1 # Change sprite into PT0 (slice,picture,pal)
328,SPFSET,2,0,0 # Sprite frame number (slice,frame)
329,SPNEW4,2,0,-1
330,SPCHANGE4,3,0,0,-1
331,SPNEW5,2,0,-1
332,SPCHANGE5,3,0,0,-1
333,SPNEW1,2,0,-1
334,SPCHANGE1,3,0,0,-1
335,SPNEW2,2,0,-1
336,SPCHANGE2,3,0,0,-1
337,SPNEW3,2,0,-1
338,SPCHANGE3,3,0,0,-1
339,SPNEW6,2,0,-1
340,SPCHANGE6,3,0,0,-1
341,SPNEW7,2,0,-1
342,SPCHANGE7,3,0,0,-1
343,SPNEW8,2,0,-1
344,SPCHANGE8,3,0,0,-1
345,SPCLONE,2,0,0 # Create a new slice with the same sprite (slice)
346,SPFGET,1,0 # Get sprite frame (slice)
348,SLXGET,1,0 # Get slice X position (slice)
349,SLYGET,1,0
350,SLXPUT,2,0,0 # Put slice X position (slice,value)
351,SLYPUT,2,0,0 # Put slice Y position (slice,value)
352,SLWGET,1,0
353,SLHGET,1,0
360,DEFCON,0 # Default container for created sprites
361,SLFREE,1,0 # Delete a slice (slice)
362,SLFIRST,1,0 # First child slice (slice)
363,SLNEXT,1,0 # Next sibling slice (slice)
364,SLNEWCON,2,0,0 # New container slice (width,height)
365,SLINSET,2,0,0
366,SLIN?,2,0,0
367,SLXSCR,1,0
368,SLYSCR,1,0
370,SLNEWRECT,3,0,0,-1 # New rectangular slice (width,height,style)
372,SLWPUT,2,0,0 # Put slice width (slice,value)
373,SLHPUT,2,0,0 # Put slice height (slice,value)
374,SLSTGET,1,0 # Get rect style (slice)
375,SLSTPUT,2,0,0 # Put rect style (slice,style)
382,SLTRANS?,1,0 # Get translucency of rect slice (slice)
383,SLSOLID,2,0,0 # Set rect translucency to solid (slice)
383,SLFUZZY,2,0,1 # Set rect translucency to fuzzy (slice)
383,SLHOLLOW,2,0,2 # Set rect translucency to hollow (slice)
384,SLAT?,3,0,0,0 # Check if slice hits point (slice,x,y)
385,SLHIT?,2,0,0 # Check if two slices collide (slice1,slice2)
386,SLCIN?,2,0,0 # Check if slice2 is positioned inside slice1
387,SLCLAMP,2,0,0 # Clamp slice1's position to be inside slice2
400,SLFILL,2,0,1 # Make slice fill parent (slice)
400,SLNOFILL,2,0,0 # Turn off slice fill parent (slice)
401,SLFILL?,1,0 # Check if slice is filling parent
402,SLFRONT,1,0 # Move slice to front
403,SLBACK,1,0 # Move slice to back
405,SLYSORT,1,0 # Sort children of slice by Y coordinates
406,SLOPUT,2,0,0 # Set priority of slice; deferred until SLSORT
407,SLSORT,2,0,1 # Sort children as defined by SLOPUT and reset values
407,SLSORTNW,2,0,0 # As SLSORT but SLOPUT values aren't reset
409,SLOGET,1,0 # Read back value set by SLOPUT
410,SLEXGET,2,0,0 # Read extra 0-2 data from a slice (slice,ext)
411,SLEXPUT,3,0,0,0 # Write extra data to a slice (slice,ext,value)
412,SPTYPE,1,0
413,SPID,1,0
414,SPPGET,1,0
415,TPAUSE,0 # Pause all timers
416,TRESUME,0 # Resume timers paused by TPAUSE
417,SLSHOW,2,0,1 # Make a slice visible (slice)
417,SLHIDE,2,0,0 # Make a slice invisible (slice)
418,SLSHOWN?,1,0 # Query visibility of slice (slice)
419,SLEX,2,0,0
420,SLEY,2,0,0
421,SLNEWTEXT,0 # Make a new text slice
422,SLPUTTEXT,2,0,0 # Set text of slice (slice,str)
423,SLTCGET,1,0 # Get text color (slice)
424,SLTCPUT,2,0,0 # Put text color (slice,color)
425,SLWRAP?,1,0 # Query text wrapping (slice)
426,SLWRAP,2,0,1 # Set slice to wrap text (slice)
426,SLNOWRAP,2,0,0 # Set slice to don't wrap text (slice)
428,SLBGGET,1,0 # Get background color of text slice (slice)
429,SLBGPUT,2,0,0 # Put background color of text slice (slice)
430,SLOL?,1,0 # Check if text has outline (slice)
431,SLOLSET,2,0,1 # Turn on text outline (slice)
431,SLOLCLEAR,2,0,0 # Turn off text outline (slice)
432,MIACT,1,0 # Activate menu item (itemh)
435,SLLOC,1,0 # Parent of a slice (slice)
436,SLCOUNT,1,0 # Number of children of a slice (slice)
437,SLLOOK,2,0,0 # Find slice by lookup code (code,slice)
438,RESTART,0 # Restart the entire game
439,SLVALID?,1,0
440,IGET,1,0 # Read inventory item (invslot)
441,IPUT,2,0,0 # Set inventory item (invslot,item)
442,IGETCOUNT,1,0 # Read inventory count (invslot)
443,IPUTCOUNT,2,0,0 # Set inventory count (invslot,count)
445,SPELLUP,2,0,1 # Update spells learned by level (who,forget)
446,SLBELOW,2,0,0
447,SLABOVE,2,0,0
451,SLCLIP,2,0,1 # Make slice to clip children
451,SLNOCLIP,2,0,0 # Make slice to don't clip children
452,SLCLIP?,1,0
453,SLNEWGRID,4,0,0,1,1 # Make a grid slice (width,height,rows,cols)
455,SLGCPUT,2,0,1 # Put grid columns (slice,value)
456,SLGCGET,1,0 # Get grid columns (slice)
457,SLGRPUT,2,0,1 # Put grid rows (slice,value)
458,SLGRGET,1,0 # Get grid rows (slice)
461,SLLOAD,1,0 # Load a slice collection (id)
464,SLCODEGET,1,0
465,SLCODEPUT,2,0,0 # Set a slice's lookup code (slice,data)
468,STRATT,2,0,0 # Name of attack (str,attack+1)
470,TALLOC,1,16 # Set number of timers
480,ZSET?,3,0,0,0 # Check if tile has zone (zone,x,y)
481,ZSET,4,0,0,0,1 # Add zone to tile (zone,x,y)
481,ZCLEAR,4,0,0,0,0 # Remove zone from tile (zone,x,y)
483,ZCOUNT,1,0 # How many tiles in a zone (zone)
487,STRZONE,2,0,0 # Get zone name (str,zone)
488,ZXGET,2,0,0
489,ZXPUT,3,0,0,0
490,USEITEM,1,0 # Activate effect of item (item)
491,USESLOT,1,0 # Use item of inventory (invslot)
492,CLICKED?,1,0
493,SPNEWMXS,1,0 # Make a backdrop slice (id)
494,SPCHANGEMXS,2,0,-1 # Change into a backdrop slice (slice,id)
495,SPTRANS?,1,0 # Check if sprite is transparent (slice)
496,SPTRANS,2,0,1 # Make sprite transparent (slice)
496,SPOPAQUE,2,0,0 # Make sprite opaque (slice)
497,HERPUT,3,-1,0,100 # Set base hero element resist (who,elem,percent)
498,HERGET,2,-1,0 # Get base hero element resist (who,elem)
499,HERTGET,2,-1,0 # Get calculated hero element resist (who,elem)
516,CHECKPT,0 # In autotest mode, write out checkpoint data
519,SLHERO,1,0 # Slice representing hero walkabout
520,SLNPC,1,0 # Slice representing NPC walkabout
521,DXGET,1,0 # Get X coordinate of a door
522,DYGET,1,0 # Get Y coordinate of a door
523,DDIDGET,1,0 # Get destination door ID of a door
524,DMAPGET,1,0 # Get destination map ID of a door
525,DOOR?,1,0 # Check if a door exists
530,STRSLICE,2,0,0 # Load slice text into a string (str,slice)
531,INPUT,1,0 # Read typed text into a string (str)
532,INPUT-ON,1,1 # Allow INPUT working
532,INPUT-OFF,1,0 # Turn off INPUT
533,INPUT-ON?,0 # Check if text input is turned on
544,HZGET,1,0 # Get hero Z coordinate (who)
545,HSCGET,1,0 # Read stat cap (stat)
546,HSCPUT,2,0,0 # Write stat cap (stat,value)
547,IMSGET,1,0 # Get maximum stack size of an item (item)
548,NZGET,1,0 # Read NPC Z (npc)
549,NZPUT,2,0,0 # Write NPC Z (npc,value)
550,DOORAT,2,0,0 # Door at tile (x,y) (NOITEM if there is no door)
551,DOORS-OFF,0 # Cause doors to stop working
552,DOORS-ON,0 # Cause doors to work normally
)
DEFINETRIGGER(
0,SCRIPT
)
DEFINECONSTANT(
# General data constants
0,GEN:MAXMAP
1,GEN:TITLE
2,GEN:TITLEMUS
3,GEN:VICTMUS
4,GEN:BATMUS
26,GEN:PT0
27,GEN:PT1
28,GEN:PT2
29,GEN:PT3
30,GEN:PT4
31,GEN:PT5
32,GEN:PT6
33,GEN:MAXTILE
34,GEN:MAXATTACK
35,GEN:MAXHERO
36,GEN:MAXENEMY
37,GEN:MAXFORM
38,GEN:MAXPAL
39,GEN:MAXSAY
41,GEN:START
42,GEN:QUIT
43,GEN:MAXSCRIPT
44,GEN:SUSPEND
45,GEN:CAMERA
46,GEN:CAMERA1
47,GEN:CAMERA2
48,GEN:CAMERA3
49,GEN:CAMERA4
50,GEN:SCRBACK
51,GEN:DAYS
52,GEN:HOURS
53,GEN:MINUTES
54,GEN:SECONDS
55,GEN:MAXVEH
57,GEN:RESTORE
58,GEN:TBB
59,GEN:DISSOLVE
60,GEN:JOY
61,GEN:PIND
62,GEN:SIND
63,GEN:DAMAGECAP
64,GEN:MIND
65,GEN:CAP-HP
66,GEN:CAP-MP
67,GEN:CAP-ATK
68,GEN:CAP-AIM
69,GEN:CAP-DEF
70,GEN:CAP-DOG
71,GEN:CAP-MAG
72,GEN:CAP-WIL
73,GEN:CAP-SPD
74,GEN:CAP-CTR
75,GEN:CAP-FOCUS
76,GEN:CAP-HITS
77,GEN:MAXSFX
80,GEN:MAXMENU
82,GEN:MAXITEM
83,GEN:PT7
84,GEN:PT8
85,GEN:INVSLOT
86,GEN:ERROR
87,GEN:LEVELCAP
88,GEN:EQMERGE
89,GEN:ELEMENTS
90,GEN:URESXP
91,GEN:LRESXP
92,GEN:PASSWORD
95,GEN:COMPAT
96,GEN:MONEY
97,GEN:MAXSHOP
100,GEN:MXSCOUNT
101,GEN:BITS1
102,GEN:STARTX
103,GEN:STARTY
104,GEN:STARTMAP
171,GEN:DEATHSFX
172,GEN:MAXSONG
173,GEN:SFX-ACCEPT
174,GEN:SFX-CANCEL
175,GEN:SFX-CHOOSE
176,GEN:SFX-LETTER
177,GEN:BITS2
178,GEN:BITS3
179,GEN:SFX-LEARN
180,GEN:SFX-NOLEARN
181,GEN:SFX-BUY
182,GEN:SFX-HIRE
183,GEN:SFX-SELL
184,GEN:SFX-POOR
185,GEN:SFX-NOSELL
186,GEN:DAMTICKS
187,GEN:DAMRISE
188,GEN:HWEAK
189,GEN:EWEAK
190,GEN:AUTOSORT
191,GEN:LEVELMAX
192,GEN:BATTLEMODE
193,GEN:STACK
# General bitset constants
0,GB:MENUPAUSE
1,GB:CATERPILLAR
2,GB:NORESTHP
3,GB:NORESTMP
4,GB:NORESURRECT
5,GB:HEROSWAP
6,GB:NOREADY
7,GB:NOHPBAR
8,GB:NODEBUG
9,GB:LEVELBUG
10,GB:DTRIGGER
11,GB:NOTITLE
12,GB:NOLOAD
13,GB:BPAUSE
14,GB:NOBCURSOR
15,GB:DISPASS
16,GB:PUSHBUG
17,GB:NORUN
18,GB:NOSCRIPTSAVE
19,GB:DEADXP
20,GB:LOCK
21,GB:CAPPAUSE
22,GB:FIXEDREADY
23,GB:ANIMWAIT
24,GB:SCANCODE
25,GB:OLDRESIST
26,GB:IMMUNE
27,GB:RESLICE
28,GB:HARMALL
29,GB:NOHITS
30,GB:NOXPDIV
31,GB:NORESETOOB
32,GB:MORETAGS
# Autosort modes
0,AS:TYPE
1,AS:USABLE
2,AS:ALPHA
3,AS:ID
4,AS:COMPACT
# Error suppression levels
2,ERR:ALL
3,ERR:SOME
4,ERR:REL
5,ERR:OLD
6,ERR:HIDE
# Map data constants
0,MAP:TILESET
1,MAP:MUSIC
2,MAP:MINI
3,MAP:SAVE
4,MAP:NAMEDISP
5,MAP:EDGEMODE
6,MAP:EDGE
7,MAP:AUTORUN
8,MAP:ARG
9,MAP:HDAMAGE
10,MAP:HFLASH
11,MAP:FOOT
12,MAP:AFTERBATTLE
13,MAP:ONBATTLE
14,MAP:ONSTEP
15,MAP:ONKEY
16,MAP:ZORDER
17,MAP:NPERSIST
18,MAP:TPERSIST
19,MAP:LAYER
20,MAP:SAVX
21,MAP:SAVY
25,MAP:NPCCOUNT
31,MAP:WALKLAYER
32,MAP:MZONE
33,MAP:AZONE
# Menu data constants
12,MENU:STYLE
13,MENU:COLOR
14,MENU:ROWS
15,MENU:BITS
16,MENU:XOFF
17,MENU:YOFF
18,MENU:XANC
19,MENU:YANC
20,MENU:ALIGN
24,MENU:ONCLOSE
# Menu item data constants
0,MI:PARENT
21,MI:SORT
22,MI:TYPE
23,MI:SUBTYPE
24,MI:TAG1
25,MI:TAG2
26,MI:STAG
27,MI:TTAG
28,MI:BITS
29,MI:EXT0
30,MI:EXT1
31,MI:EXT2
# NPC data constants
0,NPC:PICTURE
1,NPC:PALETTE
2,NPC:MOVE
3,NPC:SPEED
4,NPC:TEXT
5,NPC:FACE
6,NPC:ITEM
7,NPC:PUSH
8,NPC:ACTMODE
9,NPC:TAG1
10,NPC:TAG2
11,NPC:ONETIME
12,NPC:SCRIPT
13,NPC:ARG
14,NPC:VEH
15,NPC:MZONE
16,NPC:AZONE
# Menu types
0,MT:LABEL
1,MT:BUILTIN
2,MT:MENU
3,MT:TEXTBOX
4,MT:SCRIPT
# Battle stats
0,HP
1,MP
2,STRENGTH
3,ACCURACY
4,DEFENSE
5,DODGE
6,MAGIC
7,WILL
8,SPEED
9,COUNTER
10,FOCUS
11,HITS
# Directions
0,NORTH
1,EAST
2,SOUTH
3,WEST
# Built-in slice codes
-100000,SL:ROOT
-100001,SL:TBTEXT
-100002,SL:TBPIC
-100003,SL:TBC0
-100004,SL:TBC1
-100016,SL:TBBOX
-100017,SL:TBPBOX
-100018,SL:TBCBOX
-100019,SL:TBR
-100005,SL:SCRIPTL
-100006,SL:BOXL
-100007,SL:STRL
-100008,SL:MAP
-100009,SL:OH
-100010,SL:WALK
-100011,SL:HERO
-100012,SL:NPC
-100013,SL:SPRITE
-100014,SL:SHADOW
-100015,SL:MXS
-101000,SL:ML0
-101001,SL:ML1
-101002,SL:ML2
-101003,SL:ML3
-101004,SL:ML4
-101005,SL:ML5
-101006,SL:ML6
-101007,SL:ML7
# Miscellaneous constants
-1,NOITEM
)
define operator,begin
20 ^ exponent
30,mod,modulus
30 / divide
30 * multiply
40 -- subtract
40 + add
50 == equal
50 <> notequal
50 << lessthan
50 >> greaterthan
50 < lessthan
50 > greaterthan
50 <= lessthanorequalto
50 >= greaterthanorequalto
60,xor,xor
60,and,and
60,or, or
65 && logand
70 || logor
70 ^^ logxor
80 := setvariable
80 += increment
80 -= decrement
80 $+ concatenatestrings
80 $= copystring
end
SCRIPT,GENSET,HSD:X( # Turn on a general bitset (which)
IF(HSD:X<<16)THEN(
GENPUT(GEN:BITS1,(GENGET(GEN:BITS1),OR,(2^HSD:X)))
EXITSCRIPT
)
IF(HSD:X<<32)THEN(
GENPUT(GEN:BITS2,(GENGET(GEN:BITS2),OR,(2^(HSD:X--32))))
EXITSCRIPT
)
IF(HSD:X<<48)THEN(
GENPUT(GEN:BITS3,(GENGET(GEN:BITS3),OR,(2^(HSD:X--48))))
EXITSCRIPT
)
)
SCRIPT,GENCLEAR,HSD:X( # Turn off a general bitset (which)
GENPUT(GEN:BITS1,(GENGET(GEN:BITS1),XOR,65535))
GENPUT(GEN:BITS2,(GENGET(GEN:BITS2),XOR,65535))
GENPUT(GEN:BITS3,(GENGET(GEN:BITS3),XOR,65535))
GENSET(HSD:X)
GENPUT(GEN:BITS1,(GENGET(GEN:BITS1),XOR,65535))
GENPUT(GEN:BITS2,(GENGET(GEN:BITS2),XOR,65535))
GENPUT(GEN:BITS3,(GENGET(GEN:BITS3),XOR,65535))
)
SCRIPT,ILAST( # Last inventory slot number
IF(GENGET(GEN:INVSLOT))THEN(
RETURN((((GENGET(GEN:INVSLOT)+3)/3)*3)--1)
)ELSE(
RETURN(599)
)
)
# Very klugy implementations follow. It would be more sensible to
# implement DOEQUIP and UNEQUIP in terms of EQSET and EQDEL rather
# than the other way around. However, it doesn't work that way.
SCRIPT,EQDEL,HSD:X,HSD:Y( # Delete equipment in slot (who,slot)
VARIABLE(HSD:A,HSD:B,HSD:C,HSD:D)
HSD:A:=EQGET(HSD:X,HSD:Y)
IF(HSD:A==NOITEM)THEN(EXITSCRIPT)
# Find the slot containing the item to remove
FOR(HSD:B,0,ILAST)DO(
IF(IGET(HSD:B)==HSD:A)THEN(
# We already have this item
# Save the amount and temporarily remove it
HSD:C:=IGETCOUNT(HSD:B)
IPUTCOUNT(HSD:B,0)
# Remember if there are further inventory slots with the same item
HSD:D:=INVENTORY?(HSD:A)
# Unequip the item; adds it to your inventory
UNEQUIP(HSD:X,HSD:Y)
# Discard the item if it has been added due to unequipping
IF(INVENTORY?(HSD:A)>>HSD:D)THEN(IDEC(HSD:A))
# Put it back in
IPUT(HSD:B,HSD:A)
IPUTCOUNT(HSD:B,HSD:C)
# Finished
EXITSCRIPT
)
)
# We don't already have such an item in the inventory
# Temporarily use the first slot
HSD:A:=IGET(0)
HSD:B:=IGETCOUNT(0)
# Clear it to make room for the item
IPUTCOUNT(0,0)
# Unequip it; if the item is added to inventory, it is added to slot 0
UNEQUIP(HSD:X,HSD:Y)
# Restore the inventory slot 0
IPUT(0,HSD:A)
IPUTCOUNT(0,HSD:B)
)
SCRIPT,EQSET,HSD:X,HSD:Y,HSD:Z( # Set equipment in slot (who,slot,item)
VARIABLE(HSD:A,HSD:B)
# First remove the item in the reasonable way
EQDEL(HSD:X,HSD:Y)
# Skip the rest if nothing is to be added to the equipment slot
IF(HSD:Z==NOITEM)THEN(EXITSCRIPT)
# Find the slot containing such an item, if any
FOR(HSD:B,0,ILAST)DO(
IF(IGET(HSD:B)==HSD:Z)THEN(
# Remember it
HSD:A:=IGETCOUNT(HSD:B)
# Do equip
DOEQUIP(HSD:X,HSD:Y,HSD:Z)
# Put back the item in the inventory
IPUT(HSD:B,HSD:Z)
IPUTCOUNT(HSD:B,HSD:A)
# Finished
EXITSCRIPT
)
)
# There wasn't any, so it is safe to just DOEQUIP
DOEQUIP(HSD:X,HSD:Y,HSD:Z)
)
SCRIPT,STRSAVE,HSD:X( # Temporary save a string (str)
VARIABLE(HSD:A)
HSD:A:=SLNEWTEXT
SLPUTTEXT(HSD:A,HSD:X)
SLHIDE(HSD:A)
RETURN(HSD:A)
)
SCRIPT,STRLOAD,HSD:X,HSD:Y( # Restore a saved string (str,saved)
STRSLICE(HSD:X,HSD:Y)
SLFREE(HSD:Y)
)