Scripts:3rd Party HSI
From OHRRPGCE-Wiki
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.91 (Last updated 5/05/2014) | # | # 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 + 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))) # 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