Scripts:3rd Party HSI

From OHRRPGCE-Wiki
Jump to: navigation, 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