JoshButner

Crea Anomaly - base.py

Mar 10th, 2022
47
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.50 KB | None | 0 0
  1. import math
  2.  
  3. from core.helper import enum, select
  4.  
  5. from siege import Tuning, game
  6. from siege.io import DataStream
  7. from siege.log import Log
  8. from siege.network import Message
  9. from siege.util import Random, RegionVector, Sizes, TileRect, TileVector, Timer
  10. from siege.world import World
  11.  
  12. AnomalyState = enum("Unstarted", "Starting", "Middle", "Ending", "Finished")
  13.  
  14.  
  15. class BaseAnomaly(object):
  16.     TUNING = Tuning.anomaly.BASE
  17.     VERSION = 2
  18.  
  19.     def __init__(self):
  20.         self.name = "base"
  21.         self.timeRange = self.TUNING.TIME_RANGE
  22.         self.chance = self.TUNING.CHANCE
  23.         self.duration = self.TUNING.DURATION
  24.         self.active = False
  25.         self.mapPosition = None
  26.         self.markerPath = "mods/core/cartography/anomaly.png"
  27.  
  28.         self.markerUid = None
  29.         self.warnNoMarkerUpdateFlag = True
  30.  
  31.         self.timer = Timer()
  32.         self.setTimer()
  33.  
  34.     @property
  35.     def markerName(self):
  36.         return "{}AnomalyMarker".format(self.name.capitalize())
  37.  
  38.     def shouldOccur(self, frametime):
  39.         if not self.active:
  40.             self.timer.update(frametime)
  41.             if self.timer.expired():
  42.                 self.setTimer()
  43.                 if Random.getFloat() < self.chance:
  44.                     return True
  45.                 else:
  46.                     return False
  47.  
  48.     def update(self, frametime):
  49.         self.durationTimer.update(frametime)
  50.         if self.durationTimer.expired():
  51.             self.__init__()
  52.  
  53.     def clientUpdate(self, frametime):
  54.         pass
  55.  
  56.     def addMarker(self, realm, name):
  57.         if self.mapPosition is not None:
  58.             self.markerUid = realm.addMapMarker("Anomaly", name, self.markerPath, self.mapPosition)
  59.             Log.debug("New uid: {}".format(self.markerUid))
  60.         else:
  61.             Log.error("Tried to add Anomaly Marker '{}' without a map position.".format(name))
  62.  
  63.     def updateMarker(self, realm):
  64.         if self.markerUid is not None:
  65.             if self.mapPosition is not None:
  66.                 realm.updateMapMarker(self.markerUid, position=self.mapPosition)
  67.             else:
  68.                 self.removeMarker(realm)
  69.         elif self.warnNoMarkerUpdateFlag:
  70.             # Only do this once so we don't spam the logs
  71.             self.warnNoMarkerUpdateFlag = False
  72.             Log.warn("markerUid of Anomaly {} was None.".format(self.name))
  73.  
  74.     def removeMarker(self, realm):
  75.         if self.markerUid is not None:
  76.             realm.removeMapMarker(self.markerUid)
  77.             self.markerUid = None
  78.         else:
  79.             Log.warn("markerUid of Anomaly {} was None.".format(self.name))
  80.  
  81.     def purgeMarkers(self, realm, name):
  82.         Log.debug("purging markers of name: {}".format(name))
  83.         if realm is None:
  84.             realm = World.get().realm
  85.         realm.purgeMapMarkers(name)
  86.  
  87.     def notifyBegin(self, anomalyName, extraInfo=""):
  88.         game.notification.announceAnomaly(anomalyName, True, self.mapPosition, extraInfo)
  89.  
  90.     def notifyEnd(self, anomalyName, extraInfo=""):
  91.         game.notification.announceAnomaly(anomalyName, False, self.mapPosition, extraInfo)
  92.  
  93.     def occur(self):
  94.         self.durationTimer = Timer(self.duration.getRandom())
  95.         self.active = True
  96.         self.mapPosition = None
  97.  
  98.     def clientOccur(self):
  99.         pass
  100.  
  101.     def setTimer(self):
  102.         self.timer.reset(self.timeRange.getRandom())
  103.  
  104.     def getRandomConflictRegion(self, forceOnSurface=True, minLevel=None):
  105.         realm = World.get().realm
  106.         regionUids = range(realm.size.regionCount)
  107.         if minLevel is not None:
  108.             for regionID in regionUids:
  109.                 if realm.conflict.getRegion(regionID).levels.max < minLevel:
  110.                     regionUids.remove(regionID)
  111.             if regionUids == []:
  112.                 return None
  113.         regionUid = select(regionUids)
  114.         position = realm.size.getRegionTilePosition(regionUid)
  115.         if forceOnSurface:
  116.             while position.y < realm.biomeTracker.undergroundThreshold[int(position.x)] or position.y > math.fabs(realm.biomeTracker.undergroundThreshold[int(position.x)] + int(RegionVector(0, realm.size.regionHeight).asTile().y / 15)):  # This could be a little longer if I tried, don't ya think?
  117.                 regionUid = select(regionUids)
  118.                 position = realm.size.getRegionTilePosition(regionUid)
  119.         return realm.conflict.getRegion(regionUid)
  120.  
  121.     def getRandomRegionArea(self, forceOnSurface=True, minLevel=None):
  122.         realm = World.get().realm
  123.         regionUids = range(realm.size.regionCount)
  124.         if minLevel is not None:
  125.             for regionID in regionUids:
  126.                 if realm.conflict.getRegion(regionID).levels.max < minLevel:
  127.                     regionUids.remove(regionID)
  128.             if regionUids == []:
  129.                 return None
  130.         regionUid = select(regionUids)
  131.         position = realm.size.getRegionTilePosition(regionUid)
  132.         area = TileRect(position, TileVector(Sizes.REGION_TILE, Sizes.REGION_TILE))
  133.         if forceOnSurface:
  134.             while position.y < realm.biomeTracker.undergroundThreshold[int(position.x)] or position.y > math.fabs(realm.biomeTracker.undergroundThreshold[int(position.x)] + int(RegionVector(0, realm.size.regionHeight).asTile().y / 15)):  # This could be a little longer if I tried, don't ya think?
  135.                 regionUid = select(regionUids)
  136.                 position = realm.size.getRegionTilePosition(regionUid)
  137.                 area = TileRect(position, TileVector(Sizes.REGION_TILE, Sizes.REGION_TILE))
  138.         return area
  139.  
  140.     def netSync(self):
  141.         packet = DataStream(Message.ANOMALY)
  142.         # Write Anomaly Key
  143.         packet.writeString(self.name)
  144.         # Write active
  145.         packet.writeBool(self.active)
  146.         for networkId in [player.networkId for player in World.get().getPlayers()]:
  147.             game.network.getServer().send(networkId, packet)
  148.  
  149.     def recieveSync(self, client, packet):
  150.         # Anomaly key is already read
  151.         # Read active
  152.         active = packet.readBool()
  153.         if active != self.active:
  154.             if active:
  155.                 self.clientOccur()
  156.             self.active = active
  157.  
  158.     def save(self, stream):
  159.         # Timer
  160.         stream.writeUint32(self.timer.remaining())
  161.         # Map Marker
  162.         stream.writeUint16(self.markerUid)
  163.  
  164.     def load(self, stream, version):
  165.         # Timer
  166.         self.timer.reset(stream.readUint32())
  167.         # Map Marker
  168.         self.markerUid = stream.readUint16()
  169.  
  170.     def loadFailed(self):
  171.         self.__init__()
  172.  
Advertisement
Add Comment
Please, Sign In to add comment