Brandon Cornejo
6 years ago
6 changed files with 346 additions and 32 deletions
-
7mdtconfig.json
-
5src/actions.tin
-
22src/gmcp.tin
-
158src/maproute.py
-
178src/quow.tin
-
8src/spottimers.tin
@ -0,0 +1,158 @@ |
|||||
|
#!/usr/bin/env python |
||||
|
|
||||
|
import sys |
||||
|
import sqlite3 |
||||
|
|
||||
|
class MapRoute: |
||||
|
def __init__(self): |
||||
|
self.locations_by_room_id = {} |
||||
|
self.exits_by_id = {} |
||||
|
self.exits_by_exit = {} |
||||
|
|
||||
|
self.return_alias = None |
||||
|
|
||||
|
self.db = self.database_connect() |
||||
|
self.load_locations() |
||||
|
self.load_exits() |
||||
|
|
||||
|
def database_connect(self): |
||||
|
con = sqlite3.connect('src/quow.db') |
||||
|
con.row_factory = sqlite3.Row |
||||
|
return con |
||||
|
|
||||
|
def load_locations(self): |
||||
|
cur = self.db.cursor() |
||||
|
cur.execute("SELECT room_id, map_id, xpos, ypos, room_short, room_type FROM rooms") |
||||
|
for row in cur.fetchall(): |
||||
|
self.locations_by_room_id[row[0]] = [row[1], row[2], row[3], row[4], row[5]] |
||||
|
self.exits_by_id[row['room_id']] = {} |
||||
|
self.exits_by_exit[row['room_id']] = {} |
||||
|
|
||||
|
def load_exits(self): |
||||
|
cur = self.db.cursor() |
||||
|
cur.execute("SELECT room_id, connect_id, exit FROM room_exits") |
||||
|
for row in cur.fetchall(): |
||||
|
if self.exits_by_id.get(row['room_id']) is not None and self.exits_by_id.get(row['connect_id']) is not None: |
||||
|
self.exits_by_id[row['room_id']][row['connect_id']] = row['exit'] |
||||
|
self.exits_by_exit[row['room_id']][row['exit']] = row['connect_id'] |
||||
|
|
||||
|
def route_to_room(self, current_id, target_id, same_place): |
||||
|
# If we can't match one of the room identifiers, back out |
||||
|
if not current_id or not target_id or not self.locations_by_room_id.get(target_id) or not self.locations_by_room_id.get(current_id): |
||||
|
return |
||||
|
|
||||
|
sDoPath, sFinalDestination, iResults = self.route_find( |
||||
|
current_id, target_id, |
||||
|
self.locations_by_room_id[target_id][0], |
||||
|
self.locations_by_room_id[target_id][1], |
||||
|
self.locations_by_room_id[target_id][2], |
||||
|
same_place |
||||
|
) |
||||
|
|
||||
|
if sDoPath != "": |
||||
|
sDoPath = "alias RuhsSpeedRun {}".format(sDoPath) |
||||
|
if len(sDoPath) > 1700: |
||||
|
pass |
||||
|
else: |
||||
|
self.return_alias = sDoPath |
||||
|
|
||||
|
def route_find(self, start_id, dest_id, dest_map, dest_x, dest_y, same_place=True): |
||||
|
sDoRoom = [start_id] |
||||
|
bEverDone = {start_id: True} |
||||
|
sIDToRoomNum = {start_id: 1} |
||||
|
iGotHereFrom = {} |
||||
|
iNextRoom = 1 |
||||
|
iTotalRooms = 1 |
||||
|
sLinkedTo = [] |
||||
|
iSearchDepth = 0 |
||||
|
bDone = False |
||||
|
iFinalRoom = 0 |
||||
|
iPreviousTotal = 0 |
||||
|
|
||||
|
# "Infinite" loop |
||||
|
while bDone == False: |
||||
|
# Loop through all the rooms we have yet to do |
||||
|
iPreviousTotal = iTotalRooms |
||||
|
for iN in xrange(iNextRoom - 1, iPreviousTotal): |
||||
|
# Loop through all exits from this room |
||||
|
for sKey, sExitData in self.exits_by_id[sDoRoom[iN]].iteritems(): |
||||
|
# Make sure we aren't looping back around on ourselves, and that we haven't already finished |
||||
|
if sKey != start_id and bEverDone.get(sKey) == None and iFinalRoom == 0: |
||||
|
iTotalRooms = iTotalRooms + 1 |
||||
|
# Add THIS destination of THIS room to the "to-be-processed" list |
||||
|
sDoRoom.append(sKey) |
||||
|
# Flag this room so we never come here again |
||||
|
bEverDone[sKey] = True |
||||
|
# Record ID to room-num |
||||
|
sIDToRoomNum[sKey] = iTotalRooms |
||||
|
# Record back-tracking data |
||||
|
iGotHereFrom[iTotalRooms] = [sIDToRoomNum[sDoRoom[iN]], sExitData] |
||||
|
# See if we made it yet |
||||
|
if sDoRoom[iN] == dest_id: |
||||
|
bDone = True |
||||
|
iFinalRoom = iN |
||||
|
elif sKey == dest_id: |
||||
|
bDone = True |
||||
|
iFinalRoom = iTotalRooms |
||||
|
elif (same_place == True and self.locations_by_room_id[sDoRoom[iN]][0] == dest_map |
||||
|
and self.locations_by_room_id[sDoRoom[iN]][1] == dest_x |
||||
|
and self.locations_by_room_id[sDoRoom[iN]][2] == dest_y): |
||||
|
# Maybe we reached the co-ordinates instead - eg a house with multiple rooms in one pixels -- only stop here if we didn't START here |
||||
|
if (self.locations_by_room_id[start_id][0] != dest_map or |
||||
|
self.locations_by_room_id[start_id][1] != dest_x or |
||||
|
self.locations_by_room_id[start_id][2] != dest_y): |
||||
|
bDone = True |
||||
|
iFinalRoom = iN |
||||
|
# elif |
||||
|
# not back to beginning |
||||
|
# loop through exit rooms |
||||
|
# loop through "to-do" |
||||
|
|
||||
|
iNextRoom = iPreviousTotal + 1 |
||||
|
if iNextRoom > iTotalRooms: |
||||
|
# Failed to find a route |
||||
|
bDone = True |
||||
|
iSearchDepth = iSearchDepth + 1 |
||||
|
if iSearchDepth > 500: |
||||
|
# Failed, too deep |
||||
|
bDone = True |
||||
|
iFinalRoom = 0 |
||||
|
break |
||||
|
# infinite loop end |
||||
|
|
||||
|
# Did we actually find a room? |
||||
|
if iFinalRoom != 0: |
||||
|
sPath = [] |
||||
|
bDone = False |
||||
|
iCurRoom = iFinalRoom |
||||
|
while bDone == False: |
||||
|
sPath.append(iGotHereFrom[iCurRoom][1]) |
||||
|
iCurRoom = iGotHereFrom[iCurRoom][0] |
||||
|
if iCurRoom == 1: |
||||
|
bDone = True |
||||
|
sRealPath = "" |
||||
|
for iN in xrange(len(sPath), 0, -1): |
||||
|
if sRealPath != "": |
||||
|
sRealPath = "{};".format(sRealPath) |
||||
|
sRealPath = "{}{}".format(sRealPath, sPath[iN-1]) |
||||
|
return sRealPath, sDoRoom[iFinalRoom-1], len(sPath) |
||||
|
# Didn't find a route, return blanks |
||||
|
return "", "", 0 |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
if len(sys.argv) < 2: |
||||
|
print('[error] No input provided.') |
||||
|
sys.exit() |
||||
|
|
||||
|
current_room, target_room = sys.argv.pop(1), sys.argv.pop(1) |
||||
|
|
||||
|
router = MapRoute() |
||||
|
router.route_to_room(current_room, target_room, True) |
||||
|
# TODO: Can we determine samePlace? We need to compare the MapID of current_room and target_room when found? |
||||
|
# d route between df6506b79c67080920fccbf27ce0d06cd392e01a and 03360211b315daf089d9ba329dd32417b9c7f54c. |
||||
|
|
||||
|
if router.return_alias: |
||||
|
print(router.return_alias) |
||||
|
else: |
||||
|
print(0) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue