262 lines
7.7 KiB
Python
262 lines
7.7 KiB
Python
from panda3d.core import *
|
|
import random
|
|
OFF = 0
|
|
FLYING = 1
|
|
LANDED = 2
|
|
states = {OFF: 'off',
|
|
FLYING: 'Flying',
|
|
LANDED: 'Landed'}
|
|
NUM_BUTTERFLIES = (6, 36, 5)
|
|
NUM_BUTTERFLY_AREAS = (4, 1, 4)
|
|
BUTTERFLY_SPEED = 2.0
|
|
BUTTERFLY_HEIGHT = (2.2, 3.2, 2.2)
|
|
BUTTERFLY_TAKEOFF = (1.4, 1.8, 1.4)
|
|
BUTTERFLY_LANDING = (1.4, 1.8, 1.4)
|
|
MAX_LANDED_TIME = 20.0
|
|
TTC = 0
|
|
DG = 1
|
|
ESTATE = 2
|
|
ButterflyPoints = (((Point3(84.0, -116.0, 3.5),
|
|
Point3(95.0, -144.0, 2.6),
|
|
Point3(94.0, -145.0, 2.6),
|
|
Point3(95.0, -149.0, 2.6),
|
|
Point3(50.0, -155.0, 2.6),
|
|
Point3(51.0, -147.0, 2.6),
|
|
Point3(51.0, -145.0, 2.6),
|
|
Point3(14.0, -99.0, 3.1),
|
|
Point3(17.0, -94.0, 3.1),
|
|
Point3(50.0, -79.0, 3.1),
|
|
Point3(47.0, -86.0, 3.1),
|
|
Point3(54.0, -127.0, 2.6),
|
|
Point3(84.0, -113.0, 3.8)),
|
|
(Point3(-57.0, -70.0, 0.1),
|
|
Point3(-55.0, -68.0, 0.1),
|
|
Point3(-90.0, -77.0, 0.6),
|
|
Point3(-90.0, -72.0, 0.1),
|
|
Point3(-133.0, -50.0, 0.6),
|
|
Point3(-129.0, -48.0, 0.6),
|
|
Point3(-127.0, -25.0, 0.1),
|
|
Point3(-125.0, -22.0, 0.1),
|
|
Point3(-123.0, -22.0, 0.1),
|
|
Point3(-103.0, -10.0, -3.0),
|
|
Point3(-104.0, -13.0, -2.5),
|
|
Point3(-100.0, -28.0, -2.7),
|
|
Point3(-89.0, -41.0, -4.4),
|
|
Point3(-58.0, -34.0, -4.1),
|
|
Point3(-69.0, -18.0, -1.9),
|
|
Point3(-65.0, -19.0, -1.9),
|
|
Point3(-65.0, -16.0, -1.9),
|
|
Point3(6.0, -49.0, -0.1),
|
|
Point3(2.6, -47.0, 0.1),
|
|
Point3(-33.6, -43.0, 0.0)),
|
|
(Point3(-53.0, 3.0, -1.8),
|
|
Point3(-58.0, 2.0, -1.8),
|
|
Point3(-58.0, 2.0, -1.8),
|
|
Point3(-76.0, 2.0, -1.8),
|
|
Point3(-69.0, 11.0, -1.8),
|
|
Point3(-100.0, 14.0, -4.1),
|
|
Point3(-104.0, 17.0, -2.6),
|
|
Point3(-125.0, 34.0, 0.1),
|
|
Point3(-124.0, 30.0, 0.1),
|
|
Point3(-113.0, 73.0, 0.6),
|
|
Point3(-33.0, 78.0, 0.1),
|
|
Point3(-65.0, 48.0, -3.0),
|
|
Point3(-51.0, 33.0, -3.0),
|
|
Point3(-30.0, 71.0, 0.1),
|
|
Point3(-26.0, 71.0, 0.1),
|
|
Point3(-23.0, 69.0, 0.1),
|
|
Point3(-23.0, 64.0, 0.1),
|
|
Point3(-5.0, 42.0, 0.1),
|
|
Point3(-22.0, 22.0, 0.1),
|
|
Point3(-27.0, 22.0, 0.1)),
|
|
(Point3(14.0, 93.0, 3.1),
|
|
Point3(17.0, 93.0, 3.1),
|
|
Point3(20.0, 122.0, 2.6),
|
|
Point3(21.0, 127.0, 2.6),
|
|
Point3(23.0, 123.0, 2.6),
|
|
Point3(32.0, 130.0, 2.6),
|
|
Point3(48.0, 148.0, 2.6),
|
|
Point3(64.0, 111.0, 2.6),
|
|
Point3(32.0, 82.0, 2.6),
|
|
Point3(63.0, 90.0, 3.1),
|
|
Point3(68.0, 85.0, 3.1),
|
|
Point3(65.0, 85.0, 3.1),
|
|
Point3(70.0, 95.0, 3.1))), ((Point3(-7.9, 22.9, 0.05),
|
|
Point3(-8.0, 17.0, 2.1),
|
|
Point3(-7.5, 18.0, 2.1),
|
|
Point3(-27.5, 70.7, 0.05),
|
|
Point3(-30.0, 70.0, 1.0),
|
|
Point3(-31.0, 69.0, 1.0),
|
|
Point3(-1.0, 53.0, 2.2),
|
|
Point3(-0.5, 53.0, 2.2),
|
|
Point3(35.0, 71.5, 1.0),
|
|
Point3(33.0, 69.0, 0.05),
|
|
Point3(45.0, 61.0, 0.05),
|
|
Point3(55.0, 62.0, 0.05),
|
|
Point3(80.0, 74.0, 0.05),
|
|
Point3(80.0, 73.0, 0.05),
|
|
Point3(76.0, 46.0, 0.05),
|
|
Point3(76.0, 45.0, 0.05),
|
|
Point3(77.0, 41.0, 0.05),
|
|
Point3(62.0, 28.0, 0.05),
|
|
Point3(48.0, 24.0, 0.05),
|
|
Point3(83.0, 122.0, 0.05),
|
|
Point3(82.0, 123.0, 0.05),
|
|
Point3(81.0, 81.0, 0.05),
|
|
Point3(38.0, 77.0, 0.05),
|
|
Point3(-26.0, 69.0, 0.05),
|
|
Point3(-26.0, 70.0, 0.05),
|
|
Point3(-61.0, 71.0, 0.05),
|
|
Point3(-61.0, 70.0, 0.05),
|
|
Point3(-78.0, 79.0, 0.05),
|
|
Point3(-99.0, 106.0, 0.05),
|
|
Point3(-99.0, 108.0, 0.05),
|
|
Point3(-80.0, 123.0, 0.05),
|
|
Point3(-77.0, 125.0, 0.05),
|
|
Point3(-32.0, 162.0, 0.05),
|
|
Point3(-3.0, 186.5, 2.2),
|
|
Point3(-3.2, 186.8, 2.2),
|
|
Point3(-1.0, 185.0, 2.2),
|
|
Point3(39.0, 165.0, 0.05),
|
|
Point3(42.0, 162.0, 0.05),
|
|
Point3(62.0, 145.0, 0.05),
|
|
Point3(64.0, 145.0, 0.05),
|
|
Point3(59.0, 102.0, 0.05),
|
|
Point3(32.7, 93.7, 0.05),
|
|
Point3(31.2, 90.8, 0.05),
|
|
Point3(29.8, 140.1, 0.05),
|
|
Point3(16.5, 146.3, 0.05),
|
|
Point3(15.3, 146.9, 0.05),
|
|
Point3(-24.3, 128.6, 0.05),
|
|
Point3(-67.9, 117.9, 0.05),
|
|
Point3(-41.6, 88.4, 0.05),
|
|
Point3(-13.6, 120.3, 0.05),
|
|
Point3(26.0, 117.8, 0.05),
|
|
Point3(22.6, 112.3, 0.05),
|
|
Point3(-8.2, 107.9, 0.05),
|
|
Point3(-18.1, 97.0, 0.05),
|
|
Point3(-21.4, 92.9, 0.05),
|
|
Point3(-2.1, 74.0, 0.05),
|
|
Point3(19.8, 93.5, 0.05),
|
|
Point3(21.4, 95.4, 0.05),
|
|
Point3(19.2, 97.5, 0.05),
|
|
Point3(-10.7, 143.3, 0.05),
|
|
Point3(38.2, 120.7, 0.05),
|
|
Point3(34.1, 101.5, 0.05),
|
|
Point3(32.4, 96.5, 0.05),
|
|
Point3(72.9, 121.8, 0.05)),), ((Point3(-40, -137, 0.025),
|
|
Point3(2.35, -167.95, 0.025),
|
|
Point3(70.8, -125.3, 0.025),
|
|
Point3(63.49, -67.4, 0.025),
|
|
Point3(17.5, -59.25, 0.623),
|
|
Point3(-51.87, -107.0, 0.723),
|
|
Point3(-20.325, -48.716, 4.884),
|
|
Point3(51.03, -67.244, 0.244),
|
|
Point3(20.02, -34.271, 7.105),
|
|
Point3(24.731, -20.905, 9.247)),
|
|
(Point3(88, -57.4, 0.025),
|
|
Point3(92.347, -7.71, 0.169),
|
|
Point3(129.39, 0.85, 0.025),
|
|
Point3(121.14, 37, 0.025),
|
|
Point3(126, 30.3, 0.025),
|
|
Point3(100.3, 21.2, 0.05),
|
|
Point3(103.42, 1.544, 0.025),
|
|
Point3(82.37, -45, 0.025),
|
|
Point3(103.8, 4.306, 0.05),
|
|
Point3(119.195, -42.042, 0.025)),
|
|
(Point3(10, 98.5, -0.028),
|
|
Point3(11.65, 92.52, -0.079),
|
|
Point3(-16.25, 86.67, 0.216),
|
|
Point3(-65.3, 67.8, 0.025),
|
|
Point3(-41.6, 67.0, 0.025),
|
|
Point3(-34.8, 68.9, 0.025),
|
|
Point3(-32.272, 56.65, 1.192),
|
|
Point3(-63.956, 39.678, 0.281),
|
|
Point3(-79.65, 36.99, 0.025),
|
|
Point3(-14.769, 72.399, 0.244)),
|
|
(Point3(-79.6, 36.9, 0.025),
|
|
Point3(-57.6, 27.24, 2.355),
|
|
Point3(-69.642, -28.137, 3.98),
|
|
Point3(-111, -58.1, 0.025),
|
|
Point3(-152.223, 25.627, 0.025),
|
|
Point3(-104.4, 43.5, 0.278),
|
|
Point3(-85.25, 10.513, 0.111),
|
|
Point3(-43.6, 1.644, 3.838),
|
|
Point3(-48.993, -21.968, 3.98),
|
|
Point3(-30.088, -5.987, 7.025))))
|
|
allocatedIndexes = {}
|
|
|
|
def generateIndexes(doId, playground):
|
|
usedI = []
|
|
unusedI = []
|
|
for area in ButterflyPoints[playground]:
|
|
usedI.append(range(0, len(area)))
|
|
unusedI.append([])
|
|
|
|
allocatedIndexes[doId] = (usedI, unusedI)
|
|
|
|
|
|
def clearIndexes(doId):
|
|
if doId in allocatedIndexes:
|
|
del allocatedIndexes[doId]
|
|
|
|
|
|
def getFirstRoute(playground, area, doId):
|
|
curPos, curIndex = __getCurrentPos(playground, area, doId)
|
|
destPos, destIndex, time = getNextPos(curPos, playground, area, doId)
|
|
return (curPos,
|
|
curIndex,
|
|
destPos,
|
|
destIndex,
|
|
time)
|
|
|
|
|
|
def __getCurrentPos(playground, area, doId):
|
|
if doId in allocatedIndexes:
|
|
unusedI = allocatedIndexes[doId][0][area]
|
|
usedI = allocatedIndexes[doId][1][area]
|
|
else:
|
|
return (ButterflyPoints[playground][area][0], 0)
|
|
if len(unusedI) == 0:
|
|
index = random.choice(usedI)
|
|
return (ButterflyPoints[playground][area][index], index)
|
|
index = random.choice(unusedI)
|
|
unusedI.remove(index)
|
|
usedI.append(index)
|
|
return (ButterflyPoints[playground][area][index], index)
|
|
|
|
|
|
def getNextPos(currentPos, playground, area, doId):
|
|
if doId in allocatedIndexes:
|
|
unusedI = allocatedIndexes[doId][0][area]
|
|
usedI = allocatedIndexes[doId][1][area]
|
|
else:
|
|
return (ButterflyPoints[playground][area][0], 0, 4.0)
|
|
nextPos = currentPos
|
|
while nextPos == currentPos:
|
|
if len(unusedI) == 0:
|
|
index = random.choice(usedI)
|
|
nextPos = ButterflyPoints[playground][area][index]
|
|
else:
|
|
index = random.choice(unusedI)
|
|
nextPos = ButterflyPoints[playground][area][index]
|
|
if nextPos != currentPos:
|
|
unusedI.remove(index)
|
|
usedI.append(index)
|
|
|
|
dist = Vec3(nextPos - currentPos).length()
|
|
time = dist / BUTTERFLY_SPEED + BUTTERFLY_TAKEOFF[playground] + BUTTERFLY_LANDING[playground]
|
|
return (nextPos, index, time)
|
|
|
|
|
|
def recycleIndex(index, playground, area, doId):
|
|
if doId in allocatedIndexes:
|
|
unusedI = allocatedIndexes[doId][0][area]
|
|
usedI = allocatedIndexes[doId][1][area]
|
|
else:
|
|
return None
|
|
if usedI.count(index) > 0:
|
|
usedI.remove(index)
|
|
if unusedI.count(index) == 0:
|
|
unusedI.append(index)
|
|
return None
|