84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
| # finding.py -- apply event for amulets of finding
 | |
| #
 | |
| # These pieces of jewelry help players remember locations on the world map.
 | |
| # Players can bind an amulet at any location on the world map. Applying a bound
 | |
| # amulet shows players a message indicating which direction they should travel
 | |
| # to return to the bound location.
 | |
| #
 | |
| # The bound location is stored in the key-value pair "finding_location", which
 | |
| # contains a 2-tuple of global coordinates from the CFWorld module.
 | |
| import Crossfire
 | |
| import CFWorld
 | |
| 
 | |
| location_key = 'finding_location'
 | |
| world_size = 50
 | |
| 
 | |
| def indefinite(ob):
 | |
|     """Append 'a' or 'an' to the given object's name."""
 | |
|     name = ob.QueryName()
 | |
|     if name[0].lower() in {'a', 'e', 'i', 'o'}:
 | |
|         article = "an"
 | |
|     else:
 | |
|         article = "a"
 | |
|     return article + " " + name
 | |
| 
 | |
| def auto_identify(ob, pl):
 | |
|     """Identify the object if it hasn't already."""
 | |
|     if not ob.Identified:
 | |
|         ob.Identified = True
 | |
|         pl.Message("This is %s!" % indefinite(ob))
 | |
| 
 | |
| def loc_to_str(l):
 | |
|     return ",".join(map(str, l))
 | |
| 
 | |
| def str_to_loc(s):
 | |
|     return list(map(int, s.split(",")))
 | |
| 
 | |
| def describe_vec(v):
 | |
|     dist = CFWorld.getdist(v)
 | |
|     if dist < 1:
 | |
|         return "here"
 | |
|     if dist <= world_size:
 | |
|         modifier = "strongly"
 | |
|     elif dist <= 5*world_size:
 | |
|         modifier = "moderately"
 | |
|     else:
 | |
|         modifier = "lightly"
 | |
|     return modifier + " " + CFWorld.getdir(v)
 | |
| 
 | |
| def on_apply():
 | |
|     whoami = Crossfire.WhoAmI()
 | |
|     player = Crossfire.WhoIsActivator()
 | |
| 
 | |
|     Crossfire.SetReturnValue(1) # do not allow players to wear this
 | |
|     auto_identify(whoami, player)
 | |
| 
 | |
|     if whoami.Env == player:
 | |
|         # applied in inventory
 | |
|         current_location = CFWorld.loc_from_ob(player)
 | |
|     else:
 | |
|         # applied on the floor
 | |
|         current_location = CFWorld.loc_from_ob(whoami)
 | |
| 
 | |
|     if current_location == False:
 | |
|         # can only be used on the world map
 | |
|         player.Message("The %s rattles for a moment, then stops." % whoami.QueryName())
 | |
|         return
 | |
| 
 | |
|     if whoami.Env == player:
 | |
|         # applied in inventory
 | |
|         stored_str = whoami.ReadKey(location_key)
 | |
|         if stored_str == "":
 | |
|             # no location bound
 | |
|             player.Message("The %s vibrates for a moment, then stops." % whoami.QueryName())
 | |
|             return
 | |
|         stored_location = str_to_loc(stored_str)
 | |
|         delta = CFWorld.getdiff(stored_location, current_location)
 | |
|         player.Message("The %s tugs you %s." % (whoami.QueryName(), describe_vec(delta)))
 | |
|     else:
 | |
|         # applied on the floor
 | |
|         whoami.WriteKey(location_key, loc_to_str(current_location), 1)
 | |
|         player.Message("The %s glows blue." % whoami.QueryName())
 | |
| 
 | |
| on_apply()
 |