62 lines
1.9 KiB
Python
62 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
#age.py
|
|
# This is one of the files that can be called by an npc_dialog,
|
|
# The following code runs when a dialog has a pre rule of 'age'
|
|
# The syntax is
|
|
# ["age", "agetoken", "years", "months", "days", "hours", "minutes"]
|
|
# To deliver a True verdict, the agetoken must correspond to a date
|
|
# that is was at least as long ago as the duration specified in the options.
|
|
## DIALOGCHECK
|
|
## MINARGS 6
|
|
## MAXARGS 6
|
|
## .*
|
|
## \d
|
|
## \d
|
|
## \d
|
|
## \d
|
|
## \d
|
|
## ENDDIALOGCHECK
|
|
|
|
|
|
class checkfailed(Exception):
|
|
pass
|
|
|
|
# maximum months, days, hours, as defined by the server.
|
|
# minutes per hour is hardcoded to approximately 60
|
|
|
|
try:
|
|
MAXTIMES = [Crossfire.Time.MONTHS_PER_YEAR, Crossfire.Time.WEEKS_PER_MONTH*Crossfire.Time.DAYS_PER_WEEK,
|
|
Crossfire.Time.HOURS_PER_DAY, 60]
|
|
# we have three times to consider, the old time, the current time, and the desired time difference.
|
|
if len(args) != 6:
|
|
raise checkfailed()
|
|
markername = args[0]
|
|
oldtime = self.getStatus(markername).split("-")
|
|
oldtime = map(int, oldtime)
|
|
if len(oldtime) !=5:
|
|
# The marker hasn't been set yet
|
|
raise checkfailed()
|
|
|
|
desireddiff = map(int, args[1:])
|
|
currenttime = (Crossfire.GetTime())[:5]
|
|
actualdiff = []
|
|
|
|
for i in range(5):
|
|
actualdiff.append(currenttime[i]-oldtime[i])
|
|
|
|
for i in range(4,0,-1):
|
|
# let's tidy up desireddiff first
|
|
if desireddiff[i] > MAXTIMES[i-1]:
|
|
desireddiff[i-1] += desireddiff[i] // MAXTIMES[i-1]
|
|
desireddiff[i] %= MAXTIMES[i-1]
|
|
# Then actualdiff
|
|
if actualdiff[i] < 0:
|
|
actualdiff[i] += MAXTIMES[i-1]
|
|
actualdiff[i-1] -=1
|
|
Crossfire.Log(Crossfire.LogDebug, "CFDialog: tidied up desired difference: %s actual difference %s" %(desireddiff, actualdiff))
|
|
for i in range(5):
|
|
if actualdiff[i] < desireddiff[i]:
|
|
raise checkfailed()
|
|
except checkfailed:
|
|
verdict = False
|