Scripts:3rd Party HSI
Jump to navigation
Jump to search
This pages hosts the actual code and keeps track of revisions to it.
Documentation is at What is the 3rd Party HSI?
# 3rd Party Include File | # version 1.92 (Last updated 13/05/2017) | # | # Check the OHRRPGCE Wiki for documentation. | # You can freely use this file in your game or redistribute | # it. Please do not distribute modified versions of this | # file without noting the changes made. Better yet, why not | # post your scripts on the wiki? | # | # This version is intended for OHRRPGCE v.Beezelbufo | # | # The 3rd Party HSI was compiled and directed by FyreWulff | # Please consult the Wiki for contributing authors | #---------------------------------------------------------====/ #=====================# #Constants Definitions# #=====================# define constant, begin #these are for use in FyreWulff's clearmap script 1, clearwalls 0, preserve walls #For use in FyreWulff's unequipparty script 0, entire party 1, active only 2, reserve only end #=====================# #Operator Definitions# #=====================# define operator, begin #operators for your use, eg '50 + 100, times sine, 50' 25, times sin, sin wrap 25, times cos, cos wrap 25, times tan, tan wrap 30, div, divideround end #=====================# # Global Variables # all Third Party HSI global variables start from 1024 and go back #=====================# to prevent conflicts. For now let's keep them between 1001 and 1024 #comment out the below lines if your game uses these global var IDs global variable, begin 1024, vehiclex #for use in savevechicleposition and etc 1023, vehicley # " " " " 1022, vehicledirection # saves vehicle direction, used in script above 1021, vehicleid # saves which NPC is the vehicle end #=====================# # The Scripts # #=====================# # shows text box with auto waitfortextbox script, tb, textbox, begin showtextbox(textbox) waitfortextbox end script, distance, num1, num2, begin return (abs(num1 -- num2)) end #xdistance(Hero#,NPC#) : distance between hero# and npc# x's script, x distance, heronum, npcnum, begin #by FyreWulff return ( abs( herox(heronum) -- npcx(npcnum) ) ) end #ydistance(Hero#,NPC#) : distance between hero# and npc# y's script, y distance, heronum, npcnum, begin #by FyreWulff return ( abs( heroy(heronum) -- npcy(npcnum) ) ) end script, trunc, n, o, begin #written by T-master & CodyWatts return((n -- (n, mod, o)) / o) end script, resettime, begin setdaysofplay(0) sethoursofplay(0) setminutesofplay(0) setsecondsofplay(0) end # Clear tilemap with a tile, # default walls will also be cleared unless "preserve walls" is used script, clearmap, cleartile = 0, wallclear = true, begin variable(xtile, ytile, layer) for(xtile,0,mapwidth -- 1) do, begin for(ytile,0,mapheight -- 1) do, begin writemapblock(xtile,ytile,cleartile,0) for(layer,1,7) do, begin writemapblock(xtile,ytile,0,layer) end if (wallclear) then ( writepassblock(xtile,ytile,0) ) end end end # Saves vehicle position script, save vehicle, vechnpc, begin vehiclex := npcx(vechnpc) vehicley := npcy(vechnpc) vehicledirection := npcdirection(vechnpc) vehicleid := vechnpc end # Restores vehicle at its saved position script, restore vehicle, begin setnpcposition(vehicleid, vehiclex,vehicley) setnpcdirection(vehicleid, vehicledirection) end # Compute n/m and round the result script, divideround, n, m, begin return ((n + sign(n) * sign(m) * m / 2) / m) end # Compute sin(angle_in_degrees) * mult script, sine, angle, mult = 10000, begin variable (val, sgn) if (angle < 0) then (angle := abs(angle), sgn := 1) # sine is an odd function sgn := (sgn + angle / 180), mod, 2 angle := angle, mod, 180 #this part converts the angle to a value between 0 and 90. if (angle > 90) then (angle := 180 -- angle) if (angle == 90) then ( val := mult ) else ( if (angle < 45) then ( if (angle < 22) then ( val := sina (angle) ) else ( val := sinb (angle) ) ) else ( if (angle < 67) then ( val := sinc (angle) ) else ( val := sind (angle) ) ) val := (val*mult + 16384)/32768 ) if (sgn) then (return (0 -- val)) else (return (val)) end script, cosine, angle, mult = 10000, begin return (sine (angle + 90, mult)) end # Multiple two numbers, return 2147483647 or -2147483647 if it overflows script, bounded multiply, a, b, begin variable(ret) ret := a * b if (b <> 0 && ret / b <> a) then ( return (2147483647 * sign(a) * sign(b)) ) else ( return (ret) ) end # max error about 9% for certain values of mult like 700 or really large, # but normally more like 1% or less (eg for 1000) script, tan, angle, mult = 10000, begin variable(sgn, numerator, denominator, ret, temp) angle := angle, mod, 180 if (angle < 0) then (angle := 0 -- angle, sgn := 1) if (mult < 0) then (mult := 0 -- mult, sgn := sgn, xor, 1) if (angle > 90) then (angle := 180 -- angle, sgn := sgn, xor, 1) if (angle == 0) then (exit returning (0)) if (angle == 90) then (exit returning (2147483647)) numerator := sine(angle, 32768) denominator := sine(angle + 90, 32768) temp := 1000 * numerator / denominator #r = bounded_multiply(temp, mult) ret := temp * mult # Check for overflow if (temp <> 0 && ret / temp <> mult) then ( # mult was > ~37000 ret := bounded multiply((mult + 250) / 500, temp / 2) ) else ( ret := ret / 1000 ) if (sgn) then ( return (0 -- ret) ) else ( return (ret) ) end script, sina, angle, begin if (angle < 11) then ( if (angle < 5) then ( if (angle < 2) then ( if (angle == 0) then (return (0)) else (return (572)) ) else ( if (angle == 2) then (return (1144)) else ( if (angle == 3) then (return (1715)) else (return (2286)) ) ) ) else ( if (angle < 8) then ( if (angle == 5) then (return (2856)) else ( if (angle == 6) then (return (3425)) else (return (3993)) ) ) else ( if (angle == 8) then (return (4560)) else ( if (angle == 9) then (return (5126)) else (return (5690)) ) ) ) ) else ( if (angle < 16) then ( if (angle < 13) then ( if (angle == 11) then (return (6252)) else (return (6813)) ) else ( if (angle == 13) then (return (7371)) else ( if (angle == 14) then (return (7927)) else (return (8481)) ) ) ) else ( if (angle < 19) then ( if (angle == 16) then (return (9032)) else ( if (angle == 17) then (return (9580)) else (return (10126)) ) ) else ( if (angle == 19) then (return (10668)) else ( if (angle == 20) then (return (11207)) else (return (11743)) ) ) ) ) end script, sinb, angle, begin if (angle < 33) then ( if (angle < 27) then ( if (angle < 24) then ( if (angle == 22) then (return (12275)) else (return (12803)) ) else ( if (angle == 24) then (return (13328)) else ( if (angle == 25) then (return (13848)) else (return (14365)) ) ) ) else ( if (angle < 30) then ( if (angle == 27) then (return (14876)) else ( if (angle == 28) then (return (15384)) else (return (15886)) ) ) else ( if (angle == 30) then (return (16384)) else ( if (angle == 31) then (return (16877)) else (return (17364)) ) ) ) ) else ( if (angle < 39) then ( if (angle < 36) then ( if (angle == 33) then (return (17847)) else ( if (angle == 34) then (return (18324)) else (return (18795)) ) ) else ( if (angle == 36) then (return (19261)) else ( if (angle == 37) then (return (19720)) else (return (20174)) ) ) ) else ( if (angle < 42) then ( if (angle == 39) then (return (20622)) else ( if (angle == 40) then (return (21063)) else (return (21498)) ) ) else ( if (angle == 42) then (return (21926)) else ( if (angle == 43) then (return (22348)) else (return (22763)) ) ) ) ) end script, sinc, angle, begin if (angle < 56) then ( if (angle < 50) then ( if (angle < 47) then ( if (angle == 45) then (return (23170)) else (return (23571)) ) else ( if (angle == 47) then (return (23965)) else ( if (angle == 48) then (return (24351)) else (return (24730)) ) ) ) else ( if (angle < 53) then ( if (angle == 50) then (return (25102)) else ( if (angle == 51) then (return (25466)) else (return (25822)) ) ) else ( if (angle == 53) then (return (26170)) else ( if (angle == 54) then (return (26510)) else (return (26842)) ) ) ) ) else ( if (angle < 61) then ( if (angle < 58) then ( if (angle == 56) then (return (27166)) else (return (27482)) ) else ( if (angle == 58) then (return (27789)) else ( if (angle == 59) then (return (28088)) else (return (28378)) ) ) ) else ( if (angle < 64) then ( if (angle == 61) then (return (28660)) else ( if (angle == 62) then (return (28932)) else (return (29197)) ) ) else ( if (angle == 64) then (return (29452)) else ( if (angle == 65) then (return (29698)) else (return (29935)) ) ) ) ) end script, sind, angle, begin if (angle < 78) then ( if (angle < 72) then ( if (angle < 69) then ( if (angle == 67) then (return (30163)) else (return (30382)) ) else ( if (angle == 69) then (return (30592)) else ( if (angle == 70) then (return (30792)) else (return (30983)) ) ) ) else ( if (angle < 75) then ( if (angle == 72) then (return (31164)) else ( if (angle == 73) then (return (31336)) else (return (31499)) ) ) else ( if (angle == 75) then (return (31651)) else ( if (angle == 76) then (return (31795)) else (return (31928)) ) ) ) ) else ( if (angle < 84) then ( if (angle < 81) then ( if (angle == 78) then (return (32052)) else ( if (angle == 79) then (return (32166)) else (return (32270)) ) ) else ( if (angle == 81) then (return (32365)) else ( if (angle == 82) then (return (32449)) else (return (32524)) ) ) ) else ( if (angle < 87) then ( if (angle == 84) then (return (32588)) else ( if (angle == 85) then (return (32643)) else (return (32688)) ) ) else ( if (angle == 87) then (return (32723)) else ( if (angle == 88) then (return (32748)) else (return (32763)) ) ) ) ) end script, sin wrap, mult, angle (return (sine (angle, mult))) script, cos wrap, mult, angle (return (cosine (angle, mult))) script, tan wrap, mult, angle (return (tan (angle, mult))) # Result in thousands of a radian, between 3142 and -3142. # Original floating point version had |error| < 5 mRad, this would be more than that. script, atan2 milliradians, y, x, begin variable(atan, z, pi) pi := 3142 if (x == 0) then ( if (y > 0) then (return(pi/2)) else if (y == 0) then (return(0)) else (return(pi/-2)) ) else( z := 1000 * y / x if (abs(z) < 1000) then( atan := 1000*z/(1000 + z*z*28/100/1000) if (x < 0) then( if (y < 0) then (exitreturning(atan -- pi)) exitreturning(atan + pi) ) ) else( if (abs(z) > 65000) then( # prevent overflow if z > sqrt(2 * 2**31) atan := pi/2 ) else( atan := pi/2 -- 1000*z/(z/2*z/500 + 280) # pi/2 - z/(z*z + 0.28) ) if (y < 0) then (exitreturning(atan -- pi)) ) return(atan) ) end # Result in degrees. Returns mult*atan(y,x). Probably accurate to about half a degree. # Returns a value between 180 and -180: # 180: left # 90: up # 0: right # -90: down # -180: left script, atan2, y, x, mult = 1, begin return (divideround(atan2 milliradians(y, x) * mult * 180, 3142)) # *180/pi end # Returns max(1, e^(n/1000) * 1000): always returns a positive value # Delete the +1 at the end if you want it to reach 0 # For n > 0, maximum error in the result is 0.3% script, exp1000, n, begin if (n >= 7291) then ( if (n >= 14579) then ( # Prevent overflow exitreturning(2145750645) ) # exp(7.291) = 1467.04 exitreturning(exp1000(n -- 7291) * 1467) ) variable(mult, val) mult := 1000 while (n <= -414) do ( # exp(-0.414) = 0.661001 mult := mult * 661 / 1000 n += 414 ) while (n >= 540) do ( # exp(0.540) = 1.716007 mult := mult * 1716 / 1000 n -= 540 ) #val := 1 + n + n**2 / 2 + n**3 / 6 + n**4 / 24 val := 1000 + n + n^2 / 2000 + n^3 / 6000000 + (n^3 / 1000) * n / 24000000 return(val * mult / 1000 + 1) end script, number of npcs, low = 0, high = 199, begin variable (total, i) for (i, low, high) do (increment (total, npc copy count (i))) return (total) end # Returns a digit 'dgtno' in number 'value'. script, digit, value, dgtno, begin if (dgtno > 9) then (exit returning(0)) return ((value / 10 ^ (dgtno -- 1)), mod, 10) end # Takes away all of the party's equipment. # type can be entireparty, activeonly, or reserveonly script, unequip party, type = entire party, begin variable(heroslot), heroslot := 0 variable(itemslot), itemslot := 0 variable(min hero slot) , min hero slot := 0 variable(max hero slot) , max hero slot := 40 if( type == active only ) then( max hero slot := 3 , min hero slot := 0 ) if( type == reserve only ) then( max hero slot := 40 , min hero slot := 4) for(heroslot,min hero slot,max hero slot) do, begin for(itemslot,1,5) do ( unequip( heroslot, itemslot ) ) end end # Takes away all items in player's inventory script, delete all items, begin variable(slot) for (slot, 0, getinventorysize -- 1) do ( setitemcountinslot(slot, 0) ) end #OBSOLETE script, reset tags, begin variable(tagloop) for(tagloop,2,2002) do ( settag(tagloop, false) ) end # Teleport to a position on a map script, fake door, map, x, y, begin suspendplayer fadescreenout wait(2) teleporttomap(map,x,y) wait(1) fadescreenin resumeplayer end # EOF